Email

Wysyłanie e-maili za pomocą Nodemailera

Nodemailer to standardowa biblioteka do wysyłania e-maili z serwera Node.js. Tworzysz transport wskazujący na serwer SMTP, a potem wywołujesz sendMail z polami wiadomości. Biblioteka obsługuje pulę połączeń, załączniki i treści HTML. Poniższy kod to minimum potrzebne do wysłania prawdziwej wiadomości, plus sztuczka testowa, którą większość osób pomija.

Jak zainstalować i skonfigurować Nodemailera?

Zainstaluj go z npm:

npm install nodemailer

Transport przechowuje dane połączenia SMTP. Wskazujesz hosta i port, a potem przekazujesz dane uwierzytelniające w auth:

import nodemailer from "nodemailer";

const transporter = nodemailer.createTransport({
  host: "smtp.example.com",
  port: 587,
  secure: false, // true for port 465, false for 587 (STARTTLS)
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS,
  },
});

Port 587 z secure: false używa STARTTLS, który po uzgodnieniu połączenia przełącza je na TLS. Port 465 wymaga secure: true. Przechowuj nazwę użytkownika i hasło w zmiennych środowiskowych, nigdy w kodzie źródłowym.

Jak wysłać wiadomość?

Wywołaj sendMail z kopertą i treścią. Zwraca promise, więc opakuj wywołanie w async/await z blokiem try/catch, żeby nieudane wysłanie nie zawiesiło procesu:

async function main() {
  try {
    const info = await transporter.sendMail({
      from: '"Your App" <you@yourdomain.com>',
      to: "recipient@example.org",
      subject: "Your receipt",
      text: "Thanks for your order. This is the plain-text version.",
      html: "<p>Thanks for your order.</p>",
    });
    console.log("Sent:", info.messageId);
  } catch (err) {
    console.error("Send failed:", err);
  }
}

main();

Zawsze wysyłaj zarówno text, jak i html. Niektóre klienty renderują wersję tekstową, a wiadomość bez alternatywy tekstowej jest gorzej oceniana przez filtry antyspamowe.

Jak dodać załączniki?

Przekaż tablicę attachments. Każdy wpis może czytać ze ścieżki, bufora lub strumienia:

await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "recipient@example.org",
  subject: "Your invoice",
  text: "Invoice attached.",
  attachments: [
    {
      filename: "invoice.pdf",
      path: "./invoices/invoice-1042.pdf",
    },
    {
      filename: "note.txt",
      content: "Generated at runtime, no file needed.",
    },
  ],
});

Jak testować bez wysyłania prawdziwych wiadomości?

Nodemailer zawiera Ethereal, fikcyjną usługę SMTP, która przechwytuje wiadomości zamiast je dostarczać. Dla każdego wysłania dostajesz URL podglądu, co jest idealne przy lokalnym developmencie:

const testAccount = await nodemailer.createTestAccount();

const transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",
  port: 587,
  secure: false,
  auth: {
    user: testAccount.user,
    pass: testAccount.pass,
  },
});

const info = await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "test@example.org",
  subject: "Preview only",
  text: "This never leaves Ethereal.",
});

console.log("Preview:", nodemailer.getTestMessageUrl(info));

Ethereal służy do sprawdzania tego, co zbudowałeś. Nie powie ci, czy prawdziwa skrzynka odbiorcza zaakceptowałaby tę wiadomość.

Wyślij za pomocą Bird

SMTP działa, ale uruchomienie go w produkcji oznacza obsługę serwera pocztowego (lub wynajęcie takiego), rozgrzewanie adresów IP i samodzielne pilnowanie reputacji. HTTP API przejmuje to za ciebie. Nie ma gniazda SMTP do utrzymywania, a dostawca zarządza infrastrukturą dostarczalności. Z Bird e-mail API ta sama wysyłka to jedno wywołanie:

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

Adres sandboxowy delivered@bird.dev zawsze przyjmuje pocztę, więc możesz potwierdzić poprawność konfiguracji, zanim wyślesz do prawdziwego odbiorcy. Platformy serverless to najoczywistszy przypadek użycia tego podejścia, ponieważ ich środowiska uruchomieniowe często w ogóle nie potrafią utrzymać otwartych połączeń SMTP. Zobacz jak wysyłać e-maile na Vercelu, a także szerszy przewodnik po wysyłaniu e-maili w JavaScripcie, który pokazuje, gdzie w stosie technologicznym powinien znajdować się kod obsługujący e-mail.

FAQ

Czy Nodemailer działa w przeglądarce?

Nie. Nodemailer to biblioteka serwerowa i zależy od modułów sieciowych Node. Przeglądarki nie mogą otwierać połączeń SMTP, a umieszczenie danych uwierzytelniających w kodzie klienckim ujawniłoby je. Wysyłaj z backendu.

Dlaczego wysyłać zarówno tekst, jak i HTML?

Wiadomość multipart pozwala każdemu klientowi wybrać część, którą potrafi wyrenderować, a alternatywa tekstowa poprawia ocenę wiadomości przez filtry antyspamowe. Pominięcie text to częsta przyczyna trafiania e-maili do spamu.

Wybrać SMTP czy HTTP API?

SMTP sprawdza się przy małym wolumenie i narzędziach wewnętrznych. Do wysyłki produkcyjnej na dużą skalę HTTP API eliminuje serwer, który w przeciwnym razie musiałbyś obsługiwać, i zapewnia obsługę dostarczalności. Wiele zespołów używa Nodemailera w developmencie, a API w produkcji.

Nodemailer to solidny wybór do komunikacji SMTP z poziomu Node. Jeśli wolisz nie prowadzić serwera pocztowego za nim, przeczytaj przewodnik po wysyłaniu e-maili, żeby zobaczyć alternatywę API od początku do końca.

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.