Mr.*_*. T 27 c# smtpclient asp.net-identity
我已经为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("noreply@mydomain.com", "(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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
要发送电子邮件,我将通过UserManager:
await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
问题是,System.Threading.Tasks.TaskCanceledException当我打电话时,我得到一个SendEmailAsync(),但不清楚为什么.
如果我同步发送电子邮件(client.Send(email)),一切正常.
所以我的问题是:
如何防止TaskCanceledException被抛出?(假设我能克服这个错误),
我应该如何在电子邮件发送回客户端时传达错误(即"此处没有此类用户"类型的响应来自SmtpClient?
mez*_*tou 30
您的问题是SmtpClient在发送电子邮件之前处理的问题.
两种方式:
等待SendMailAsync结果
using (var client = new SmtpClient())
{
await client.SendMailAsync(email);
}
Run Code Online (Sandbox Code Playgroud)注册SendCompleted事件并SmtpClient在发送消息后进行处理
var client = new SmtpClient();
client.SendCompleted += (s, e) => {
client.Dispose();
};
return client.SendMailAsync(message);
Run Code Online (Sandbox Code Playgroud)您必须在方法上放置异步.
public async Task SendAsync(IdentityMessage message)
{
using (SmtpClient client = new SmtpClient())
{
using (var mailMessage = new MailMessage("your@email.com", message.Destination, message.Subject, message.Body))
{
await client.SendMailAsync(mailMessage);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)