Enviar emails, con plantilla html, desde Xamarin.Forms
Tags: xamarinforms, streamreader, email, resources
Published: 2021-03-19 18:34:23

> *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](https://docs.microsoft.com/es-es/xamarin/essentials/email?tabs=android), 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](https://docs.microsoft.com/es-es/dotnet/api/system.net.mail?view=net-5.0), 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> 
```
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ogj0bo3l50ji6wft6bzp.png)


#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](https://docs.microsoft.com/es-es/xamarin/xamarin-forms/data-cloud/data/files?tabs=windows).

Por lo tanto localizaremos el recurso del siguiente modo:

```
 var assembly = typeof(App).GetTypeInfo().Assembly;
 Stream stream = assembly.GetManifestResourceStream("EspacioDeNombres.Carpeta.EmailTemplate.html");
```

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);
```

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");  
              }
        }
```

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](https://dev.to/gpmanuel/send-emails-with-html-template-from-xamarinforms-3pdp)

###Referencias:
[Xamarin.Forms - Send Email Using SMTP
](https://www.c-sharpcorner.com/article/xamarin-forms-send-email-using-smtp2/)
[Send Email with HTML Templates using C#](https://medium.com/@durgeshbarwal/send-email-with-html-templates-using-c-eb97ba9665e5)
[Sending Email With HTML Template
](https://www.c-sharpcorner.com/UploadFile/33b051/sending-mail-with-html-template/)
[Control de archivos](https://docs.microsoft.com/es-es/xamarin/xamarin-forms/data-cloud/data/files?tabs=windows)