2

セットアップは次のとおりです。

  1. タスクスケジューラから1日1回呼び出される通知コントローラーがあります
  2. アクション メソッドは 300 以上のアドレスを取得し、それらをループして、SmtpClient クラスを使用して各受信者に個別の電子メールを送信します。

私が知る限り、プロセスは例外なく正常に実行されます...ただし、すべての電子メールが配信されているわけではありません。何が起こっているのか、どのように解決するのか、誰にもアイデアがありますか?

コードは次のとおりです。

foreach (var emp in division.Users)
{
    var fromAddress = "myfromaddress";
    var mailServer = "mymailserver";

    var toEmail = emp.EmailAddress;

    var message = new MailMessage(fromAddress, toEmail)
                    {
                        Subject = subject,
                        Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
                        IsBodyHtml = true
                    };

    var client = new SmtpClient(mailServer);
    client.Send(message);
}

アップデート:

電子メールの送信の間に一時停止を追加すると、問題が解決します。しかし、なぜこれが機能するのでしょうか。そして、より良い方法で問題を同等に解決するより良い方法 (たとえば、Async() を使用) はありますか?

更新されたコード...

foreach (var emp in division.Users)
{
    var fromAddress = "myfromaddress";
    var mailServer = "mymailserver";

    var toEmail = emp.EmailAddress;

    var message = new MailMessage(fromAddress, toEmail)
                    {
                        Subject = subject,
                        Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>",
                        IsBodyHtml = true
                    };

    var client = new SmtpClient(mailServer);
    client.Send(message);

    Thread.Sleep(3000); // Wait 3s until sending next message
}
4

3 に答える 3

0

SMTP クライアントにはデフォルトのタイムアウトがあり、デフォルト値は 100 秒です。

詳細はこちら

于 2010-02-16T19:07:03.133 に答える
0

SmtpClient.SendAsync()Send() がブロックされているため、使用することを強くお勧めします。

送信先の SMTP サーバーのログを確認します。注: 自分でメールを送信すると、信頼できるプロバイダーを使用するよりも迷惑メールになる可能性が高くなります。

編集:サンプルSendAsyncコードを追加

smtpClient.SendCompleted += smtpClient_SendCompleted;

static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Log.ErrorFormat("Async Mail exception {0} :: {1}", 
            e.Error.GetType().Name, e.Error.Message);
    }
}
于 2010-02-16T19:10:57.760 に答える
0

例外がない場合は、スパム フォルダと電子メール アドレスを確認します。また、メッセージを受信しなかったアドレスの 1 つに Outlook から手動でメールを送信してみます。

余談ですが、別のメールサーバーを使用していない限り、このコードを次のように変更できると思います

var client = new SmtpClient(mailServer); 
var mailServer = "mymailserver";

foreach (var emp in division.Users) 
{ 
    var fromAddress = "myfromaddress"; 


    var toEmail = emp.EmailAddress; 

    var message = new MailMessage(fromAddress, toEmail) 
                    { 
                        Subject = subject, 
                        Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>", 
                        IsBodyHtml = true 
                    }; 


    client.Send(message); 
} 

次のように、SmtpClient クラスの SendAsync メソッドを試すこともできます。

// setup the callback method when the send finishes
client.SendCompleted += SendComplete; //new SendCompletedEventHandler(smtpSender_SendCompleted);

// send the email
client.SendAsync(message, null);



private void SendComplete(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    // do stuff on complete
}
于 2010-02-16T19:12:35.103 に答える