Aller à la documentation
C#

Envoyer un e-mail

Un message maintenant ou plus tard, avec des pièces jointes, ou une centaine en une seule requête.

Envoyer un message

send.cs
var sent = await client.Emails.SendAsync(new Body{    ["from"] = "Acme Billing <[email protected]>",    ["to"] = new[] { "[email protected]", "[email protected]" },    ["replyTo"] = "[email protected]",    ["subject"] = "Your September invoice",    ["html"] = "<p>The invoice is attached.</p>",    ["text"] = "The invoice is attached.",    ["tags"] = new Body { ["invoice"] = "inv_2026_09_4192" },}); Console.WriteLine($"{sent["id"]} {sent["status"]}");

to, cc et bcc prennent une adresse ou une liste, et une adresse est un texte comme Ada <[email protected]> ou un dictionnaire avec email et name. Le corps vient de html et text, d'un template enregistré ou d'un draftId.

Chaque envoi porte une clé d'idempotence. Le client en crée une par appel et la réutilise quand il retente : une requête retentée rejoue donc le premier message. Passez idempotencyKey: pour que cela tienne aussi d'un processus à l'autre et après un redémarrage.

Pièces jointes

attachments.cs
await using var invoice = File.OpenRead("invoice.pdf"); await client.Emails.SendAsync(new Body{    ["from"] = "[email protected]",    ["to"] = "[email protected]",    ["subject"] = "Your September invoice",    ["text"] = "The invoice is attached.",    ["attachments"] = new[]    {        new Body { ["filename"] = "invoice.pdf", ["content"] = invoice, ["contentType"] = "application/pdf" },        new Body { ["fileId"] = "file_3f9c2a7b1e4d8f60a5c7b92d" },    },});

content prend un byte[] ou un Stream lisible, que le client encode en base64, ou un texte déjà en base64. fileId désigne un fichier téléversé avec client.Files.UploadAsync(), et c'est ainsi qu'on envoie un fichier de plus de 5 Mo.

Envoyer plus tard

schedule.cs
var scheduled = await client.Emails.SendAsync(new Body{    ["from"] = "[email protected]",    ["to"] = "[email protected]",    ["subject"] = "Your invoice is due tomorrow",    ["text"] = "A reminder that the invoice is due tomorrow.",    ["scheduledAt"] = DateTimeOffset.UtcNow.AddDays(1),}); var id = scheduled["id"]!.GetValue<string>(); await client.Emails.RescheduleAsync(id, DateTimeOffset.UtcNow.AddDays(2)); var cancelled = await client.Emails.CancelAsync(id); Console.WriteLine(cancelled["status"]);

scheduledAt prend un DateTimeOffset, un instant ISO 8601 ou une durée comme PT1H. Un DateTimeOffset placé n'importe où dans un corps est envoyé comme un instant ISO 8601 en UTC. Un message planifié peut être modifié ou annulé jusqu'à son départ.

Envoyer un lot

batch.cs
var result = await client.Emails.SendBatchAsync(new[]{    new Body { ["from"] = "[email protected]", ["to"] = "[email protected]", ["subject"] = "Order AC-4192 has shipped", ["text"] = "It is on its way." },    new Body { ["from"] = "[email protected]", ["to"] = "[email protected]", ["subject"] = "Order AC-4193 has shipped", ["text"] = "It is on its way." },}); Console.WriteLine($"{result.Sent} sent, {result.Failed} failed"); foreach (var item in result){    if ((string?)item["status"] == "error")    {        Console.WriteLine($"{item["index"]} {item["error"]?["message"]}");    }}

Un lot contient jusqu'à 100 messages et n'est jamais tout ou rien : une mauvaise adresse fait échouer son propre élément et le reste part quand même. Vérifiez Failed et le status de chaque élément au lieu de compter sur une exception.