8

メール送信用に次のものがありましたが、うまくいきました:

    private SmtpClient _client = new SmtpClient("smtp.gmail.com", 587)
    {
        Credentials = new NetworkCredential("address@gmail.com", "password"),
        EnableSsl = true
    };
    public void DoThis(){
    _client.Send("from@gmail.com", to.Email, "Subject", "Body");}
    public void DoThat(){
    _client.Send("from@gmail.com", to.Email, "Subject", "Body");}

しかし、メールが送信されるまで Web アプリケーションをブロックしていたので、非同期で送信してみることにしました。

   public void DoThis(){
    var message = new MailMessage("from@gmail.com", to.Email, "Subject", "Body");
   _client.SendAsync(message, null);
   }

デバッグすると非同期に処理されることがわかりますが、常に次のようになります。

非同期操作がまだ保留中に、非同期モジュールまたはハンドラーが完了しました。

私は何を間違っていますか?

4

1 に答える 1

5

非同期メールの送信方法を次のように作り直しました。

public void SendAsyncEmail(MailMessage message)
        {

            var client = new SmtpClient("mail.hover.com", 587)
            {
                Credentials = new NetworkCredential("admin@site.com", "Covert00!"),
                EnableSsl = false
            };
            client.SendCompleted += (sender, error) =>
            {
                if (error.Error != null)
                {
                    // TODO: get this working
                    throw new WarningException("Email Failed to send.");
                }
                client.Dispose();
                message.Dispose();
            };
            ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message)));
        }

これは一時的な解決策であり、電子メールを処理する正しい方法 (と思われる) は、worker ロールまたは他の Windows サービスと組み合わせたある種のキュー サービスを使用してメッセージをポップすることであることに注意してください。

于 2013-11-07T15:46:52.923 に答える