Eventos

[.NET] Enviar correos con System.Net.Mail

Aveces nos es necesario enviar correos desde alguna de nuestras aplicaciones, esto se puede lograr de muchas maneras, una de ellas por ejemplo seria usar el Database Mail del SQL Server, pero en esta ocasión se hara usando 2 clases que se encuentran en el namespace System.Net.Mail que son SmtpClient y MailMessage. Es una demo sencilla, basta entender la idea y se pueden hacer muchísimas cosas.

    class Program
    {
        static void Main(string[] args)
        {
            EnviarCorreo();
        }

        private static void EnviarCorreo()
        {
            //Configurando el cliente SMTP
            SmtpClient client = new SmtpClient();
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.EnableSsl = true;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("correoOrigen@gmail.com", "clavecorreoOrigen");
            //Preparando archivo adjunto
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("Contenido de un documento de texto muy interesante."));

            //Enviando correo
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("correoOrigen@gmail.com");
            mail.To.Add(new MailAddress("correoDestinatario@gmail.com"));
            mail.Subject = "Correo simple de HTML con documento adjunto.";
            mail.IsBodyHtml = true;
            mail.Body = "<h2>Hola!</h2><br/><br/>Visiten: <a href='http://xamldevelopment.blogspot.com'>XAML Development</>";
            mail.Attachments.Add(new Attachment(ms,"Documento.txt"));
            client.Send(mail);
        }
    }

Actualización: 14 Abril 2014

Otra forma de configurar uno o más SmtpClient es usando el App.config o Web.config.

¿Cómo configurar un SmtpClient desde el .config?

Simplemente agregamos el siguiente código XML al nodo principal <configuration>:

App.config o Web.config

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="correoOrigen@gmail.com">
        <network enableSsl="true" defaultCredentials="false" clientDomain="www.gmail.com" host="smtp.gmail.com" port="587" userName="correoOrigen@gmail.com" password="clavecorreoOrigen" />
      </smtp>
    </mailSettings>
  </system.net>


CSharp

SmtpClient client = new SmtpClient();

Bastaría hacer lo anterior en C# y apreciar que los valores por defecto son los mismos que hemos establecido en el .config.

¿Cómo configurar más de un SmtpClient desde el .config?

En este caso debemos definir un section con su type por cada SmtpClient que queramos usar (en el ejemplo pondre 3), agruparlos en un sectionGroup (el cual llamaré mailingConfiguration, puede tener cualquier otro nombre) y luego establecer correctamente los valores (no es necesario que todos tengan el mismo clientDomain). Entonces, agreguemos el siguiente código XML al nodo principal <configuration> sin olvidar que configSections debe ser el primer elemento del nodo configuration sino no funcionaria:

App.config o Web.config

<configSections>
    <sectionGroup name="mailingConfiguration">
      <section name="cliente1" type="System.Net.Configuration.SmtpSection"/>
      <section name="cliente2" type="System.Net.Configuration.SmtpSection"/>
      <section name="cliente3" type="System.Net.Configuration.SmtpSection"/>
    </sectionGroup>
</configSections>

  <mailingConfiguration>
    <cliente1 deliveryMethod="Network" from="correoOrigen1@gmail.com">
      <network enableSsl="true" defaultCredentials="false" clientDomain="www.gmail.com" host="smtp.gmail.com" port="587" userName="correoOrigen1@gmail.com" password="clavecorreoOrigen1" />
    </cliente1>
    <cliente2 deliveryMethod="Network" from="correoOrigen2@gmail.com">
      <network enableSsl="true" defaultCredentials="false" clientDomain="www.gmail.com" host="smtp.gmail.com" port="587" userName="correoOrigen2@gmail.com" password="clavecorreoOrigen2" />
    </cliente2>
    <cliente3 deliveryMethod="Network" from="correoOrigen3@gmail.com">
      <network enableSsl="true" defaultCredentials="false" clientDomain="www.gmail.com" host="smtp.gmail.com" port="587" userName="correoOrigen3@gmail.com" password="clavecorreoOrigen3" />
    </cliente3>
  </mailingConfiguration>


CSharp

SmtpSection smtpSection = (SmtpSection)ConfigurationManager.GetSection("mailingConfiguration/cliente1");
SmtpClient smtpClient = new SmtpClient();
smtpClient.Host = smtpSection.Network.Host;
smtpClient.Port = smtpSection.Network.Port;
smtpClient.EnableSsl = smtpSection.Network.EnableSsl;
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.UseDefaultCredentials = smtpSection.Network.DefaultCredentials;
smtpClient.Credentials = new NetworkCredential(smtpSection.Network.UserName, smtpSection.Network.Password);

Si bien estamos mapeando propiedad por propiedad desde el smtpSection la ventaja es que ahora lo tenemos todo centralizado desde el .config, no olviden agregar la referencia a System.Configuration.

Eso es todo amigos :)!

1 comentario:

Epicalsoft — Superheroic Software Development Blog Designed by Templateism.com Copyright © 2014

Con tecnología de Blogger.