c# email binary attachment system.net.mail

c# - ¿Cómo agrego un archivo adjunto a un correo electrónico usando System.Net.Mail?



email binary (4)

Tengo un documento de Excel representado como un byte [] y quiero enviarlo como un archivo adjunto en un correo electrónico.

Estoy teniendo problemas para construir el archivo adjunto.

Puedo crear un archivo adjunto que tenga 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 desde el byte [] y pasarlo al método que crea el archivo adjunto.

Lamentablemente, no puedo ver la forma de obtener el nombre de archivo y el tipo de contenido pretendidos 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.

Lo más cercano que puedo encontrar es MediaTypeNames.Application.Octet que dice:

El miembro de Octet indica que el archivo adjunto contiene datos binarios genéricos.

Sin embargo, incluso si este es el que se debe 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 de Excel ...

¿Hay quizás algún otro tipo de Stream que pueda usar? O tendré que crear mi propio tipo de Stream que tenga los detalles que necesito.

Seguramente alguien haya hecho esto antes y seguramente Microsoft habría pensado esto hasta este nivel ...

Cualquier ayuda sería muy apreciada.

Actualización: no vote por ninguna respuesta que utilice 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.

Actualización de la solución

¡Conrad logró encontrar lo que estaba buscando! ¡Gracias, hombre!

Documentaré la solución sugerida solo en caso de que algo suceda con el contenido en el enlace proporcionado.

El 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, solo significa que tendré que cambiar mi método para tomar el nombre de archivo y el formato de archivo como cadenas. Trataré de usar el Octet ... pero si falla, pasaré el tipo MIME oficial.

A fin de cuentas, esta es una solución bastante obvia ... pero aprecio la ayuda para resolverla ... y lo bueno es que esta solución estará documentada para futuros programadores que tengan el mismo problema.

Gracias de nuevo a todos por su ayuda!



El constructor de archivos adjuntos de hecho tiene un constructor que hace lo que necesita. Supongo que estás usando la clase System.Net.MailMessage de .NET Framework 2. Si es así, lee este enlace para ver un ejemplo de código de lo que necesitas


El parámetro name en el constructor Attachment es el nombre que se mostrará para el archivo adjunto en el correo electrónico del destinatario.

Por lo tanto, puede elegir libremente el parámetro de nombre (extensión .xls preferida) y establecer el parámetro mediaType en "application / vnd.ms-excel", que es el tipo MIME definido para los archivos de Excel.


Dado que el enlace de la respuesta aceptada se ha ido, aquí es de la máquina Wayback

TL; DR: mail.Attachments.Add(new Attachment(contentStream, "yourfilename.txt", "text/plain"));

Completo:

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")); //send the message SmtpClient smtp = new SmtpClient("127.0.0.1"); smtp.Send(mail); } static byte[] GetData() { //this method just returns some binary data. //it could come from anywhere, such as Sql Server string s = "this is some text"; byte[] data = Encoding.ASCII.GetBytes(s); return data; }