E-Mails versenden

Eine API für jede E-Mail, die Sie versenden.

Transaktional oder Marketing, eine Nachricht oder hundert – alles über dieselbe E-Mail-API, mit Idempotenz, Unterdrückung und Webhooks. Übergeben Sie rohes HTML oder rendern Sie Ihre React-Email-Templates.

Erstellen Sie Ihr Konto, dann erstellen Sie einen API-Schlüssel und senden Sie eine Testnachricht.

Eingerichtet in:
Cursor
welcome.tsx
200 · 1.2s
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { WelcomeEmail } from "./emails/welcome";

const bird = new BirdClient({
  apiKey: process.env.BIRD_API_KEY!,
});

const { data, error } = await bird.email.send({
  from:    "Bird <hello@bird.com>",
  to:      ["ada@example.com"],
  subject: "Your invite is ready",
  html:    await render(<WelcomeEmail name="Ada" />),
}).safe();

if (error) throw error;
console.log(data.id);
// → "em_2bX91Yk8h..."

Sie versenden bereits über SMTP?

Behalten Sie Ihren bestehenden SMTP-Client bei und verbinden Sie ihn mit dem Relay von Bird. Nutzen Sie die SMTP-Einrichtungsseite für regionale Hosts, TLS-Ports und Authentifizierung. Wenn Ihre Anwendung Nachrichten empfangen und verarbeiten muss, beginnen Sie mit eingehendem E-Mail-Empfang.

Versenden Sie Ihre erste E-Mail in fünf Minuten.

In der Sprache, die Sie bereits verwenden.

Der Versand ist das Herzstück der Bird Email API. Ihr erster Versand kann an eine Sandbox-Adresse (delivered@messagebird.dev) gehen, sodass Sie die gesamte Plattform (Versand, Webhooks, Unterdrückung) testen können, bevor Sie eine Domain verifizieren.

1
2
3
4
5
6
7
const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Bird" },
  to: ["delivered@messagebird.dev"],
  subject: "Hello from Bird",
  html: "<p>My first Bird email.</p>",
});
console.log(msg.id, msg.status); // "em_…", "accepted"

Fünf Dinge, die Sie nicht selbst bauen müssen.

Derselbe Vertrag auf jedem Bird-Kanal.

  1. 01

    Transaktional + Marketing.

    Derselbe Endpoint sendet einen Passwort-Reset oder eine Kampagne. Ein Feld category bestimmt, wie Suppression und Abmeldungen angewendet werden.

  2. 02

    Templates nach Ihren Vorstellungen.

    Übergeben Sie rohes HTML, rendern Sie React Email-Templates in Ihrer App zu HTML und senden Sie das Ergebnis, oder benennen Sie ein gespeichertes Template und lassen Sie es für Sie rendern. Ihre Toolchain, unverändert.

  3. 03

    Batch bis zu 100.

    Bis zu 100 unabhängige Nachrichten pro Aufruf, jede mit eigenem Empfänger und eigenen Variablen – als eine Einheit validiert, damit Sie nie halb versenden.

  4. 04

    Idempotent per Vertrag.

    Jeder Versand akzeptiert einen Idempotency-Key, sodass ein nach einem Timeout wiederholter Request das ursprüngliche Ergebnis zurückgibt, statt doppelt zu senden.

  5. 05

    Ein Webhook bei jeder Statusänderung.

    Accepted, delivered, opened, clicked, bounced, complained. Jeder einzelne HMAC-signiert, replay-geschützt, idempotent, derselbe Envelope auf jedem Kanal.

Senden Sie die erste Anfrage aus Ihrer Anwendung.

Erstellen Sie ein Konto und einen API-Schlüssel, dann folgen Sie der Versandanleitung mit einem Testempfänger.

Versand starten

Sie versenden bereits woanders? Wechseln Sie an einem Nachmittag.

Der Aufruf, den Sie bereits machen, ändert sich kaum: Tauschen Sie den Client, behalten Sie Ihre Templates und richten Sie Ihre Webhooks auf einen Endpunkt. Migrationsleitfäden decken SendGrid, Amazon SES, Mailgun und Resend ab.

