Nodemailer è la libreria standard per inviare email da un server Node.js. Crei un trasporto puntato a un server SMTP, poi chiami sendMail con i campi del messaggio. Gestisce connection pooling, allegati e corpi HTML. Il codice qui sotto è il minimo necessario per inviare un messaggio reale, più il trucco per i test che la maggior parte delle persone non conosce.
Come si installa e configura Nodemailer?
Installalo da npm:
npm install nodemailer
Un trasporto contiene i dettagli della connessione SMTP. Lo punti a un host e una porta, poi passi le credenziali sotto 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,
},
});
La porta 587 con secure: false usa STARTTLS, che aggiorna la connessione a TLS dopo l'handshake. La porta 465 richiede secure: true. Tieni username e password in variabili d'ambiente, mai nel codice sorgente.
Come si invia un messaggio?
Chiama sendMail con l'envelope e il contenuto. Restituisce una promise, quindi racchiudilo in async/await con un try/catch così un invio fallito non blocca il processo:
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();
Invia sempre sia text che html. Alcuni client mostrano la parte in testo semplice, e un messaggio senza alternativa testuale tende a ottenere un punteggio peggiore dai filtri antispam.
Come si aggiungono gli allegati?
Passa un array attachments. Ogni elemento può leggere da un percorso, un buffer o uno stream:
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.",
},
],
});
Come si testa senza inviare email reali?
Nodemailer include Ethereal, un servizio SMTP fittizio che cattura i messaggi invece di consegnarli. Ottieni un URL di anteprima per ogni invio, ideale per lo sviluppo locale:
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 serve a ispezionare ciò che hai costruito. Non ti dice nulla su come una casella di posta reale tratterebbe il messaggio.
Invialo con Bird
SMTP funziona, ma usarlo in produzione significa gestire un mail server (o affittarne uno), scaldare gli IP e controllare la reputazione da soli. Un HTTP API si occupa di tutto questo. Non c'è nessun socket SMTP da tenere aperto e il provider gestisce l'infrastruttura di deliverability. Con l'Bird email API lo stesso invio è una singola chiamata:
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();
L'indirizzo sandbox delivered@bird.dev accetta sempre la posta, così puoi verificare il collegamento prima di puntare a un destinatario reale. Le piattaforme serverless sono il caso più evidente per questo approccio, dato che i loro runtime spesso non riescono a mantenere aperte le connessioni SMTP. Consulta come inviare email su Vercel per questa strada e la panoramica più ampia inviare email con JavaScript per capire dove collocare il codice email nel tuo stack.
FAQ
Nodemailer funziona nel browser?
No. Nodemailer è una libreria server-side e dipende dai moduli di rete di Node. I browser non possono aprire connessioni SMTP e inserire le credenziali nel codice client le esporrebbe. Invia da un backend.
Perché inviare sia testo che HTML?
Un messaggio multipart permette a ogni client di scegliere la parte che può renderizzare, e l'alternativa in testo semplice migliora la lettura del messaggio da parte dei filtri antispam. Omettere text è una causa frequente di email che finiscono nello spam.
Meglio usare SMTP o un HTTP API?
SMTP va bene per volumi bassi e strumenti interni. Per l'invio in produzione su larga scala, un HTTP API elimina il server che altrimenti dovresti gestire e integra la gestione della deliverability. Molti team usano Nodemailer in sviluppo e un API in produzione.
Nodemailer è un'ottima scelta per parlare SMTP da Node. Quando preferisci non gestire il mail server dietro di esso, leggi la guida all'invio di email per vedere l'alternativa API dall'inizio alla fine.