2009-02-09 18 views
15

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!

Respuesta

11

El constructor de archivos adjuntos de hecho tiene un constructor que hace lo que necesita. Estoy asumiendo que usted está utilizando la clase System.Net.MailMessage de .NET Framework 2. Si es así read this link por algún código de ejemplo de lo que necesita

+1

¡Gracias! Eso es exactamente lo que estaba buscando. ¿Cómo lograste encontrar eso? ¿Asumo que ambos usamos el mismo Google para buscar? – mezoid

+0

¡Ja ja! ¡Bien, digamos que en el transcurso de mi trabajo, gasto mucho tiempo buscando respuestas a los problemas! – Rad

+0

Gracias Rad, enlace muy útil que – JsonStatham

0

--------------- Creo que estoy equivocado, esto es si tiene un archivo que desea adjuntar ---------------

parece que no es un ejemplo de envío de correo electrónico con un archivo adjunto aquí:

http://www.aspnettutorials.com/tutorials/email/email-attach-aspnet2-csharp.aspx

espero que esto es lo que estás buscando.

+0

unfortunat Ely no porque el método utilizado en ese ejemplo es pasar una cadena del nombre de archivo ... lo que significa que el archivo debe escribirse en el disco antes de enviarlo. Quiero hacerlo todo en la memoria ya que no tengo motivos para escribir el archivo en el disco, enviarlo y luego eliminar el archivo ... – mezoid

+1

siento votar su respuesta John pero alguien lo votó y no es el respuesta correcta. Por favor, nadie más vota por esta respuesta ... Necesito crear el archivo adjunto usando los constructores que toman una secuencia, no una cadena. – mezoid

0

El parámetro de nombre en el constructor de Adjuntos es el nombre que se mostrará para los datos adjuntos en el correo electrónico del destinatario.

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

0

Desde el link del accepted answer se ha ido, aquí es a partir de la Wayback Machine

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; 
} 
Cuestiones relacionadas