7

バックグラウンドで実行されているスレッドがあり、スリープ状態になり、何かが起動したときにデータベースからデータを取得します。SmtpClient (以下のコード) を使用して Google アプリを使用してメールを送信しています。

私が知っている何かがあるかどうか知りたいですか?一度に 1 つの電子メールのみを送信する予定です (登録またはパスワードを忘れた場合の電子メール)。タイムアウトを設定していないか、Googleアプリがたまたま実行されてアプリが爆発する可能性があるため、無効なメールがスレッドをロックするなどの事態が発生する可能性があるのではないかと少し心配しています. 何を知っておくべきですか?どのようにテストすればよいですか?

        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential(fromAddr, pass),
            EnableSsl = true
        };
        MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
        mail.IsBodyHtml = true;
        client.Send(mail);
4

4 に答える 4

3

IIS を使用している場合。サーバーに SMTP をインストールし、すべてのメールを localhost に送信します。そうすれば、電子メールがすぐに送信されない場合、SMTP サーバーはアプリケーションをハングアップさせる代わりに電子メールをキューに入れます。

gmail をスマートホストとして使用するには、SMTP サーバーを構成する必要があります。これを構成する方法についてさらに情報が必要な場合は、お知らせください。

于 2010-01-21T08:45:30.870 に答える
2

コードに try/catch を追加すれば問題ありません。最悪の場合、最終的にタイムアウトになります。永久に実行されるわけではなく、Google が接続を永久に開いたままにしておくこともありません (実際、SMTP はタイムアウトに関しては非常に厳しいものです...遅いと接続が切断されます)。

    try
    {
        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential(fromAddr, pass),
            EnableSsl = true
        };
        MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body);
        mail.IsBodyHtml = true;
        client.Send(mail);
    }
    catch
    {
        // do something
    }

テストに関しては...別のgMailアカウントを使用してください。また、1 日あたりの送信メール数の上限を確認することもできます。gMail の番号はわかりませんが、送信したい数だけ送信できるわけではありません。

于 2010-01-21T04:56:18.367 に答える
1

これはタグの 1 つであるため、ASP.Net で行われていると想定しています。

このプロセスはどれほど重要ですか?環境が許せば、これは ASP.Net ランタイムの一部ではなく、Windows サービスの有力な候補となる可能性があります。

データベースからデータを取得して電子メールを送信すると述べました。これはどれも ASP.Net に依存していません。さらに、サービスによって、より優れたスレッド化、テスト、ロギング、および非同期オプションが提供される場合があります。

ASP.Net ランタイムに固執したい場合は、非同期ページも検討できます (まだ検討していない場合)。これにより、複数のメール スレッドを作成し、メイン ページのスレッドで結果を待機させることができます。スタックしたスレッドをキャンセルしてログに記録できるタイムアウト値を設定することもできます。非同期タイムアウトを設定して処理することで、私が推測する心配の多くを処理できます。このソリューションは、少なくともページ作成リクエスト スレッドからメールを送信します。

テストは簡単に行う必要があります。テスト用に別の Google アカウントを登録できます。

于 2010-01-21T03:29:14.767 に答える
0

Timeoutのプロパティを設定し、呼び出しSmtpClientによってスローされた例外を処理できます。Sendその後、適切と思われる例外の原因を処理する必要がありますが、スレッドはロックされません。

于 2010-01-21T05:02:50.460 に答える