two password net mvc form factor asp c# asp.net-identity smtpclient

c# - password - Asp.Net Identity 2.0-¿Cómo implementar IIdentityMessageService para hacer SMTP asíncrono usando SmtpClient?



reset password mvc asp net (2)

He implementado un servicio de correo electrónico simple para Asp.Net Identity 2.0 (a través de la interfaz 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); } } }

Para enviar un correo electrónico, voy a través de UserManager:

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

El problema es que recibo una SendEmailAsync() System.Threading.Tasks.TaskCanceledException cuando llamo a SendEmailAsync() y no está claro por qué.

Si envío un correo electrónico sincrónicamente ( client.Send(email) ), todo funciona bien.

Así que mis preguntas son:

  • ¿Cómo evito que la excepción TaskCanceledException sea lanzada? y (asumiendo que puedo superar este error),

  • ¿Cómo debo hacer para comunicar errores durante el envío de correos electrónicos al cliente (es decir, "no hay un usuario de este tipo aquí", escriba las respuestas del SmtpClient?


Debes poner el método asíncrono.

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); } } } }


Su problema es que SmtpClient se elimina antes de que se envíe el correo electrónico.

Dos caminos:

  • Espera el resultado de SendMailAsync

    using (var client = new SmtpClient()) { await client.SendMailAsync(email); }

  • Registre el evento SendCompleted y elimine el SmtpClient solo después de que se envíe el mensaje

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