Wysyłka email

Jedno API dla każdego emaila, który wysyłasz.

Skonfiguruj w:

Transakcyjne czy marketingowe, jedna wiadomość czy sto, wysyłane przez to samo Email API, z wbudowaną idempotencją, listą wykluczeń i webhookami. Przekaż surowy HTML lub wyrenderuj swoje szablony React Email.

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..."

Wyślij pierwszy email w pięć minut.

W języku, którego już używasz.

Wysyłka to rdzeń Bird Email API. Pierwszą wysyłkę możesz skierować na zatwierdzony adres testowy (delivered@messagebird.dev), więc całą platformę (wysyłki, webhooki, listę wykluczeń) przetestujesz, zanim zweryfikujesz domenę.

1
2
3
4
5
6
7
8
9
10
import { BirdClient } from "@messagebird/sdk";

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

const { data, error } = await bird.email.send({
  from:    "you@yourdomain.com",
  to:      ["delivered@bird.dev"],
  subject: "Hello from Node",
  html:    "<p>It works.</p>",
}).safe();

Pięć rzeczy, których nie budujesz sam.

Ten sam kontrakt na każdym kanale Bird.

  1. 01

    Transakcyjny i marketingowy.

    Ten sam endpoint wysyła reset hasła i kampanię. Pole kategorii decyduje, jak stosowane są wykluczenia i wypisy z subskrypcji.

  2. 02

    Szablony po swojemu.

    Przekaż surowy HTML albo wyrenderuj szablony React Email do HTML w swojej aplikacji i wyślij wynik. Twój zestaw narzędzi bez zmian.

  3. 03

    Wysyłka wsadowa do 100.

    Do 100 niezależnych wiadomości na wywołanie, każda z własnym odbiorcą i zmiennymi, walidowanych jako jedna całość, więc nigdy nie wysyłasz połowicznie.

  4. 04

    Idempotentny z kontraktu.

    Każda wysyłka przyjmuje klucz idempotencji, więc ponowione żądanie po przekroczeniu limitu czasu zwraca pierwotny wynik zamiast wysyłać podwójnie.

  5. 05

    Webhook przy każdej zmianie stanu.

    Przyjęto, dostarczono, otwarto, kliknięto, odbicie, skarga. Każde zdarzenie podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne, ta sama koperta na każdym kanale.

Już wysyłasz gdzie indziej? Przejdź w jedno popołudnie.

Wywołanie, które już wykonujesz, ledwo się zmienia: podmień klienta, zachowaj szablony, skieruj webhooki na jeden endpoint. Przewodniki migracji obejmują SendGrid, Amazon SES, Mailgun i Resend.

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

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

await sgMail.send({
  from:    "hello@bird.com",
  to:      "ada@example.com",
  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@bird.com",
  to:      ["ada@example.com"],
  subject: "Your invite is ready",
  html:    "<p>Welcome aboard, Ada.</p>",
});

Jedna wiadomość czy sto, jedno wywołanie.

Złącz wsadowo do 100 niezależnych wiadomości w jednym żądaniu, każda z własnym odbiorcą i zmiennymi. Wsad jest walidowany jako całość: jedna błędna wiadomość odrzuca wywołanie z kodem 422, więc nigdy nie wyślesz połowicznie. Pojedynczy klucz idempotencji sprawia, że całe żądanie można bezpiecznie ponowić.

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:    "Bird <hello@bird.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`);

Dołącz własny kontekst do każdej wysyłki.

Tagi to pełnoprawny, filtrowalny wymiar: dziel dostarczalność i zaangażowanie według kampanii, szablonu lub eksperymentu w stats API (do 20 na wiadomość). Metadane to dowolny JSON, do 2 KB, który wraca nietknięty przy każdym odczycie i webhooku, więc Twoje własne identyfikatory podróżują razem z wiadomością.

tagged.ts
await bird.email.send({
  from:     "Bird <hello@bird.com>",
  to:       ["ada@example.com"],
  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" },
});

Obserwuj każdą wiadomość przez całe jej życie.

Wysyłka zwraca natychmiast 202; wynik przychodzi jako webhook dla każdego odbiorcy. Zweryfikuj jeden podpis, rozgałęź według typu: ta sama koperta, którą już obsługujesz dla SMS, voice i WhatsApp.

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

