2009-02-09 17 views
15

Ho un documento excel rappresentato come un byte [] e sto volendo inviarlo come allegato in un'email.Come si aggiunge un allegato a un'e-mail tramite System.Net.Mail?

Ho un po 'di problemi nel costruire l'allegato.

posso creare un allegato che ha i seguenti costruttori:

(Stream contentStream, ContentType contentType) 
(Stream contentStream, string name) 
(Stream contentStream, string name, string mediaType) 

La mia idea in questo momento è quello di creare un MemoryStream dal byte [] e passarlo al metodo che crea l'allegato.

Purtroppo non riesco a vedere un modo per ottenere il nome file e il tipo di contenuto desiderato da MemoryStream e inoltre non riesco a vedere come fornire il tipo di contenuto corretto. Ci sono opzioni per il testo normale, Pdf, Rtf ecc. Ma nessuna che io possa vedere che mi salta immediatamente addosso come quella che dovrei usare per un documento Excel.

Il più vicino che posso trovare è MediaTypeNames.Application.Octet in cui si afferma:

Il membro ottetto indica che l'allegato contiene generici dati binari .

Tuttavia, anche se questo è quello da utilizzare, a meno che non possa essere passato come una proprietà del flusso, il mio metodo per l'invio di e-mail sarà solo in grado di inviare un byte [] come documento Excel.

C'è forse qualche altro tipo di flusso che potrei usare? O dovrò creare il mio tipo di Stream con i dettagli che mi servono.

Sicuramente qualcuno là fuori ha fatto questa cosa prima e sicuramente Microsoft avrebbe pensato questo attraverso a questo livello ....

Qualsiasi aiuto sarebbe molto apprezzato.

Aggiornamento: Non votare per le risposte che utilizzano i costruttori che prendono il nome di file come una stringa. Ho davvero bisogno di aiuto per usare quelli che fanno uno streaming ... Voglio evitare di dover scrivere il file su disco, inviarlo via email e poi cancellarlo immediatamente. Dato che c'è un metodo che mi permette di farlo, mi piacerebbe usarlo se possibile.

soluzione di aggiornamento

Conrad è riuscito a trovare quello che cercavo! Grazie amico uomo!

Mi limiterò a documentare la soluzione suggerita nel caso in cui qualcosa accada al contenuto al collegamento fornito.

Credito per questa soluzione 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); 
} 

Nel mio caso, significa solo che dovrò cambiare il mio metodo per prendere il nome del file e fileformat come stringhe. Proverò a usare l'Octet ... ma non riuscirò a passare il tipo MIME ufficiale.

Tutto considerato, questa è una soluzione piuttosto ovvia ... ma apprezzo l'aiuto nel risolverlo ...e la cosa buona è che questa soluzione sarà documentata per i futuri programmatori che hanno lo stesso problema.

Grazie ancora a tutti per l'aiuto!

risposta

11

Il costruttore di allegati ha effettivamente un costruttore che fa ciò di cui hai bisogno. Sto assumendo che stai utilizzando la classe System.Net.MailMessage da .NET Framework 2. In caso affermativo read this link per qualche codice di esempio di che cosa avete bisogno

+1

Grazie! Questo è esattamente quello che stavo cercando. Come sei riuscito a trovarlo? Suppongo che entrambi usiamo lo stesso Google per la ricerca? – mezoid

+0

Ah ah! Bene, diciamo che nel corso del mio lavoro trascorro molto del mio tempo alla ricerca di risposte ai problemi! – Rad

+0

Grazie Rad, collegamento molto maneggevole che – JsonStatham

0

--------------- Suppongo che sbagli, questo è se hai un file che vuoi allegare ---------------

sembra che ci sia un esempio di invio di posta con un allegato qui:

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

Spero che questo è quello che stai cercando.

+0

unfortunat non perché il metodo utilizzato in quell'esempio sia per passare una stringa del nomefile ... il che significa che il file deve essere scritto sul disco prima di inviarlo. Sto volendo fare tutto in memoria visto che non ho motivo di scrivere il file su disco, inviarlo e poi cancellare il file .. – mezoid

+1

scusa per votare la tua risposta John ma qualcuno ha votato e non è il risposta corretta. Per favore, nessun altro vota per questa risposta ... Devo creare l'allegato usando i costruttori che prendono uno Stream e non una stringa. – mezoid

0

Il parametro name nel costruttore Attachment è il nome che verrà visualizzato per l'allegato nell'e-mail del destinatario.

Quindi è possibile scegliere liberamente il parametro nome (estensione .xls preferito) e impostare il parametro mediaType su "application/vnd.ms-excel", che è il MIME type definito per i file Excel.

0

Dal momento che l'link dal accepted answer è andato, qui è dal Wayback Machine

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

completa:

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; 
} 
Problemi correlati