sendgrid.ts
SendGrid
import sgMail from "@sendgrid/mail";

sgMail.setApiKey(process.env.SENDGRID_API_KEY!);

await sgMail.send({
  from:    "hello@yourdomain.com",
  to:      "delivered@messagebird.dev",
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});
bird.ts
Bird
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

await bird.email.send({
  from:    "hello@yourdomain.com",
  to:      ["delivered@messagebird.dev"],
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});

Eine Nachricht oder hundert, ein Call.

Fassen Sie bis zu 100 unabhängige Nachrichten in einem Request zusammen, jede mit eigenem Empfänger und eigenen Variablen. Der Batch wird als Einheit validiert: Eine fehlerhafte Nachricht lehnt den Aufruf mit einem 422 ab, damit Sie nie halb versenden. Ein einzelner Idempotency-Key macht den gesamten Request sicher wiederholbar.

digest.ts
202 · batch
import { BirdClient } from "@messagebird/sdk";
import { render } from "@react-email/render";
import { Digest } from "./emails/digest";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const messages = await Promise.all(
  users.map(async (u) => ({
    from:    "Acme <hello@yourdomain.com>",
    to:      [u.email],
    subject: "Your weekly digest",
    html:    await render(<Digest user={u} />),
  })),
);

const { data: batch, error } = await bird.email
  .sendBatch(messages, { idempotencyKey: `digest-${runId}` })
  .safe();

if (error) throw error;
console.log(`queued ${batch.data.length} messages`);

Hängen Sie Ihren eigenen Kontext an jeden Versand an.

Tags sind eine erstklassige, filterbare Dimension: Schlüsseln Sie Zustellung und Engagement nach Kampagne, Template oder Experiment in der Statistik-API auf (bis zu 20 pro Nachricht). Metadaten sind beliebiges JSON, bis zu 2 KB, das bei jedem Lesen und jedem Webhook unverändert zurückkommt – so reisen Ihre eigenen IDs mit der Nachricht mit.

tagged.ts
await bird.email.send({
  from:     "Acme <hello@yourdomain.com>",
  to:       ["delivered@messagebird.dev"],
  subject:  "Your invite is ready",
  html:     "<p>Welcome aboard, Ada.</p>",
  tags:     [{ name: "campaign", value: "spring-2026" }],
  metadata: { user_id: "u_2bX91", order_id: "ord_5512" },
});

Verfolge jede Nachricht über ihren gesamten Lebenszyklus.

Ein Versand gibt sofort 202 zurück; das Ergebnis kommt als Webhook pro Empfänger. Verifizieren Sie eine Signatur und verzweigen Sie nach Typ: derselbe Umschlag, den Sie bereits für SMS, Voice und WhatsApp verarbeiten.

app/api/webhooks/bird/route.ts
signed
import { bird } from "@/lib/bird";

export async function POST(req: Request) {
  const event = bird.webhooks.unwrap(
    await req.text(),
    Object.fromEntries(req.headers),
  );

  switch (event.type) {
    case "email.delivered":
      await markDelivered(event.data.email_id);
      break;
    case "email.bounced":
      await flag(event.data.recipient, event.data.bounce_type);
      break;
  }

  return new Response(null, { status: 204 });
}

Hard Bounces und Beschwerden aktualisieren die Empfänger-Sperrlisten. Abmeldungen erfassen eine Opt-out-Präferenz. Diese Einträge werden beim Verarbeiten späterer Sendungen geprüft.

  • email.acceptedDer Versand wurde akzeptiert und wird für die Zustellung vorbereitet.
  • email.processedIn der Warteschlange für den Mailserver des Empfängers.
  • email.deliveredDer Mailserver des Empfängers hat die Nachricht akzeptiert.
  • email.deferredVorübergehend abgelehnt – wir versuchen es erneut.
  • email.bouncedDauerhaft fehlgeschlagen: Bounce-Typ und SMTP-Code in der Payload.
  • email.openedDer Empfänger hat die Nachricht geöffnet. Kann mehrfach ausgelöst werden.
  • email.clickedDer Empfänger hat auf einen getrackten Link geklickt.
  • email.complainedDer Empfänger hat die Nachricht als Spam gemeldet.
  • email.unsubscribedDer Empfänger hat sich über einen getrackten Abmeldelink abgemeldet.

