Enviar un Stream por eMail

by Valeriano Tortola 7. septiembre 2007 23:02

Siguiendo con lo de enviar un archivo por eMail, puede ser que lo que queramos enviar no este en el sistema de archivos, si no que este en la memoria de nuestro programa. Un ejemplo de esto es que exportemos el contenido de un DataGridView a formato Excel ó hayamos dibujado un gráfico con GDI+ ... ó cualquier cosa que se os ocurra ... y lo queramos enviar por eMail como archivo adjunto, al igual que enviar un Stream por FTP, enviar un Stream como archivo adjunto también pude ser muy útil.

Ahí va un sencillo ejemplo:

/// <summary>
/// Envia un Stream ó derivado por eMail
/// </summary>
/// <param name="Strm">Stream</param>
/// <param name="StreamName">Nombre de fichero que tendrá</param>
/// <param name="SmtpServer">Servidor SMTP</param>
/// <param name="PortNum">Puerto del SMTP</param>
/// <param name="Auth">Credenciales</param>
/// <param name="From">Remitente</param>
/// <param name="To">Lista de destinatarios</param>
public void EnviarStream2Email(Stream Strm, string StreamName,
string SmtpServer, int PortNum, NetworkCredential Auth,
MailAddress From, params MailAddress[] To)
{
  // Configuramos nuestro servidor SMTP
  SmtpClient SC = new SmtpClient(SmtpServer, PortNum);
 
  // Conexión segura (si la soporta el servidor)
  // Imprescindible para Gmail.
  SC.EnableSsl = false;
 
  // Creamos el mensaje de email
  using (MailMessage message = new MailMessage())
  {
    // Añadimos el remitente
    message.From = From;
 
    // Añadimos los destinatarios.
    foreach (MailAddress ma in To)
      message.To.Add(ma);
 
    // Asunto
    message.Subject = "Enviando " + StreamName;
 
    // Cuerpo
    message.Body = string.Format("Archivo {0} enviado el {1} a las {2}.",
        StreamName, DateTime.Now.ToShortDateString(),
        DateTime.Now.ToShortTimeString());
 
    // Pongo el Stream al inicio
    Strm.Position = 0;
 
    // Agrego el fichero como archivo adjunto
    message.Attachments.Add(new Attachment(Strm,StreamName));
 
    // Indico mis credenciales para autenticarme
    SC.Credentials = Auth;
 
    // Indico el modo de envio.
    SC.DeliveryMethod = SmtpDeliveryMethod.Network;
 
    // Y el timeout
    SC.Timeout = 10000;
 
    // Enviar eMail
    SC.Send(message);
  }
}

Usar esta función, tan sencillo como siempre, este es un pequeño ejemplo donde creo un Stream en memoria, escribo sobre él y luego lo envio:

using (MemoryStream memorystrm = new MemoryStream())
using (StreamWriter sw = new StreamWriter(memorystrm, Encoding.ASCII))
{
  // Escribo 100 líneas para rellenar el fichero de prueba
  for (int i = 0; i < 100; i++)
  {
    sw.WriteLine("Línea prueba: {0}", i);
  }
  sw.Flush();
  EnviarStream2Email(memorystrm,"file.txt","mail.miserver.net",25, // Servidor
    new NetworkCredential("yo@miserver.net", @"m1P4sW0rD"),//Credenciales
    new MailAddress("yo@miserver.net", "Valeriano"),  // Remitente
    new MailAddress("dest1@gmail.com", "Destinatario 1"), // Destinatario 
    new MailAddress("dest2@gmail.com", "Destinatario 2")); // Destinatario 
}

Tags: , ,

.NET 2.0 | C# 2.0

Comentarios

08/09/2007 0:06:00 #

pingback

Pingback from elbruno.com

Enviar un Stream por eMail - vtortola

elbruno.com |

Comentarios no permitidos