Вложение электронной почты из MemoryStream пуст

_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));

И это работает. Что случилось с первым?

Ответы

Ответ 1

В первой форме вы не перематываете поток:

ms.Position = 0;

Итак, он пытался прочитать из конца потока, где не было никаких данных.

Более простой способ создания MemoryStream состоит в том, чтобы просто использовать конструктор:

var ms = new MemoryStream(_data);
mailMessage.Attachments.Add(new Attachment(ms, attachment.Name));

Ответ 2

Не используйте GetBuffer. Используйте ms.ToArray().