Як додати вкладення електронної пошти з масиву байтів?


110

У мене є byte[]вміст файлу. Я хотів би надіслати його як додаток, використовуючи System.Net.Mail.

Я помітив, що вкладений клас має 1 перевантаження, яка приймає потік.

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

Чи можна пройти byte[]через це перевантаження?


BTW, ви також можете використовувати att.ContentDisposition, якщо ви хочете встановити інші атрибути доданого файлу (наприклад, CreationDate).
Джон Гілмер

Відповіді:


214

Найпростіший спосіб:

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

Зауважте, що якщо ви не займаєтеся асинхронними операціями, ви MemoryStreamможете залишити їх нерозкритими, що може полегшити вам життя. Дійсно , немає гарантії, що це буде правдою в майбутньому, але я думаю, що це малоймовірно, що це зміниться. Я не бачу жодних ознак щодо того, чи розпоряджається вкладенням його потік :(


2
Добре, що я помітив, додаючи вкладення на основі файлів, мені потрібно було розпорядитися об'єктом вкладення, щоб випустити ручку на файл. Безумовно, про потік повинен піклуватися GC, адже це не операція вводу-виводу?
JL.

FWIW, клас Attachment Mono викликає Disposeпотік вмісту, і з швидкого тестового випадку .NET 4.0 робить те саме. Мене не надто смішно, що це так, але все-таки є.
Метт Енрайт

34

Вам потрібно перетворити byte[]до MemoryStreamвикористовуючи відповідну перевантаження MemoryStream конструктора .

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

Зауважте, що параметр імені для конструктора Attachment вказує назву типу вмісту вкладення, а не ім'я самого вкладеного файлу.


4
Здається, що параметр name - це ім'я файлу, а не тип вмісту. Див. Зауваження: msdn.microsoft.com/en-us/library/…
Uğur Aldanmaz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.