Come aggiungere un allegato di posta elettronica da un array di byte?


110

Ho un byte[]con il contenuto del file. Vorrei inviarlo come allegato utilizzando System.Net.Mail.

Ho notato che la classe di allegato ha 1 sovraccarico che accetta un flusso.

Attachment att = new Attachment(Stream contentStream,string name);

È possibile superare byte[]questo sovraccarico?


A proposito, puoi anche usare att.ContentDisposition se vuoi impostare altri attributi del file allegato (es. CreationDate).
John Gilmer,

Risposte:


214

Modo più semplice:

Attachment att = new Attachment(new MemoryStream(bytes), name);

Nota che a meno che tu non faccia cose stravaganti con operazioni asincrone, MemoryStreamè sicuro lasciare indifferenziato, il che potrebbe semplificarti la vita. Certo, non c'è alcuna garanzia che ciò sia vero in futuro, ma penso che sia improbabile che cambierà. Non riesco a vedere alcuna indicazione sul fatto che l'eliminazione dell'allegato elimini il suo flusso :(


2
Buon punto, ho notato che quando aggiungevo allegati basati su file, avevo bisogno di disporre l'oggetto allegato per rilasciare un handle sul file. Sicuramente il flusso dovrebbe essere curato da GC, perché non è un'operazione IO?
JL.

FWIW, la classe Attachment di Mono chiama Disposeil flusso di contenuto e, da un rapido test case, .NET 4.0 fa lo stesso. Non sono molto divertito che sia così, ma è così.
Matt Enright

34

È necessario convertire il byte[]in un MemoryStreamutilizzando l' overload del costruttore MemoryStream appropriato .

Attachment att = new Attachment(new MemoryStream(myBytes), name);

Si noti che il parametro name per il costruttore dell'allegato specifica il nome del tipo di contenuto dell'allegato, non il nome dell'allegato stesso.


4
Sembra che il parametro name sia il nome del file, non il tipo di contenuto. Vedere le osservazioni: msdn.microsoft.com/en-us/library/…
Uğur Aldanmaz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.