使用多个内存流来存储电子邮件附件

时间:2014-08-01 13:20:33

标签: c# .net smtp

我正在尝试使用多个内存中的流构建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>的建议 - 但是我不确定我是如何实现它的,或者它是否是正确的方法?

2 个答案:

答案 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();
}