C# MemoryStream中的电子邮件附件为空

C# MemoryStream中的电子邮件附件为空,c#,email,system.net.mail,email-attachments,C#,Email,System.net.mail,Email Attachments,_data是附件数据的字节[]数组 当我这样做的时候: var ms = new MemoryStream(_data.Length); ms.Write(_data,0,_data.Length); mailMessage.Attachments.Add(new Attachment(ms, attachment.Name)); 附件是空的。实际上outlook显示了文件大小,但它不正确 嗯,我想我的数据有问题。然后我决定尝试这种方法: var ms = new MemoryStr

_data是附件数据的字节[]数组

当我这样做的时候:

 var ms = new MemoryStream(_data.Length); 
 ms.Write(_data,0,_data.Length);
 mailMessage.Attachments.Add(new Attachment(ms, attachment.Name));
附件是空的。实际上outlook显示了文件大小,但它不正确

嗯,我想我的数据有问题。然后我决定尝试这种方法:

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

这就行了。第一个有什么问题?

不要使用GetBuffer。使用
ms.ToArray()。

对于第一个表单,您不是在“倒带”流:

ms.Position = 0;
所以它试图从流的末尾读取数据,那里没有任何数据

创建MemoryStream的一种更简单的方法是只使用构造函数:

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

第一部分中的问题不是问题second@Ike当前位置Aliostad指出您的第二个代码片段仍然不太正确-它可能有问题。噢。。等待事实上就是这样。。。我肯定我以前试过,但没用。可能是我弄乱了别的东西…@JonSkeet我想知道你是否可以建议我在这里发布一个类似的问题@AmmarKhan:恐怕问题中没有那么多代码。您应该编辑问题以包含一个。@JonSkeet对不起,具体来说,我使用的是与上面相同的(第一部分),即定义它的
位置
始终从0开始,就像您在回答中提到的那样。但问题是,每隔几天,我就会发现用户在电子邮件中找不到附件。这种情况似乎会持续5-10分钟左右,这意味着在这段时间内发送的所有电子邮件都不会包含附件。在那之后,它会自动更正自己,随后的电子邮件会像预期的那样包含附件。@AmmarKhan:我不会在这里添加评论,我会尝试修改你的问题,让它更清楚。