Aller au contenu
Docs

Tutoriel

Envoyez des e-mails depuis ASP.NET Core et .NET avec le paquet NuGet Emailit, MailKit ou System.Net.Mail via SMTP, et vérifiez les webhooks Emailit.

Mis à jour le 1 oct. 2026

Ce guide montre comment envoyer des e-mails depuis une application .NET avec le paquet NuGet officiel Emailit, comment utiliser plutôt MailKit ou System.Net.Mail via SMTP, et comment vérifier les webhooks dans une API minimale ASP.NET Core.

Prérequis

  • .NET 8 ou version ultérieure.
  • Un domaine d’envoi vérifié, par exemple acme.com.
  • Une clé API. Une clé Sending Only limitée à votre domaine suffit.
  • Tant que votre espace de travail n’a pas l’accès production, vous ne pouvez envoyer qu’aux adresses e-mail des comptes des membres de l’espace de travail.

Installer le SDK

Terminal
dotnet add package Emailit

Configurer votre clé API

ASP.NET Core lit la configuration depuis les variables d’environnement, où __ sépare les sections. Définissez Emailit__ApiKey en production :

Terminal
export Emailit__ApiKey=secret_••••••••••••••••••••••••••••••••

Pendant le développement, gardez la clé dans les secrets utilisateur plutôt que dans appsettings.json :

Terminal
dotnet user-secrets init
dotnet user-secrets set "Emailit:ApiKey" "secret_••••••••••••••••••••••••••••••••"

Envoyer un e-mail

Enregistrez un seul client et injectez-le dans vos endpoints :

Program.cs
using Emailit;
using Emailit.Options;
using Emailit.Resources;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton(new EmailitClient(builder.Configuration["Emailit:ApiKey"]!));

var app = builder.Build();

app.MapPost("/orders/{id}/confirm", (string id, EmailitClient emailit) =>
{
    Email email = emailit.Emails.Send(new EmailSendOptions
    {
        From = "Acme <orders@acme.com>",
        To = new[] { "ada@example.com" },
        Subject = $"Order {id} confirmed",
        Html = $"<p>We've received order {id}.</p>",
    });

    return Results.Ok(new { emailId = email.Id });
});

app.Run();

Send est synchrone ; pour les envois en masse, exécutez-le depuis un service en arrière-plan afin de laisser les threads de requête libres. Les options acceptent aussi Cc, Bcc, ReplyTo, Attachments, Template avec Variables, ScheduledAt et Tracking ; consultez Envoyer un e-mail.

Si votre code construit déjà des objets System.Net.Mail.MailMessage, le SDK peut les envoyer via l’API :

C#
using System.Net.Mail;

var message = new MailMessage("orders@acme.com", "ada@example.com", "Order confirmed", "<p>Thanks!</p>")
{
    IsBodyHtml = true,
};

Email email = emailit.Emails.Send(message);

Gérer les erreurs

C#
using Emailit.Exceptions;

try
{
    emailit.Emails.Send(options);
}
catch (RateLimitException)
{
    // 429: back off and retry
}
catch (AuthenticationException)
{
    // 401: the API key is missing or invalid
}
catch (UnprocessableEntityException ex)
{
    // 422: for example, the from domain isn't verified
    logger.LogWarning("Emailit rejected the email: {Message}", ex.Message);
}
catch (ApiErrorException ex)
{
    logger.LogError("Emailit error {Status}: {Body}", ex.HttpStatus, ex.HttpBody);
}

Envoyer plutôt via SMTP

MailKit

Microsoft recommande MailKit pour le nouveau code SMTP. Installez-le avec dotnet add package MailKit :

C#
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

var message = new MimeMessage();
message.From.Add(new MailboxAddress("Acme", "orders@acme.com"));
message.To.Add(MailboxAddress.Parse("ada@example.com"));
message.Subject = "Order confirmed";
message.Body = new TextPart("html") { Text = "<p>We've received your order.</p>" };

using var smtp = new SmtpClient();
await smtp.ConnectAsync("smtp.emailit.com", 587, SecureSocketOptions.StartTls);
await smtp.AuthenticateAsync("emailit", builder.Configuration["Emailit:ApiKey"]);
await smtp.SendAsync(message);
await smtp.DisconnectAsync(true);

Pour le TLS implicite, connectez-vous au port 465 avec SecureSocketOptions.SslOnConnect.

System.Net.Mail

Le client intégré convient aux cas simples. Il ne prend en charge que STARTTLS : utilisez donc le port 587 (ou 2525 ou 2587) :

C#
using System.Net;
using System.Net.Mail;

using var client = new SmtpClient("smtp.emailit.com", 587)
{
    EnableSsl = true,
    Credentials = new NetworkCredential("emailit", apiKey),
};

client.Send(new MailMessage("orders@acme.com", "ada@example.com", "Order confirmed", "We've received your order."));

Pour tous les ports, consultez Paramètres SMTP.

Recevoir des webhooks

Créez un webhook et enregistrez son secret de signature dans Emailit:WebhookSecret. Lisez le corps brut, vérifiez-le, puis analysez le tableau d’événements :

Program.cs
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

app.MapPost("/webhooks/emailit", async (HttpRequest request, IConfiguration config) =>
{
    using var reader = new StreamReader(request.Body, Encoding.UTF8);
    var body = await reader.ReadToEndAsync();

    var signature = request.Headers["X-Emailit-Signature"].ToString();
    var timestamp = request.Headers["X-Emailit-Timestamp"].ToString();

    if (!long.TryParse(timestamp, out var ts) ||
        Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - ts) > 300)
    {
        return Results.Unauthorized();
    }

    using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(config["Emailit:WebhookSecret"]!));
    var expected = Convert.ToHexString(hmac.ComputeHash(Encoding.UTF8.GetBytes($"{timestamp}.{body}"))).ToLowerInvariant();

    if (!CryptographicOperations.FixedTimeEquals(Encoding.UTF8.GetBytes(expected), Encoding.UTF8.GetBytes(signature)))
    {
        return Results.Unauthorized();
    }

    // The body is a JSON array of up to 100 events.
    using var events = JsonDocument.Parse(body);
    foreach (var evt in events.RootElement.EnumerateArray())
    {
        if (evt.GetProperty("type").GetString() == "email.bounced")
        {
            var address = evt.GetProperty("data").GetProperty("object").GetProperty("to").GetString();
            // Stop emailing this address.
        }
    }

    return Results.Ok();
});

Renvoyez un 2xx dans les 30 secondes ; pour toute autre réponse, Emailit réessaie. Consultez Signature des requêtes.

Conseils pour la production

  • Enregistrez le client comme singleton. Un seul EmailitClient par application suffit.
  • Mettez les envois en masse en file d’attente. Envoyez depuis un BackgroundService ou une bibliothèque de tâches comme Hangfire, et limitez le débit pour rester sous vos limites d’envoi (2 e-mails par seconde par défaut).
  • Sécurisez les relances. Si vous relancez une requête après un timeout, envoyez un en-tête Idempotency-Key avec HttpClient ; consultez Idempotence.
  • Dédoublonnez les webhooks en enregistrant chaque event_id traité.

Étapes suivantes

Pièces jointes, programmation et suivi.
Tous les événements et leur payload.
Corrigez les erreurs d’authentification et de connexion.
Toutes les bibliothèques officielles.

Cette page vous a-t-elle été utile ?

Merci pour votre retour.

Merci, nous lisons chaque message.