Zur Dokumentation springen
Go

Eine E-Mail senden

Eine Nachricht jetzt oder später, mit Anhängen, oder hundert in einer Anfrage.

Eine Nachricht senden

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 und bcc nehmen eine Adresse oder eine Liste, und eine Adresse ist Text wie Ada <[email protected]> oder eine Map mit email und name. Der Körper kommt aus html und text, aus einem gespeicherten template oder aus einer draftId.

Jeder Versand trägt einen Idempotenzschlüssel. Der Client erzeugt einen pro Aufruf und verwendet ihn bei Wiederholungen erneut, sodass eine wiederholte Anfrage die erste Nachricht erneut ausgibt. Übergeben Sie openemail.WithIdempotencyKey, damit das auch über Prozesse und Neustarts hinweg gilt.

Anhänge

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 nimmt ein []byte oder einen io.Reader, die der Client als Base64 kodiert, oder Text, der schon Base64 ist. fileId benennt eine Datei, die mit client.Files.Upload hochgeladen wurde, und so wird eine Datei über 5 MB gesendet.

Später senden

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 nimmt eine time.Time, einen ISO-8601-Zeitpunkt oder eine Dauer wie PT1H. Eine time.Time an beliebiger Stelle eines Körpers wird als ISO-8601-Zeitpunkt in UTC gesendet. Eine geplante Nachricht kann geändert oder abgebrochen werden, bis sie rausgeht.

Einen Batch senden

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"))	}}

Ein Stapel fasst bis zu 100 Nachrichten und ist nie alles oder nichts: Eine fehlerhafte Adresse lässt nur ihren eigenen Eintrag scheitern, und der Rest geht trotzdem raus. Prüfen Sie Failed und den status jedes Eintrags, statt sich auf einen Fehler zu verlassen.