System.Net.Mail.MailMessage
ASP.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)を使用してみました。関係なく同じエラーが発生します。
ありがとう