Вложение электронной почты из MemoryStream пусто
-
02-10-2019 - |
Вопрос
_data - это байт [] массив данных вложения.
Когда я делаю это:
var ms = new MemoryStream(_data.Length);
ms.Write(_data,0,_data.Length);
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name));
Приложение остается пустым. На самом деле Outlook показывает размер файла, но он неверен.
Ну, я подумал, что в моем _data есть проблема. Тогда я решил попробовать этот подход:
var ms = new MemoryStream(_data.Length);
ms.Write(_data,0,_data.Length);
fs = new FileStream(@"c:\Temp\"+attachment.Name,FileMode.CreateNew);
fs.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
fs.Flush();
fs.Close();
mailMessage.Attachments.Add(new Attachment(@"c:\Temp\" + attachment.Name));
И это работает. Что не так с первым?
Решение
С первой формой вы не «перемотаете» поток:
ms.Position = 0;
Так что он пытался прочитать из конец потока, где не было никаких данных.
Более простой способ создания памяти - просто использовать конструктор:
var ms = new MemoryStream(_data);
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name));
Другие советы
Не используйте GetBuffer. Использовать ms.ToArray().
Не связан с StackOverflow