SMTP per Node.js — posta dalla tua applicazione che arriva
Node.js non ha una funzione di posta integrata; praticamente ogni applicazione usa Nodemailer. Quella libreria rende semplice l'invio, ma non dice nulla sulla recapitabilità: quella dipende interamente dal server SMTP attraverso cui invii.
Nodemailer lavora con un transport. Crei un transport SMTP con i dati del tuo relay — host, porta, cifratura e credenziali — e il resto del tuo codice resta invariato. Ciò che oggi parte da un server locale o da un account di prova, domani passa da 2mail.
Perché senza relay le cose vanno storte
Un'applicazione Node.js invia tipicamente posta nel momento in cui conta: un codice di verifica, un recupero password, la conferma di una prenotazione. Sono messaggi attesi entro pochi secondi. Se partono da un server senza reputazione, una parte non arriva o arriva tardi — e l'utente clicca su "invia di nuovo" finché non rinuncia.
Configurare l'SMTP in Node.js
Recupera i dati
Accedi al tuo account 2mail e recupera lì il tuo server SMTP, il nome utente e la password.
Inserisci in Node.js
Crea in Nodemailer un transport SMTP. Indica come host il server SMTP di 2mail e come porta la 587, e disattiva l'opzione secure così che la connessione venga elevata tramite STARTTLS. Sotto auth inserisci nome utente e password del tuo accesso 2mail. Leggi quei dati da variabili d'ambiente, non dal codice. Nodemailer dispone di un metodo verify per controllare la connessione prima di inviare la prima e-mail reale — usalo.
Autentica il dominio
Assicurati che SPF, DKIM e DMARC siano configurati correttamente per il tuo dominio, così i destinatari possono verificare che il messaggio provenga da te.
Prova
Invia dalla tua piattaforma un messaggio di prova a un indirizzo presso un grande provider e verifica che arrivi nella posta in arrivo e non nella cartella spam.
I campi richiesti da Node.js
Ogni piattaforma li chiama in modo leggermente diverso, ma si tratta sempre degli stessi cinque. I valori concreti sono legati al tuo account e li trovi nel tuo account 2mail — recuperali da lì, così sei certo di usare quelli giusti.
| Campo | Che cosa inserire |
|---|---|
| Server SMTP (host) | Il nome del server dal tuo account 2mail. |
| Porta | La porta corrispondente alla cifratura scelta; il tuo account indica quale. |
| Cifratura | TLS. Non inviare mai in chiaro — altrimenti le tue credenziali viaggiano leggibili sulla rete. |
| Nome utente | Il login SMTP del tuo account 2mail. |
| Password | La password corrispondente. Non usare mai la password della casella di posta di un collaboratore. |
Configurazione SMTP per Node.js nel codice
Esempi funzionanti per la porta 587 con STARTTLS, pronti da copiare. Sostituisci l'indirizzo mittente con un indirizzo del tuo dominio e verifica nome del server e login nel tuo account 2mail. La password va in una variabile d'ambiente — mai nel codice e mai nel controllo di versione.
Nodemailer: createTransport per la porta 587
Un solo transport, creato all'avvio e riutilizzato ovunque. La combinazione di secure: false e requireTLS: true è quella giusta per la porta 587: la connessione parte in chiaro, viene elevata a TLS tramite STARTTLS, e Nodemailer si rifiuta di proseguire se quel passaggio fallisce. Nome utente e password arrivano da variabili d'ambiente.
// mailer.js
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'relay.2mail.eu',
port: 587,
secure: false, // 587 starts plain and upgrades with STARTTLS; true is for port 465 only
requireTLS: true, // refuse to continue if the upgrade to TLS fails
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
});
module.exports = transporter; Verificare la connessione con verify() e una prima e-mail
verify() esegue l'intera autenticazione senza inviare nulla e solleva un errore con un code da cui riconosci la causa — vedi più avanti la tabella dei messaggi di errore. Nell'invio reale registra il messageId e la risposta del server: è la tua prova che il relay ha accettato il messaggio.
const transporter = require('./mailer');
async function main() {
// Checks DNS, port, TLS and login without sending anything.
await transporter.verify();
const info = await transporter.sendMail({
from: '"Example" <noreply@example.com>',
to: 'you@example.org',
subject: 'SMTP test',
text: 'Sent through the 2mail SMTP relay.',
});
console.log(info.messageId, info.response);
}
main().catch((err) => {
console.error(err.code, err.message);
process.exit(1);
}); Volumi maggiori: connessioni in pool
Se la tua applicazione invia a picchi — un giro di promemoria, una serie di avvisi — fai in modo che Nodemailer tenga aperto un piccolo numero di connessioni invece di crearne una nuova per ogni messaggio. È più veloce e agli occhi del relay non sembra un abuso.
const transporter = nodemailer.createTransport({
pool: true, // keep connections open and reuse them
maxConnections: 3,
maxMessages: 100, // per connection, then reconnect
host: 'relay.2mail.eu',
port: 587,
secure: false,
requireTLS: true,
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
}); Quali e-mail invia Node.js
Una volta configurato il relay, tutte queste passano tramite 2mail — non devi configurarle una per una.
Insidie con Node.js
secure e porta devono corrispondere
L'opzione secure non significa "sicuro o non sicuro", ma "TLS dal primo byte". Sulla porta 587 secure deve restare disattivato — STARTTLS arriva subito dopo. Se la attivi comunque, la connessione si blocca o viene interrotta subito, senza un errore chiaro.
Un solo transport, riutilizzato
Crea il transport una volta sola all'avvio e riutilizzalo, invece di crearne uno nuovo per ogni e-mail. In caso di picco — un giro di promemoria, una campagna — apriresti altrimenti centinaia di connessioni insieme, cosa che un relay può leggere come abuso. Nodemailer sa mettere in pool le connessioni; attivalo con volumi maggiori.
Aspetta il risultato e registralo
L'invio è asincrono. Chi non attende la risposta del server o non la registra, non vedrà mai che un messaggio è stato rifiutato. Registra almeno l'id del messaggio e l'eventuale rifiuto, e collega preferibilmente i webhook di 2mail per recapito e bounce, così vedi anche ciò che va storto dopo la consegna.
Messaggi di errore frequenti con Node.js
I messaggi che compaiono quando host, porta, cifratura o login non sono corretti — riportati alla lettera, così li riconosci nel tuo log, con accanto la causa e la soluzione.
| Messaggio | Causa | Soluzione |
|---|---|---|
Error: connect ECONNREFUSED 127.0.0.1:587 | Nodemailer si connette alla tua macchina invece che al relay. L'opzione host è vuota o undefined — tipicamente una variabile d'ambiente che in produzione non esiste — e allora Nodemailer ripiega su localhost. | Registra le opzioni subito prima di createTransport e verifica che host contenga davvero relay.2mail.eu. |
Error: Connection timeout | Dal relay non arriva alcuna risposta (err.code è ETIMEDOUT). Il traffico in uscita sulla porta 587 viene bloccato dal firewall del tuo provider di hosting, del tuo container o della tua piattaforma cloud. | Prova dalla stessa macchina con openssl s_client -starttls smtp -connect relay.2mail.eu:587 e fai aprire la porta 587 in uscita. |
Error: Invalid login: 535 5.7.8 Error: authentication failed | Il relay rifiuta le credenziali (err.code è EAUTH): nome utente o password errati, oppure una variabile d'ambiente vuota, per cui Nodemailer si autentica senza credenziali o con credenziali vuote. | Controlla SMTP_USERNAME e SMTP_PASSWORD nell'ambiente in cui gira il processo, e usa il login SMTP del tuo account 2mail — non la password di una casella di posta. |
Error: …:SSL routines:ssl3_get_record:wrong version number | secure: true sulla porta 587. Nodemailer inizia allora subito con un handshake TLS, mentre su quella porta il relay si aspetta prima SMTP semplice e passa a TLS solo dopo STARTTLS. | Imposta secure: false e requireTLS: true. La connessione è cifrata altrettanto bene. |
Error: self signed certificate | A presentare il certificato non è il relay ma qualcosa lungo il percorso: un proxy aziendale o un antivirus che intercetta TLS, oppure un server di test locale a cui host punta ancora. | Risolvi il problema lungo il percorso invece di disattivare il controllo. tls: { rejectUnauthorized: false } fa sparire l'errore, ma invia le tue credenziali a chiunque si spacci per il relay. |
Un'altra piattaforma?
L'SMTP è un protocollo standard: ogni sistema che parla SMTP — un CRM, un ERP, un'applicazione proprietaria o un server — può inviare tramite 2mail con gli stessi cinque campi.