viernes, 18 de julio de 2008

Mandar Mails por ASP.NET 2.0

Para mandar por asp.net 2.0 hay que usar

using System.Net.Mail;


luego

System.Net.Mail.MailMessage mail = new MailMessage("support@websitesample.com", "destino@destino.com");


mail.Subject = "ASubject";
mail.IsBodyHtml = true;
mail.Body = "Body del mail";

SmtpClient emailClient = new SmtpClient();
emailClient.Host = "smtp.gmail.com";
emailClient.Credentials = new System.Net.NetworkCredential("origen@gmail.com", "password");
emailClient.EnableSsl = true;
emailClient.Send(mail);





Con las clases de System.Net.Mail no encontre forma de mandar un mail sin especificar un servidor de smtp (con System.Web.Mail se puede pero encontre se recomienda el uso de System.Net.Mail en la version de ASP.NET 2.0) lo cual tiene sentido por una cuestión de seguridad.

Si quisieramos hacer un attachment podemos leerlo de un archivo o la opción que utilizamos fue enviar un Stream como attachment que correspondia a un reporte generado dinamicamente en formato CSV. En el siguiente ejemplo muestro como mandar un memory stream como attachment de un mail


//Creamos un stream de prueba
MemoryStream mem = new MemoryStream();
StreamWriter sw = new StreamWriter(mem);
//Le llenamos algunos datos
sw.Write("1;2;3;4;5;6;7;8;9");
sw.Flush();
//Es importante setear la posicion del stream en 0 sino puede
//fallar el envio del maio
mem.Position = 0;

System.Net.Mail.MailMessage mail = new MailMessage("support@websitesample.com", "destino@destino.com");
//Llenamos los datos del mail
...
Attachment a = new System.Net.Mail.Attachment(mem, "report.csv");
mail.Attachments.Add(a);



Ahora ASP.NET nos da la posibilidad de no tener que llenar la url del servidor de smtp, el usuario y el password sino hacerlo por medio del archivo Web.Config. Para ello podemos especificar en ese archivo que nos quedaria


<configuration>
<appsettings>
<system.net>
<mailsettings>
<smtp>
<network host="smtp.gmail.com" username="usuariogmail@gmail.com" password="passwordgmail">
<!-- esta el atributo port="portNumber" sino usa el default -->
</network>
</smtp>
</mailsettings>
</system.net>

...
</appsettings>
</configuration>




De esa forma para mandar el mail simplemente tenemos que hacer


System.Net.Mail.MailMessage mail = new MailMessage("support@websitesample.com", "destino@destino.com");
mail.Subject = "A Subject";
mail.IsBodyHtml = true;

SmtpClient emailClient = new SmtpClient();
emailClient.EnableSsl = true;

emailClient.Send(mail);


No hay que olvidarse que si mandamos el mail por gmail incluir la linea emailClient.EnableSsl = true;.Sino la presencia de esa línea dependerá de si el servidor smtp que usemos soporta SSL o no.

No hay comentarios: