Wysyłka email
Jedno API dla każdego emaila, który wysyłasz.
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.
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..."You can sign in any time at bird.com/login.
Your test API key is on your dashboard, ready to send.
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ę.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
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>",
});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ć.
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ą.
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.
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?+
Czy obsługujecie szablony React Email?+
Ile emaili mogę wysłać w jednym żądaniu?+
Co się stanie, jeśli żądanie przekroczy limit czasu i je ponowię?+
Jakie są limity szybkości?+
Jak testować bez wysyłania prawdziwego emaila?+
Reszta platformy Email
Jedno API, jeden zestaw kluczy. Poznaj pozostałe funkcje.
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.