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
}