Vous trouverez les informations nécessaires pour l’envoi d’un email classique dans le billet suivant.

L’envoi asynchrone d’un email est basé sur le mécanisme des Task de .NET intégré avec .NET Framework 4.0.

public async void SendEmailAsync()
{
    using (SmtpClient smtpClient = new SmtpClient("localhost"))
    {
        MailMessage message = new MailMessage();

        message.From = new MailAddress("sample@mail.com", "Display Name");
        message.To.Add("dest@mail.com");
        message.Subject = "Subject email";
        message.Body = "Content email";
        message.IsBodyHtml = false;

        await smtpClient.SendMailAsync(message);
    }
}

L’utilisation des mots clés async et await est nécessaire afin de mettre en “pause” l’appel à la méthode SendMailAsync. Leur utilisation est possible car notre méthode renvoit un objet de type Task.

Dans le cas où vous êtes sous .NET Framework 4.0 et donc l’impossibilité d’utiliser les mots clés async et await, vous pouvez utiliser l’objet Task pour activer le même comportement.

using (SmtpClient smtpClient = new SmtpClient("localhost"))
{
    MailMessage message = new MailMessage();

    message.From = new MailAddress("sample@mail.com", "Display Name");
    message.To.Add("dest@mail.com");
    message.Subject = "Subject email";
    message.Body = "Content email";
    message.IsBodyHtml = false;

    Task res = smtpClient.SendMailAsync(message);
    res.Wait();
}

Pour cela, il suffit d’appeler la méthode Wait sur notre objet Task afin d’attendre la fin de l’exécution de notre envoi d’email de manière asynchrone.

Enfin, si vous utilisez une version du .NET Framework inférieure à la version 4.0, il ne vous est pas possible d’utiliser le mécanisme des tâches pour faire de l’asynchrone. Vous devrez donc utiliser le pattern des évènements / délégués pour arriver au même résultat.

public void SendMailAsync()
{
    SmtpClient smtpClient = new SmtpClient("localhost");

    MailMessage message = new MailMessage();

    message.From = new MailAddress("sample@mail.com", "Display Name");
    message.To.Add("dest@mail.com");
    message.Subject = "Subject email";
    message.Body = "Content email";
    message.IsBodyHtml = false;

    smtpClient.SendCompleted += smtpClient_SendCompleted;

    smtpClient.SendAsync(message, smtpClient);
}

private void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    ((SmtpClient)e.UserState).Dispose();
}

Cette fois-ci, vous devez vous abonner à l’évènement SendCompleted qui sera généré une fois l’opération SendAsync terminée.

Notez au passage que lors de l’exécution de notre envoi d’email, la méthode SendMailAsync se termine car le code n’est pas bloqué. Il a donc fallu retirer le using sur notre objet smtpClient afin d’éviter que le Dispose soit effectué alors que l’envoi de l’email est en cours. C’est donc dans la méthode smtpClient_SendCompleted qu’il faut penser à disposer notre objet.

Plus d’informations sur la méthode SendMailAsync sur MSDN.

Plus d’informations sur la méthode SendAsync sur MSDN.