1

さまざまな人にさまざまな電子メールを送信する必要があります。受信者ごとに異なる電子メールの本文が生成され、次のメソッドを呼び出します。つまり、10 人の受信者がいる場合、次のメソッドが 10 回呼び出されます。

        public int Send_Mail(string send_from_bc, string send_to_bc, string subject_bc, string body_bc)
        {
            try
            {
                int count_returned = 0;
                var send_from = new MailAddress(send_from_bc, "The Admin");
                var send_to = new MailAddress(send_to_bc);
                string subject = subject_bc;
                string body = body_bc;

                var smtp = new SmtpClient
                {
                    Host = "**my smtp host**",
                    Port = 25,
                    DeliveryMethod = SmtpDeliveryMethod.Network,
                    Timeout = 300000
                };

                using (var message = new MailMessage(send_from, send_to)
                {
                    Subject = subject,
                    Body = body
                })
                {
                    message.IsBodyHtml = true;
                    smtp.Send(message);
                    count_returned += 1;
                }

                return count_returned;
            }
            catch (Exception ex)
            {
                throw new Exception("Exception caught in Send_Mail", ex);
            }
        }

問題は、少数のメール (10 通または 15 通のメールなど) を送信するだけでも、信じられないほどの時間がかかることです。1通のメール送信にかかる時間は2~5分程度です。現在、提供された SMTP ホストの一部に問題があると確信しています。しかし、物事をスピードアップするにはどうすればよいでしょうか?

また、これを達成する方法はありますか: 現在、ユーザーはボタンをクリックしてから、2 つのメールを送信するために、制御が返されて値が返されるまでに 2 ~ 5 分 (場合によってはそれ以上) 待つ必要があります。のラベルが「送信済みメール」に変更されます。ユーザーがボタンをクリックするだけで電子メールの送信が開始され、ウィンドウを閉じて作業を続行できるようにすることはできますか?

私は今、重要な段階で立ち往生しています。助けていただければ幸いです。

4

1 に答える 1

2

まず最初に、このアクションをユーザーに待たせないでください。2 ~ 5 分待たなければならない場合は、セッションがタイムアウトになる可能性があります。代わりに、このアクションをバックグラウンドで実行される非同期タスクにします。

次に、強制的に待機させるのではなく、後でメールがユーザーに送信されたことを示す通知をポップアップ表示することを検討します。

10 のスターター - 送信メール コードを別のクラスに移動します。

public class EmailSender
{
    public EmailSender(/* Parameters required, e.g. list of emails */)
    { }

    public void SendEmails()
    {
        // Long running task
    }       
}

次に、ページで、ボタンがクリックされたとします。

protected void btn_SendEmails_Clicked(object sender, EventArgs e)
{
     EmailSender emailSender = new EmailSender(/* Any setup code required */);
     ThreadPool.QueueUserWorkItem(emails  => emailSender.SendEmails());
}

ユーザーへの通知を処理するには、メールが終了したときにイベントを発生させ、おそらく SignalR などを使用してブラウザーに警告する必要があります。

このコードをコンパイルしようとしたことはありませんが、一般的なアイデアを提供する必要があることに注意してください。

于 2013-10-24T14:36:49.333 に答える