6

私は最近、SQLデータベースから情報を取得し、結果を含むHTMLページを作成して、それを自動電子メールで送信するプログラムをC#で設計しました。私はすべてが[散発的に]機能しています。私が抱えている問題は、会社のExchangeサーバーがクラッシュしているように見えることです。プログラムの最初の数回の実行が成功した後、次の例外が発生し始めます。

基本例外:System.Net.Mail.SmtpException:システムストレージが不十分です。サーバーの応答は次のとおりです。4.3.1不十分なシステムリソース

メーリングでDispose()のようなメソッドを呼び出す必要があるかどうか疑問に思っていますか?または、メールシステムの応答を停止させる他の明らかな理由がある場合はどうなりますか?これは、私のコードだけでなく、当社のすべてのクライアントに影響します。

これはExchange2010であり、私のコードは.NET3.5に対してコンパイルされています。私の添付ファイルは通常27kbです。Exchangeサーバーにログインすると、メッセージが無期限にキューに残っているように見えます。キューをクリアし(NDRを送信せずに削除)、サーバーを再起動すると、キューが再び実行されます。

郵送部分は次のようになります(ユーザー名、パスワード、アドレスが変更されました)。

public void doFinalEmail()
{
     List<string> distList = new List<string>();
     string distListPath = Environment.CurrentDirectory + "\\DistList.txt";
     string aLine;

     logThat("Attempting email distribution of the generated report.");

     if (File.Exists(distListPath))
     {
         FileInfo distFile = new FileInfo(distListPath);
         StreamReader distReader = distFile.OpenText();

         while (!String.IsNullOrEmpty(aLine = distReader.ReadLine()))
         {
             distList.Add(aLine);
         }
     }
     else
     {
         logThat("[[ERROR]]: Distribution List DOES NOT EXIST! Path: " + distListPath);
     }

     MailMessage msg = new MailMessage();
     MailAddress fromAddress = new MailAddress("emailaddresshere");
     msg.From = fromAddress;

     logThat("Recipients: ");
     foreach (string anAddr in distList)
     {
         msg.To.Add(anAddr);
         logThat("\t" + anAddr);
     }
     if (File.Exists(Program.fullExportPath))
     {
         logThat("Attachment: " + Program.fullExportPath);
         Attachment mailAttachment = new Attachment(Program.fullExportPath);
         msg.Attachments.Add(mailAttachment);
         string subj = "Company: " + Program.yestFileName;
         msg.Subject = subj;
         msg.IsBodyHtml = true;
         msg.BodyEncoding = System.Text.Encoding.UTF8;
         sendMail(msg);
     }
     else
     {
         logThat("[[ERROR]]: ATTACHMENT DOES NOT EXIST! Path: " + Program.fullExportPath);
     }
 }

 public void sendMail(MailMessage msg)
 {
     try
     {
         string username = "user"; //domain user
         string password = "pass"; // password
         SmtpClient mClient = new SmtpClient();
         mClient.Host = "192.168.254.11";
         mClient.Credentials = new NetworkCredential(username, password);
         mClient.DeliveryMethod = SmtpDeliveryMethod.Network;
         mClient.Send(msg);
     }
     catch (Exception oops)
     {
         string whatHappened = String.Format("Company: \r\nFailure in {0}! \r\n\r\nError message: {1} \r\nError data: {2} \r\n\r\nStack trace: {3} \r\n\r\nBase exception: {4} \r\nOccuring in method: {5} with a type of {6}\r\n", oops.Source, oops.Message, oops.Data, oops.StackTrace, oops.GetBaseException(), oops.TargetSite, oops.GetType());
         logThat(whatHappened);
         Environment.Exit(1);
     }
 }
4

3 に答える 3

9

このエラーは、次の場合に発生する可能性があります。

  1. Exchangeサーバーのディスク容量が不足しています。
  2. 受信者のメールボックスのディスク容量が不足しています。

問題#1よりも問題#2に遭遇するのが一般的です。

Exchangeステータスコードとその意味のリストは次のとおりです。

于 2013-02-04T18:04:29.077 に答える
2

問題を明確に絞り込むには、aspNetEmail などの別のメール クライアントに交換することができます (テスト用の評価版を入手できます)。数行のコードしか必要ありません。問題が解決しない場合は、サーバーに問題があります。そうでない場合は、クライアントにあります。これはサーバーの問題であると強く疑われますが、クライアントが接続を閉じてメッセージが送信されると、サーバーはその接続の結果としてリソースを実際に保持してはならないためです。これは、SMTP ログを見て、接続が閉じられたときに SMTP エラーが発生していないことを確認することで確認できます。

これが実際にサーバー上の問題である場合 (SMTP ログは完全な切断を示しており、問題は代替クライアントで再現可能です)、サーバーにログオンし (アクセスできる場合)、jeuton が示唆するようにディスク容量を監視します。 .

于 2013-02-04T18:10:45.263 に答える
1

Exchange 2007 では、c: (システム ドライブ) に約 4GB の空きディスク容量が必要です。これが私たちの問題でした。ドライブをインクリメントすると、メールが再び流れます。

于 2016-07-14T15:16:06.793 に答える