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からの応答ですか?)
問題は、電子メールが送信される前に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);
メソッドに非同期を設定する必要があります。
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);
}
}
}
}