Twarde odbicia, skargi i wypisy z subskrypcji również automatycznie aktualizują Twoją listę wykluczeń, więc błędny adres nigdy nie kosztuje Cię reputacji dwukrotnie.

  • email.acceptedPrzyjęta przez API i umieszczona w kolejce do dostarczenia.
  • email.processedWygenerowana i przekazana do potoku wysyłki.
  • email.deliveredOdbierający serwer pocztowy przyjął wiadomość.
  • email.deferredPrzejściowy błąd, który Bird ponawia automatycznie.
  • email.bouncedTrwały błąd: typ odbicia i kod SMTP w ładunku.
  • email.openedZaładowano piksel śledzący (liczą się otwarcia bez wstępnego pobrania).
  • email.clickedKliknięto śledzony link.
  • email.complainedOdbiorca zgłosił wiadomość jako spam.
  • email.unsubscribedOdbiorca zrezygnował z subskrypcji za pomocą śledzonego linku w treści wiadomości.

Przetestuj każdy wynik, zanim wejdziesz na żywo.

W trybie testowym to adres decyduje o wyniku, a nie stan Twojego konta. Wyślij na delivered@messagebird.dev, by uzyskać czyste dostarczenie, albo na bounce@, complaint@ i suppressed@, by uruchomić każdą ścieżkę błędu przez prawdziwy potok i webhooki. Żadnej domeny do weryfikacji, żadnego ryzyka dla reputacji. Wysyłka produkcyjna jest reglamentowana tak, jak być powinna: najpierw weryfikujesz domenę, a nowa domena lub dedykowane IP rozgrzewa reputację, zanim zacznie obsługiwać pełny wolumen.

Zgłęb temat w dokumentacji.

Przeczytaj przewodnik po wysyłce, podłącz zdarzenia e-mail i webhooki, a jeśli przechodzisz od innego dostawcy, skorzystaj z przewodnika migracji z SendGrid, SES, Mailgun lub Resend.

FAQ o wysyłce

Czy mogę wysyłać zarówno email transakcyjny, jak i marketingowy?+
Tak. Oba przechodzą przez to samo API wysyłki; jedyną różnicą jest pole category, które decyduje o tym, jak stosowane są wykluczenia i rezygnacje z subskrypcji. Wybierz transactional dla resetów haseł i potwierdzeń, marketing dla kampanii.
Czy obsługujecie szablony React Email?+
Wyrenderuj swoje szablony React Email do HTML w aplikacji — funkcja render z @react-email/render działa bez zmian — i przekaż wynik jako treść html. Nic w Twoim łańcuchu narzędzi do szablonów się nie zmienia.
Ile emaili mogę wysłać w jednym żądaniu?+
Do 100 niezależnych wiadomości na wywołanie wsadowe, każda z własnym odbiorcą, tematem i zmiennymi. Partia jest walidowana jako całość, więc jedna nieprawidłowa wiadomość odrzuca całe wywołanie z błędem 422 — nigdy nie wysyłasz połowicznie. Pojedyncza wiadomość obejmuje od 1 do 50 odbiorców w polach to, cc i bcc.
Co się stanie, jeśli żądanie przekroczy limit czasu i je ponowię?+
Wysyłaj nagłówek Idempotency-Key z każdą logiczną wysyłką. Jeśli pierwotne żądanie się powiodło, ale odpowiedź została utracona, ponowienie z tym samym kluczem zwraca pierwotny wynik (oznaczony nagłówkiem Idempotency-Replay) zamiast ponownej wysyłki.
Jakie są limity szybkości?+
Pojedyncze wysyłki i partie mają osobne limity — w planie darmowym 10 pojedynczych wysyłek i 5 wywołań wsadowych na minutę (5 × 100 = 500 wiadomości/min), rosnące do 1,000 wysyłek i 100 wywołań wsadowych na minutę w planie Growth. Limity liczą żądania, a nie odbiorców, więc to grupowanie jest dźwignią wolumenu.
Jak testować bez wysyłania prawdziwego emaila?+
Wyślij na adres testowy, taki jak delivered@messagebird.dev — wynik jest określany przez adres, a nie przez stan Twojego konta — dzięki czemu możesz przećwiczyć wysyłki, webhooki i wykluczenia, zanim zweryfikujesz domenę. Adresy takie jak bounce@ i complaint@ symulują te wyniki w prawdziwym potoku.

Około 40% komercyjnej poczty e-mail na świecie już działa na Bird.

E-maile transakcyjne i marketingowe na infrastrukturze, którą prowadzimy od dekady. Wysyłka to jedna z możliwości Bird Email API: dostarczalność, dedykowane adresy IP, lista wykluczeń i analityka są w komplecie.

Zacznij od jednego kanału.
Dodaj kolejne, gdy będziesz gotowy.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i weryfikacji nadawcy.

Używasz Claude Code, Cursor lub Codex? Skopiuj prompt konfiguracyjny, a Twój agent zainstaluje za Ciebie Bird CLI i umiejętności. Wybierz swój: