我正在尝试使用多个内存中的流构建EmailMessage。但是,当我发送电子邮件时,我收到以下错误:
"One of the streams has already been used and can't be reset to the origin"
根据我的收集,我认为问题可能是当我尝试执行以下操作时,消息正在丢失内存流的上下文:
foreach (var att in attachments)
{
doc = fetchDocumentByteArray();
using (MemoryStream ms = new MemoryStream(doc))
{
mailToSend.AddAttachment(new Attachment(ms, att.Filename));
}
}
mailToSend.Send();
我也尝试在AddAttachment()之前设置ms.Position = 0
,但这不起作用。
在看了一下像我这样的场景之后,我遇到了一个使用List<MemoryStream>
的建议 - 但是我不确定我是如何实现它的,或者它是否是正确的方法?
答案 0 :(得分:1)
使用&#34;使用&#34; keywork,在内部,调用Dispose方法。它将使MemoryStreams被释放。
删除内循环中的using并创建一个try / finally子句,以便在发送电子邮件后处理内存流。
答案 1 :(得分:0)
接受的答案对我不起作用,因为您需要跟踪多个MemoryStream并逐个处理它们。我采用相同的方法,但稍微不同地实现它将每个MemoryStream添加到列表中,然后在发送电子邮件后在每个实例上调用Dispose()。
var msList = new List<MemoryStream>();
foreach (var attachment in message.Attachments)
{
var ms = new MemoryStream(attachment.Bytes);
msList.Add(ms);
var mailAttachment = new Attachment(ms, attachment.FileName);
mailMessage.Attachments.Add(mailAttachment);
}
smtp.Send(mailMessage);
foreach (var ms in msList)
{
ms.Dispose();
}