Tengo un documento de Excel representado como un byte [] y deseo enviarlo como un archivo adjunto en un correo electrónico.¿Cómo agrego un archivo adjunto a un correo electrónico usando System.Net.Mail?
Estoy teniendo problemas para construir el archivo adjunto.
puedo crear un archivo adjunto que tiene los siguientes constructores:
(Stream contentStream, ContentType contentType)
(Stream contentStream, string name)
(Stream contentStream, string name, string mediaType)
Mi idea en este momento es crear un MemoryStream del byte [] y pasarlo al método que crea el archivo adjunto.
Lamentablemente, no veo la forma de obtener el nombre de archivo y el tipo de contenido de MemoryStream y tampoco puedo ver cómo proporcionar el tipo de contenido correcto. Hay opciones para texto sin formato, Pdf, Rtf, etc., pero ninguna de las que veo que saltan de inmediato como la que debería usar para un documento de Excel.
El más cercano que puedo encontrar es MediaTypeNames.Application.Octet que establece:
El miembro Octeto designa que el archivo adjunto contiene datos binarios genéricos .
Sin embargo, incluso si este es el único para usar, a menos que se pueda pasar como una propiedad del Stream, mi método para enviar correos electrónicos solo podrá enviar un byte [] como documento Excel.
¿Hay algún otro tipo de Stream que podría usar? O tendré que crear mi propio tipo de Stream que tenga los detalles que necesito.
Seguramente alguien por ahí ha hecho esto antes y seguramente Microsoft habría pensado esto a través de este nivel ....
Cualquier ayuda sería muy apreciada.
Actualización: No vote por las respuestas que utilizan los constructores que toman el nombre de archivo como una cadena. Realmente necesito ayuda para usar los que toman un Stream ... Quiero evitar tener que escribir el archivo en el disco, enviarlo por correo electrónico y luego eliminarlo de inmediato. Dado que hay un método que me permite hacer eso, me gustaría utilizarlo si es posible.
Solución Actualización
Conrad logró encontrar lo que estaba buscando! ¡Gracias, hombre!
Voy a documentar la solución sugerida en caso de que algo suceda con el contenido en el enlace proporcionado.
crédito para esta solución va a www.systemnetmail.com
static void AttachmentFromStream()
{
//create the mail message
MailMessage mail = new MailMessage();
//set the addresses
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
//set the content
mail.Subject = "This is an email";
mail.Body = "this content is in the body";
//Get some binary data
byte[] data = GetData();
//save the data to a memory stream
MemoryStream ms = new MemoryStream(data);
//create the attachment from a stream. Be sure to name the data
//with a file and
//media type that is respective of the data
mail.Attachments.Add(new Attachment(ms, "example.txt", "text/plain"));
SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);
}
En mi caso, sólo significa que tendré que cambiar mi método para tomar el nombre de archivo y formato de archivo como cadenas. Trataré de usar el Octet ... pero si falla, pasaré el tipo MIME oficial.
Teniendo en cuenta todo esto, esta es una solución bastante obvia ... pero aprecio la ayuda para resolverlo ...y lo bueno es que esta solución se documentará para futuros programadores que tengan el mismo problema.
Gracias de nuevo a todos por su ayuda!
¡Gracias! Eso es exactamente lo que estaba buscando. ¿Cómo lograste encontrar eso? ¿Asumo que ambos usamos el mismo Google para buscar? – mezoid
¡Ja ja! ¡Bien, digamos que en el transcurso de mi trabajo, gasto mucho tiempo buscando respuestas a los problemas! – Rad
Gracias Rad, enlace muy útil que – JsonStatham