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ślne | Tak | Wymaga włączenia |
API Node (net, fs) | Dostępne | Niedostępne |
| Zimny start | Wolniejszy | Szybszy |
| Biblioteki SMTP | Działają, ale zawodnie na serverless | Nie działają w ogóle |
HTTP e-mail API (fetch) | Działa | Dział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.