J'ai implémenté un simple EmailService pour Asp.Net Identity 2.0 (via l'interface 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);
}
}
}
Pour envoyer un e-mail, je passe par UserManager:
await _userManager.SendEmailAsync(user.Id, "Confirm your account","Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
Le problème est que j'obtiens un System.Threading.Tasks.TaskCanceledException
Lorsque j'appelle SendEmailAsync()
et on ne sait pas pourquoi.
Si j'envoie un e-mail de manière synchrone (client.Send(email)
), tout fonctionne bien.
Mes questions sont donc:
Comment empêcher la levée de TaskCanceledException? et (en supposant que je peux surmonter cette erreur),
Comment dois-je procéder pour communiquer les erreurs lors de l'envoi d'un e-mail au client (c'est-à-dire, "aucun utilisateur de ce type ici" de type SmtpClient?
Votre problème est que SmtpClient
est supprimé avant l'envoi de l'e-mail.
Deux façons:
Attendre le résultat SendMailAsync
using (var client = new SmtpClient())
{
await client.SendMailAsync(email);
}
Enregistrez l'événement SendCompleted
et supprimez le SmtpClient
uniquement après l'envoi du message
var client = new SmtpClient();
client.SendCompleted += (s, e) => {
client.Dispose();
};
return client.SendMailAsync(message);
Vous devez mettre async sur la méthode.
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);
}
}
}
}