0

System.Net.Mail.MailMessageASP.NETページからオブジェクトに1つ以上のファイルを添付すると、奇妙なエラーが発生します。

ユーザーが要求した添付ファイルごとに、を作成してList(Of Attachment)新しいオブジェクトを追加します。Attachmentこれらは、Webサーバーのファイルシステムに存在するファイルです。たとえば、コードは次のようになりますが、ファイルパスをハードコーディングするのではなく、データベースから取得します。しかし、デバッグ中に、ファイルパスが有効であることがわかります。これは、完全なファイルパスを指定してエクスプローラーから、または仮想アドレス(〜/ Documents / resume.pdfなど)を使用してWebサイトから表示できる既存のファイルを指します。

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:ストリームの1つがすでに使用されており、元にリセットできません。

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クライアント(私のWebホストプロバイダーのSMTPサーバーとGMail)を使用してみました。関係なく同じエラーが発生します。

ありがとう

4

2 に答える 2

2

答えが見つかりました...問題は、同じ添付ファイルコレクションを使用して2つの別々の電子メールを送信しようとしたためでした。

電子メール送信ロジックは、次のように呼び出される関数に含まれていました。

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

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

私の(安っぽい)回避策は、2つの添付ファイルリストを作成することでした。1つはSendEmailの最初の呼び出し用で、もう1つは2番目の呼び出し用です。

于 2012-09-26T19:58:18.230 に答える
1

2番目のメッセージをループバックする前に、メッセージオブジェクトを何も設定せず、クライアントオプションも何も設定しない方がよいと思います。幸運を!

于 2013-01-30T22:10:14.940 に答える