DEV Community

GPManuel
GPManuel

Posted on • Updated on

Enviar emails, con plantilla html, desde Xamarin.Forms

Generalmente, para mandar un correo electrónico, si esta no es la naturaleza de nuestra aplicación, recurrimos a una tercera APP que por defecto use nuestro dispositivo para este fin.

Esto lo hacemos mediante Xamarin.Essentials y la clase Email, que permite que una aplicación abra la aplicación de correo electrónico predeterminada con información especificada incluido el asunto, el cuerpo y los destinatarios (PARA, CC, CCO).

En esta entrada vamos a mostrar como enviar emails desde nuestro proyecto compartido(PCL) de Xamarin.Forms. Estos emails, para otorgarles una mejor apariencia, los formatearemos ayudándonos de una plantilla HTML.

Para nuestro caso vamos a imaginar que queremos enviar una notificación sobre la actividad del usuario, sin que este tenga que intervenir.

Podríamos facilitar la redacción de un email para el usuario a través de una vista donde recojamos todos los datos y luego generásemos el email desde backend. Pero no es el objetivo de esta entrada.

Los emails los enviaremos gracias al espacio de nombre System.Net.Mail, mediante protocolo SMTP.

Plantilla HTML:

En primer lugar añadiremos la plantilla HTML a nuestro proyecto:

<html xmlns="http://www.w3.org/1999/xhtml">   
<head>  
    <title></title>  
</head>   
<body>    
    <table>   
        <tr>   
            <td>  
                <br />  
                <br />   
                <div style="border-top:3px solid #22BCE5"> </div>   
                <span style="font-family:Arial;font-size:10pt">  

Hello <b>{UserName}</b>,<br /><br />    

{message}  

<br /><br />    
Thanks<br />    

</span>    
            </td>    
        </tr>    
    </table>    
</body>    
</html> 
Enter fullscreen mode Exit fullscreen mode

En las propiedades de este recurso, para hacer uso de el, es fundamental marcar la Acción de Compilación como "Recurso incrustado" (Build Action: EmbeddedResource).

image

Cargar plantilla y sustituir variables

A la hora de cargar la plantilla para leerla, sustituir las variables y mandar el contenido vía SMTP, es posible que tengamos problemas para indicar la ruta. En otro proyecto escribiríamos la ruta absoluta, pero hemos de pensar que esta aplicación estará corriendo en un dispositivo Android. Por lo que, si queremos realizar esta acción desde nuestro proyecto compartido haremos uso del Control de archivos de Xamarin.Forms.

Por lo tanto localizaremos el recurso del siguiente modo:

 var assembly = typeof(App).GetTypeInfo().Assembly;
 Stream stream = assembly.GetManifestResourceStream("EspacioDeNombres.Carpeta.EmailTemplate.html");
Enter fullscreen mode Exit fullscreen mode

En la plantilla podemos introducir variables entre llaves {}, para sustituirlas por el contenido que deseemos.

Posteriormente usaremos StreamReader, pasándole el Stream, para leer la plantilla y sustituir las variables por nuestro contenido:

string body = string.Empty;
using (StreamReader reader = new StreamReader(stream))
{
    body = reader.ReadToEnd();
}
body = body.Replace("{UserName}", usuario);
body = body.Replace("{message}", mensaje);
Enter fullscreen mode Exit fullscreen mode

De este modo ya tendríamos el cuerpo de nuestro email en formato HTML.

Enviar email

Sencillamente nos quedará crear un nuevo método que envíe el email a través de SMTP:

public void SendEmail(string asunto, string mensaje)
        {            
              try
              {
                  MailMessage mail = new MailMessage();
                  SmtpClient SmtpServer = new SmtpClient("smtp.office365.com");

                  mail.From = new MailAddress("emisor@mail.com");
                  mail.To.Add("receptor@mail.com");
                  mail.Subject = asunto;
                  mail.Body = mensaje;
                  mail.IsBodyHtml = true;

                  SmtpServer.Port = 587;
                  SmtpServer.Host = "smtp.office365.com";
                  SmtpServer.EnableSsl = true;
                  SmtpServer.UseDefaultCredentials = false;
                  SmtpServer.Credentials = new System.Net.NetworkCredential("emisor@mail.com", "password");

                  SmtpServer.Send(mail);
              }
              catch (Exception ex)
              {
                  DisplayAlert("Error", ex.Message, "OK");  
              }
        }
Enter fullscreen mode Exit fullscreen mode

Espero que os ayude este post y sirva para contribuir a la comunidad hispano parlante.

Un saludo.

Artículo en inglés:

Send emails, with html template, from Xamarin.Forms

Referencias:

Xamarin.Forms - Send Email Using SMTP

Send Email with HTML Templates using C#
Sending Email With HTML Template

Control de archivos

Top comments (0)