web-dev-qa-db-ja.com

Asp.Net Identity 2.0-SmtpClientを使用して非同期SMTPを実行するためにIIdentityMessageServiceを実装する方法

Asp.Net Identity 2.0の簡単なEmailServiceを実装しました(IIdentityMessageServiceインターフェイス経由)。

_    public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        // convert IdentityMessage to a MailMessage
        var email = 
           new MailMessage(new MailAddress("[email protected]", "(do not reply)"), 
           new MailAddress(message.Destination))
        {
            Subject = message.Subject,
            Body = message.Body,
            IsBodyHtml = true
        };

        using (var client = new SmtpClient()) // SmtpClient configuration comes from config file
        {
            return client.SendMailAsync(email);
        }
    }
}
_

メールを送信するには、UserManagerを使用します。

await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");

問題は、SendEmailAsync()を呼び出すときに_System.Threading.Tasks.TaskCanceledException_を取得することであり、その理由は明らかではありません。

電子メールを同期的に送信する場合(client.Send(email))、すべて正常に動作します。

だから私の質問は:

  • TaskCanceledExceptionがスローされるのを防ぐにはどうすればよいですか? (このエラーを克服できると仮定すると)、

  • クライアントにメールを送り返す際にエラーを通信するにはどうすればよいですか(つまり、「no such user here」タイプのSmtpClientからの応答ですか?)

27
Mr. T

問題は、電子メールが送信される前にSmtpClientが破棄されることです。

二通り:

  • SendMailAsyncの結果を待つ

    using (var client = new SmtpClient())
    {
        await client.SendMailAsync(email);
    }
    
  • SendCompletedイベントを登録し、メッセージが送信された後にのみSmtpClientを破棄します

    var client = new SmtpClient();
    client.SendCompleted += (s, e) => {
        client.Dispose();
    };
    return client.SendMailAsync(message);
    
30
meziantou

メソッドに非同期を設定する必要があります。

    public async Task SendAsync(IdentityMessage message)
    {
        using (SmtpClient client = new SmtpClient())
        {
                using (var mailMessage = new MailMessage("[email protected]", message.Destination, message.Subject, message.Body))
                {
                    await client.SendMailAsync(mailMessage);
                }
            }
        }
    }
6
Marcelo Gondim