Как добавить вложение электронной почты из байтового массива?


110

У меня есть byte[]файл с содержимым. Я хочу отправить его как вложение, используяSystem.Net.Mail .

Я заметил, что класс вложения имеет 1 перегрузку, которая принимает поток.

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

Можно ли byte[]через эту перегрузку пройти ?


Кстати, вы также можете использовать 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[]a, MemoryStreamиспользуя соответствующую перегрузку конструктора MemoryStream .

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

Обратите внимание, что параметр name конструктора Attachment указывает имя типа содержимого вложения, а не имя самого вложения.


4
Кажется, что параметр имени - это имя файла, а не тип содержимого. См. Примечания
— Угур Алданмаз,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.