5

プログラムで複数の添付ファイルを送信中に問題が発生しました。

複数の添付ファイルを追加しようとする前は、何の問題もありませんでした。そのため、コードを少し変更したところ、機能しなくなりました。

添付ファイルの作成: 見やすくするためにすべてのコードを追加しませんでした。

Attachment attachment = getAttachment(bodyFile, "Formulier" + counter + ".doc");
attachments.Add(attachment);
//attachment.Dispose();

if (attachments != null)
{
  foreach (Attachment attachment in attachments)
  {
    email.Attachments.Add(attachment);
  }
}    

添付ファイルを取得

private Attachment getAttachment(string bodyFile, string title)
{
  return createDocument(bodyFile, title);
}

ファイルの作成

private Attachment createDocument(string bodyFile, string title) 
{
  string activeDir = HttpContext.Current.Server.MapPath("/Tools");
  string newPath = Path.Combine(activeDir, "Documents");

  Directory.CreateDirectory(newPath);
  newPath = Path.Combine(newPath, title);

  FileStream fs = File.Create(newPath);
  fs.Close();
  File.WriteAllText(newPath, bodyFile);

  var fstemp = new FileStream(newPath, FileMode.Open, FileAccess.Read);
  return new Attachment(fstemp, title, MediaTypeNames.Application.Octet);

}

ロガーに表示されるエラー

2012-07-04 15:45:26,149 [19] ERROR Mvc - System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a closed file.
   at System.IO.__Error.FileNotOpen()
   at System.IO.FileStream.Read(Byte[] array, Int32 offset, Int32 count)
   at System.Net.Mime.MimePart.Send(BaseWriter writer)
   at System.Net.Mime.MimeMultiPart.Send(BaseWriter writer)
   at System.Net.Mail.Message.Send(BaseWriter writer, Boolean sendEnvelope)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at ARTex.Tools.Mailer.Send(SmtpClient smtpClient, List`1 receivers, String subject, String body, List`1 attachments, String cc) in C:\Projects\KTN.Web.ARTex\ARTex\ARTex\Tools\Mailer.cs:line 262

編集

.Dispose メソッドを削除して変更しましvar fstemp = new FileStream(newPath ... た。複数の添付ファイルを送信できるようになりました。しかし、今ではランダムにエラーが発生するかどうかがわかりません。5回のうち4回は機能します。4回目には、ファイルを開くことができないというエラーが再び表示されます。5回目で再び魔法のように機能します。

編集:解決策

using ブロックを 2 つの回答と組み合わせて使用​​しました。そして、それはうまくいきました。@HatSoft と @Aghilas Yakoub への Tnx

4

3 に答える 3

2

3行目はコードで何をしていますか?

attachment.Dispose(); 

Mailに追加する前に、ファイルを破棄しているようです。そのため、添付ファイルが完了する前にファイルが閉じられる可能性があります。

于 2012-07-04T14:34:51.100 に答える
2

これらの行で試してみてください(あなたのCreateDocument方法で):

var fstemp = new FileStream(newPath, FileMode.Open, FileAccess.Read);
return new Attachment(fstemp, title, MediaTypeNames.Application.Octet);
于 2012-07-04T14:29:56.407 に答える
0

FileStream fs = File.Create(newPath); の newPath のように見えます。は正しくなく、ファイルが作成されません。コードを見ると、newPath は 'Documents' で終わり、File.Create ファイル名には拡張子が付いているため、添付するものは何もありません。

于 2012-07-04T14:26:23.950 に答える