将文件附加到System.Net.Mail.MailMessage时出现System.InvalidOperationException错误

时间:2012-09-26 19:03:48

标签: asp.net email

从ASP.NET页面将一个或多个文件附加到System.Net.Mail.MailMessage对象时,我收到一个奇怪的错误。

我为用户请求的每个附件创建List(Of Attachment)并添加新的Attachment个对象。这些文件驻留在Web服务器的文件系统中。例如,代码看起来类似于下面的代码,但它没有硬编码的文件路径,而是从数据库中获取它们。但是在调试时我看到文件路径是有效的,指向我可以在给定完整文件路径的情况下从资源管理器中查看的现有文件,或者使用虚拟地址从网站查看(例如,〜/ Documents / resume.pdf)。

Dim attachments As New List(Of Attachment)
attachments.Add(New Attachment("C:\Websites\Documents\resume.pdf"))
attachments.Add(New Attachment("C:\Websites\Documents\map.png"))
...

构建附件集合后,我发送电子邮件,将每个Attachment对象添加到Attachments集合,如下所示:

Dim message As MailMessage = New MailMessage(from, toAddress, subject, body)

If attachments IsNot Nothing Then
    For Each att As Attachment In attachments
        message.Attachments.Add(att)
    Next
End If

Dim mailClient As SmtpClient = New SmtpClient
mailClient.Send(message)

但是,当我运行代码时,我收到以下错误:

System.InvalidOperationException:其中一个流已被使用,无法重置为原点。

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Net.Mail.SmtpException: Failure sending mail. ---> System.InvalidOperationException: One of the streams has already been used and can't be reset to the origin.
   at System.Net.Mime.MimePart.ResetStream()
   at System.Net.Mail.Attachment.PrepareForSending()
   at System.Net.Mail.MailMessage.SetContent()
   at System.Net.Mail.MailMessage.Send(BaseWriter writer, Boolean sendEnvelope)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   ...

我已经尝试将基于数据库查询添加附件的逻辑替换为添加带有硬编码文件路径的单个文件的逻辑。我尝试过使用不同的SMTP客户端(我的网络主机提供商的SMTP服务器和GMail)。无论如何,我都会得到同样的错误。

由于

2 个答案:

答案 0 :(得分:1)

找到答案......问题是因为我试图使用相同的附件集合发送两封单独的电子邮件。

电子邮件发送逻辑位于一个被调用的函数中:

SendEmail(from, to, subject, body, attachments)

If SomethingOrOther Then
   SendEmail(from, someoneElse, subject, body, attachments)
End If

我的(俗气)解决方法是创建两个附件列表,一个用于第一次调用SendEmail,另一个用于第二个调用。

答案 1 :(得分:1)

我认为更好的解决方案是在将第二条消息循环回来之前,将消息对象设置为空,并将客户端选项设置为空。祝你好运!