2

.NET 3.5 を使用した Windows コンソール アプリケーション (既存の .NET 2.0 アプリケーションを .NET 3.5 に変更しました)

私は奇妙な問題を抱えています.電子メールを送信するためのコードは数回(おそらく5〜10回)動作します.

数回後、「メールの送信に失敗しました」というメッセージでメールの送信に失敗します。システムを再起動した後、同じコードが機能します。(これは本番環境で期待されるソリューションではありません)。

これが、この SmtpClient 接続を閉じたところにあると感じたコードの一部です。そのため、クライアントを null に設定し、GC.Collect も呼び出しましたが、役に立ちませんでした。

助けてください



private static void SendEmail(MailMessage msg)
{
            SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort());

            client.Credentials = CredentialCache.DefaultNetworkCredentials;
            client.EnableSsl = false;
            client.ServicePoint.MaxIdleTime = 1;
            //client.Timeout = GetSMTPTimeout(); 30000000
            client.Send(msg);
            client = null;
            GC.Collect();
}


4

2 に答える 2

2

単にブロックを使用して、送信後usingに適切に破棄してみてください。SmtpClient

private static void SendEmail(MailMessage msg)
{
    using(SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort()))
    {
        client.Credentials = CredentialCache.DefaultNetworkCredentials;
        client.EnableSsl = false;
        client.Send(msg);
    }
}

参照:電子メールを送信する .NET の最良の方法 (System.Net.Mail には問題があります)

于 2013-10-07T14:11:39.727 に答える
1

2 つのメール送信の間隔が 60 秒より大きく 90 秒より小さい場合、このエラーが確実に発生します。

たとえば、午前 8:08:08 に最初の電子メールを送信し、午前 8:09:10 に 2 番目の電子メールを送信すると、例外がスローされます。

これは設定上のバグであり、SmtpClient.TimeOut変更することはできません。

この問題を解決するには?3 つの方法:

  1. キャッチ送信を試み、例外をキャッチした場合は、再度送信します。
  2. SmtpClient.Dispose().net Framework 3.0 以降の場合
  3. 1 に設定SmtpClient.servicepoint.maxidletime=1000;すると小さすぎます。デバッグ モードでは機能しません
于 2013-01-11T06:31:07.250 に答える