Aller à la documentation
Go

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.go
sent, err := client.Emails.Send(ctx, openemail.Body{	"from":    "Acme Billing <[email protected]>",	"to":      []string{"[email protected]", "[email protected]"},	"replyTo": "[email protected]",	"subject": "Your September invoice",	"html":    "<p>The invoice is attached.</p>",	"text":    "The invoice is attached.",	"tags":    openemail.Body{"invoice": "inv_2026_09_4192"},})if err != nil {	return err} fmt.Println(sent.ID(), sent.String("status"))

to, cc et bcc acceptent une adresse ou une liste, et une adresse est un texte comme Ada <[email protected]> ou une map 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 openemail.WithIdempotencyKey pour que cela tienne aussi d'un processus à l'autre et après un redémarrage.

Pièces jointes

attachments.go
invoice, err := os.ReadFile("invoice.pdf")if err != nil {	return err} _, err = client.Emails.Send(ctx, openemail.Body{	"from":    "[email protected]",	"to":      "[email protected]",	"subject": "Your September invoice",	"text":    "The invoice is attached.",	"attachments": []openemail.Body{		{"filename": "invoice.pdf", "content": invoice, "contentType": "application/pdf"},		{"fileId": "file_3f9c2a7b1e4d8f60a5c7b92d"},	},}) return err

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

Envoyer plus tard

schedule.go
scheduled, err := client.Emails.Send(ctx, openemail.Body{	"from":        "[email protected]",	"to":          "[email protected]",	"subject":     "Your invoice is due tomorrow",	"text":        "A reminder that the invoice is due tomorrow.",	"scheduledAt": time.Now().Add(24 * time.Hour),})if err != nil {	return err} if _, err := client.Emails.Reschedule(ctx, scheduled.ID(), time.Now().Add(48*time.Hour)); err != nil {	return err} cancelled, err := client.Emails.Cancel(ctx, scheduled.ID())if err != nil {	return err} fmt.Println(cancelled.String("status"))

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

Envoyer un lot

batch.go
result, err := client.Emails.SendBatch(ctx, []openemail.Body{	{"from": "[email protected]", "to": "[email protected]", "subject": "Order AC-4192 has shipped", "text": "It is on its way."},	{"from": "[email protected]", "to": "[email protected]", "subject": "Order AC-4193 has shipped", "text": "It is on its way."},})if err != nil {	return err} fmt.Println(result.Sent, "sent,", result.Failed, "failed") for _, item := range result.Items {	if item.String("status") == "error" {		fmt.Println(item.Int("index"), item.Object("error").String("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 erreur.