0

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

我为用户请求的每个附加文件创建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)。无论如何,我都会遇到同样的错误。

谢谢

4

2 回答 2

2

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

电子邮件发送逻辑在一个函数中,调用如下:

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

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

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

于 2012-09-26T19:58:18.230 回答
1

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

于 2013-01-30T22:10:14.940 回答