Testen Sie jedes Ergebnis, bevor Sie live gehen.

In der Sandbox bestimmt die Empfängeradresse das Ergebnis – nicht Ihr Kontostatus. Senden Sie an delivered@messagebird.dev für eine saubere Zustellung, oder an bounce@, softbounce@, deferred@, complaint@ und suppressed@, um jeden Fehlerpfad durch die echte Pipeline und die echten Webhooks zu durchlaufen. Keine Domain zu verifizieren, kein Risiko für Ihre Reputation. Die Produktionsumgebung ist bewusst geschützt: Sie verifizieren zuerst eine Domain, und eine neue Domain oder dedizierte IP durchläuft ein Warmup, bevor sie das volle Volumen übernimmt.

Geh tiefer in die Docs.

Lesen Sie den Versandleitfaden, binden Sie E-Mail-Events und Webhooks an, oder folgen Sie – falls Sie von einem anderen Anbieter kommen – einem Migrationsleitfaden für SendGrid, SES, Mailgun oder Resend.

Testen Sie das Verhalten rund um den Versand.

Ein funktionierender Versandaufruf ist der Anfang einer Integration. Simulieren Sie Bounces und Beschwerden, behandeln Sie doppelte Webhook-Zustellungen und entscheiden Sie, wie Ihre Anwendung Nachrichten plant oder Antworten empfängt.

In die Praxis umsetzen.

Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.

Übung ausprobieren und ein Implementierungs-Briefing erhalten

Fragen zum E-Mail-Versand

Kann ich sowohl transaktionale als auch Marketing-E-Mails senden?
Ja, beide laufen über dieselbe Send-API. Der einzige Unterschied ist das Feld „category", das bestimmt, wie Suppressions und Abmeldungen angewendet werden. Wählen Sie transactional für Passwortzurücksetzungen und Belege und marketing für Kampagnen.
Was passiert, wenn eine Anfrage ein Timeout hat und ich sie erneut sende?
Senden Sie bei jedem logischen Versand einen Idempotency-Key-Header mit. Wenn die erste Anfrage erfolgreich war, Sie aber die Antwort nie erhalten haben, liefert ein erneutes Senden mit demselben Schlüssel das ursprüngliche Ergebnis mit einem Idempotency-Replay-Header zurück, anstatt die E-Mail doppelt zu senden.
Kann ich einen Versand für später planen?
Setzen Sie scheduled_at auf einen Zeitpunkt zwischen 30 Sekunden und 30 Tagen in der Zukunft. Der Versand wird sofort als akzeptiert zurückgegeben und bleibt geplant, bis er ausgeht – Sie können ihn jederzeit vorher abbrechen.
Kann ich Dateien anhängen?
Ja, als Base64 im attachments-Array. Um ein Bild inline anzuzeigen, geben Sie ihm eine content_id und referenzieren Sie diese in Ihrem HTML mit cid:. Halten Sie die Rohdateien bei oder unter 15 MB, damit die Nachricht nach der Kodierung noch in das 20-MB-Limit passt, und beachten Sie, dass ausführbare und skriptbasierte Content-Typen vor dem Senden abgelehnt werden.

Senden Sie Ihre erste Nachricht mit Bird.

Erstellen Sie einen API-Schlüssel, testen Sie Ihren Versand und verbinden Sie Zustellereignisse. Bauen Sie auf der Integration auf, die Sie bereits ausführen können.

Erstellen Sie Ihr Konto, dann erstellen Sie einen API-Schlüssel und senden Sie eine Testnachricht.

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Sie nutzen Claude Code, Cursor oder Codex? Kopieren Sie einen Setup-Prompt und Ihr Agent installiert die Bird CLI und Skills für Sie. Wählen Sie Ihren:

Cursor