Comment ajouter une pièce jointe à un e-mail à partir d'un tableau d'octets?


110

J'ai un byte[]avec le contenu du fichier. Je souhaite l'envoyer en pièce jointe en utilisant System.Net.Mail.

J'ai remarqué que la classe de pièce jointe a 1 surcharge qui accepte un flux.

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

Est-il possible de passer à byte[]travers cette surcharge?


BTW, vous pouvez également utiliser att.ContentDisposition si vous souhaitez définir d'autres attributs du fichier joint (par exemple CreationDate).
John Gilmer

Réponses:


214

Manière la plus simple:

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

Notez qu'à moins que vous ne fassiez des choses funky avec des opérations asynchrones, il MemoryStreamest prudent de ne pas se débarrasser, ce qui peut vous faciliter la vie. Certes, il n'y a aucune garantie que ce sera vrai à l'avenir, mais je pense qu'il est peu probable que cela change. Je ne vois aucune indication quant à savoir si la suppression de la pièce jointe supprime son flux :(


2
Bon point, j'ai remarqué lors de l'ajout de pièces jointes basées sur un fichier, je devais disposer l'objet de pièce jointe pour libérer une poignée sur le fichier. Le flux devrait sûrement être pris en charge par GC, car ce n'est pas une opération d'E / S?
JL.

FWIW, la classe Attachment de Mono appelle Disposele flux de contenu, et à partir d'un cas de test rapide, .NET 4.0 fait de même. Je ne suis pas très amusé que ce soit le cas, mais ça y est.
Matt Enright

34

Vous devez convertir le byte[]en un MemoryStreamà l'aide de la surcharge de constructeur MemoryStream appropriée .

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

Notez que le paramètre de nom du constructeur de la pièce jointe spécifie le nom du type de contenu de la pièce jointe, et non le nom de la pièce jointe elle-même.


4
Il semble que le paramètre de nom soit le nom du fichier, pas le type de contenu. Voir les remarques: msdn.microsoft.com/en-us/library/…
Uğur Aldanmaz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.