Email

Jak wysyłać e-maile na Vercel

Na Vercel wysyłasz e-maile przez HTTP API, a nie przez SMTP. Vercel uruchamia Twój kod w funkcjach serverless i edge, a te środowiska uruchomieniowe są zbudowane wokół krótkotrwałej obsługi żądań HTTP, nie długotrwałych połączeń TCP. Środowisko Edge w szczególności nie ma modułu Node net, więc biblioteka SMTP nie może nawet otworzyć połączenia. Żądanie HTTPS do API e-mail idealnie pasuje do tego modelu. Oto konfiguracja Next.js.

Dlaczego SMTP nie działa dobrze na Vercel?

Funkcje serverless są zaprojektowane tak, aby szybko się uruchamiać, obsłużyć żądanie i zakończyć działanie. Utrzymywanie otwartego połączenia SMTP (z jego wieloetapowym uzgadnianiem) działa wbrew temu, a funkcja może zostać zamrożona lub usunięta w trakcie komunikacji. Środowisko Edge jest jeszcze bardziej restrykcyjne: działa w środowisku zgodnym ze standardami webowymi, bez modułów sieciowych Node, więc biblioteki takie jak Nodemailer, które zależą od net i tls, w ogóle tam nie zadziałają. Wysyłanie przez HTTPS omija oba problemy, ponieważ fetch to dokładnie to, do czego te środowiska są stworzone.

Jak wysłać e-mail z Route Handlera Next.js?

Utwórz Route Handler w app/api/send/route.ts. Odczytuje on klucz API ze zmiennej środowiskowej i wywołuje API e-mail. Za pomocą Bird Node SDK:

// app/api/send/route.ts
import { BirdClient } from "@messagebird/sdk";

export const runtime = "nodejs";

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

export async function POST(request: Request) {
  const { to } = await request.json();

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

  if (error) {
    return Response.json({ error: error.message }, { status: 502 });
  }

  return Response.json({ id: data.id });
}

Ustaw BIRD_API_KEY w zmiennych środowiskowych projektu Vercel, aby była dostępna w czasie wykonania i nigdy nie trafiła do repozytorium. Adres sandbox delivered@bird.dev zawsze przyjmuje pocztę, co ułatwia weryfikację pierwszego wdrożenia.

Środowisko Edge czy Node?

Linia export const runtime określa, które środowisko uruchamia Twój handler. Ponieważ SDK i fetch działają w obu, możesz wybrać w zależności od pozostałych potrzeb:

Środowisko NodeŚrodowisko Edge
DomyślneTakWymaga włączenia
API Node (net, fs)DostępneNiedostępne
Zimny startWolniejszySzybszy
Biblioteki SMTPDziałają, ale zawodnie na serverlessNie działają w ogóle
HTTP e-mail API (fetch)DziałaDziała

Jeśli wywołujesz tylko HTTP API, środowisko Edge zapewni Ci szybsze zimne starty. Jeśli w innym miejscu handlera korzystasz z pakietu dostępnego tylko w Node, zostań przy Node. Tak czy inaczej wysyłka e-maila to to samo wywołanie oparte na fetch.

Wyślij za pomocą Bird

Powyższy handler już używa kanonicznego fragmentu kodu. Schemat jest taki sam wszędzie tam, gdzie uruchamiasz JavaScript:

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

Jeśli budujesz treści e-maili jako komponenty, React Email renderuje je do HTML-a, którego oczekuje to wywołanie. Szerszy obraz tego, gdzie umieścić kod wysyłki e-maili, znajdziesz w artykule wysyłanie e-maili za pomocą JavaScriptu.

FAQ

Czy mogę używać Nodemailera na Vercel?

W środowisku Node załaduje się, ale utrzymywanie otwartego połączenia SMTP jest zawodne w krótkotrwałych funkcjach serverless. W środowisku Edge nie zadziała, ponieważ nie ma modułu Node net. HTTP API omija oba problemy.

Gdzie przechowywać klucz API na Vercel?

W zmiennych środowiskowych projektu, ustawianych w panelu Vercel lub przez CLI. Handler odczytuje go za pomocą process.env, więc pozostaje na serwerze i poza repozytorium.

Środowisko Edge czy Node do wysyłania e-maili?

Oba działają dla wywołania HTTP API. Edge ma szybsze zimne starty; Node jest wymagany, jeśli Twój handler korzysta również z pakietów dostępnych tylko w Node.

Vercel i HTTP e-mail API to naturalne połączenie. Przegląd produktu e-mail i przewodnik po wysyłaniu e-maili omawiają resztę zagadnień.

Szczytowy ruch i odzyskiwanie zaległości określają przepustowość wysyłki, jakiej Twoja aplikacja potrzebuje od usługi e-mail transakcyjnych.

Buduj na tej samej sieci.

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

Twój kolejny pomysł.
Gotowy do połączenia.