Perché WordPress Invia Email che Non Arrivano Mai
WordPress email delivery è il problema più sottovalutato che incontri quando gestisci multipli siti per clienti. Il sito manda email tramite la funzione wp_mail() di PHP, che usa Sendmail sul server. Punto. Nessun SMTP esterno, nessuna coda, nessun retry. Se Sendmail non funziona (e spesso non funziona), l’email sparisce nel vuoto.
Nella nostra esperienza su 50+ siti WordPress gestiti con AgencyPilot, il 40% dei ticket di supporto riguardava email che non arrivavano: form di contatto muti, reset password che finivano in spam, notifiche WooCommerce scomparse. Dopo aver standardizzato la configurazione SMTP su tutti i siti, quei ticket sono scesi al 2%.
TL;DR — Punti Chiave
- WordPress usa
wp_mail()che si appoggia a Sendmail del server: nessun retry, nessuna coda, nessun tracking - Il 40% dei ticket supporto riguardava email mancanti prima di configurare SMTP esterno
- Tre opzioni: SMTP relay (Brevo, SendGrid), API transactional (Postmark, Resend), o plugin (WP Mail SMTP, FluentSMTP)
- SPF, DKIM e DMARC sono obbligatori nel 2026: senza questi, Gmail e Outlook scartano silenziosamente
- Per agenzie con 50+ siti: configurazione centralizzata via WP-CLI o script, non plugin per-sito
Come Funziona wp_mail() e Perché Fallisce
La funzione wp_mail() è un wrapper sottile attorno a mail() di PHP. Quando un utente compila un form Contact Form 7, quando WooCommerce conferma un ordine, quando WordPress manda un link di reset password, tutto passa attraverso questa funzione.
Il problema sta in cosa c’è sotto. mail() di PHP passa il messaggio a Sendmail (o Postfix, o Exim, dipende dal server). Il server tenta di consegnare l’email direttamente al server di destinazione. Funzionava nel 2005. Nel 2026 non funziona più per tre motivi:
- Gmail e Outlook non si fidano della tua IP. Un server shared hosting ha reputation bassa. L’email arriva, finisce in spam, o viene scartata durante la connessione SMTP. Nessun bounce, nessun errore. Silenzio.
- Sendmail non ha coda. Se il server di destinazione è temporaneamente indisponibile, l’email viene persa.
wp_mail()restituiscetrueanche se Sendmail fallisce, perché PHP non controlla il risultato reale della consegna. - Header mancanti o errati. WordPress imposta un
Fromche spesso non corrisponde al dominio. Mancano SPF, DKIM, DMARC. L’email viene rifiutata da Gmail con codice 550 e finisce in una coda Sendmail che nessuno monitora.
Il risultato concreto: il cliente compila un form, non riceve risposta, si arrabbia. Tu apri un ticket, controlli i log Sendmail (se hai accesso SSH), scopri che l’email è stata scartata 8 ore prima. Nel frattempo il cliente ha già mandato tre email di reclamo.
Le Tre Soluzioni per WordPress Email Delivery
Ci sono tre modi per risolvere il problema, dal più semplice al più robusto. Tutti richiedono l’aggiunta di un servizio esterno. Non esiste soluzione “solo WordPress” che funzioni nel 2026.
Soluzione 1: SMTP Relay con Plugin
Il metodo più comune. Installi un plugin (WP Mail SMTP o FluentSMTP) che riconfigura wp_mail() per usare un server SMTP esterno invece di Sendmail locale. Il plugin gestisce autenticazione, crittografia (TLS), e connection timeout.
I servizi SMTP relay più usati nel 2026 per WordPress:
| Servizio | Free Plan | Prezzo Entry | Volume | Note |
|---|---|---|---|---|
| Brevo (ex Sendinblue) | 300/giorno | 25€/mese | 20k/mese | Ottimo rapporto prezzo/volume |
| SendGrid | 100/giorno | $20/mese | 50k/mese | Documentazione eccellente, ownership Twilio |
| MailerSend | 3k/mese | $11/mese | 15k/mese | Drag-and-drop template, API REST |
Configurazione tipica con costanti PHP in wp-config.php (più robusta di un plugin per agenzie):
// wp-config.php — configurazione SMTP via costanti PHP
define('WPMS_ON', true);
define('WPMS_SMTP_HOST', 'smtp-relay.brevo.com');
define('WPMS_SMTP_PORT', 587);
define('WPMS_SMTP_AUTH', true);
define('WPMS_SMTP_USER', 'your-brevo-login@agencypilot.it');
define('WPMS_SMTP_PASS', 'your-brevo-smtp-key');
define('WPMS_SMTP_SECURE', 'tls');
define('WPMS_FROM', 'noreply@clientdomain.it');
define('WPMS_FROM_NAME', 'Nome Cliente');
Questo approccio ha un vantaggio concreto: la configurazione vive in wp-config.php, non nel database. Se devi migrare il sito o ripristinare un backup WordPress, le impostazioni email sopravvivono. Niente da riconfigurare.
Soluzione 2: Transactional Email via API
Il livello superiore. Invece di SMTP, usi un’API REST per inviare email. I vantaggi: latenza più bassa (nessun handshake SMTP), tracking built-in (aperture, click, bounce), gestione automatica di unsubscribe e complaint, rate limiting intelligente.
I servizi API transactional migliori nel 2026:
| Servizio | Free Plan | Prezzo Entry | Latenza Media | Delivery Rate |
|---|---|---|---|---|
| Postmark | 100/mese | $15/mese | ~1.5s | 99.9% |
| Resend | 3k/mese | $20/mese | ~1.2s | 99.8% |
| Amazon SES | 62k/mese (EC2) | $0.10/1k | ~2s | 99.5% |
Per integrare un’API transactional in WordPress, ti serve un MU-plugin. Ecco un esempio reale con Resend:
<?php
// wp-content/mu-plugins/resend-email.php
add_filter('wp_mail', function($args) {
$payload = [
'from' => $args['from'] ?? get_option('admin_email'),
'to' => is_array($args['to']) ? implode(',', $args['to']) : $args['to'],
'subject' => $args['subject'],
'html' => $args['message'],
];
$response = wp_remote_post('https://api.resend.com/emails', [
'headers' => [
'Authorization' => 'Bearer ' . RESEND_API_KEY,
'Content-Type' => 'application/json',
],
'body' => json_encode($payload),
'timeout' => 30,
]);
if (is_wp_error($response)) {
error_log('Resend API error: ' . $response->get_error_message());
return false;
}
return true;
});
Questo MU-plugin pesa 25 righe. Si attiva automaticamente su ogni sito dove lo carichi, non compare nella lista plugin di wp-admin, e non può essere disattivato per errore da un cliente. Per un’agenzia che gestisce 50+ siti, caricare un file via script centralizzato è molto più scalabile di configurare plugin individuali.
Soluzione 3: FluentSMTP con API Integration
FluentSMTP è il compromesso ideale per agenzie che vogliono una soluzione visiva ma senza i limiti di WP Mail SMTP. Supporta sia SMTP che API (Postmark, SendGrid, Brevo, Mailgun, Resend, Amazon SES), ha logging locale delle email inviate, e gestisce bounce e complaint automaticamente.
La funzione che ci interessa di più: logging delle email. Quando un cliente dice “non ho ricevuto l’email”, apri la dashboard FluentSMTP e vedi esattamente cosa è successo: inviata alle 14:03, consegnata alle 14:03, aperta alle 14:05. Se è fallita, vedi il codice errore SMTP e il messaggio di bounce.
Per agenzie con molti siti, FluentSMTP salva la configurazione nel database (non in wp-config.php), il che significa che devi riconfigurarlo dopo ogni migrazione. Noi usiamo la configurazione via wp-config.php quando possibile, e FluentSMTP quando serve la dashboard di logging.
SPF, DKIM e DMARC: Autenticazione Email Obbligatoria
Configurare un servizio SMTP o API senza configurare SPF, DKIM e DMARC è come mettere una serratura nuova sulla porta ma lasciare la finestra aperta. Gmail e Outlook nel 2026 scartano silenziosamente le email non autenticate. Non mandano nemmeno in spam. Le scartano durante la connessione.
SPF (Sender Policy Framework)
SPF è un record DNS TXT che dice quali server possono inviare email per il tuo dominio. Senza SPF, Gmail assume che chiunque possa mandare email come te. Con SPF, solo i server autorizzati passano.
Record SPF per un dominio che usa Brevo SMTP:
; DNS TXT record — SPF per Brevo
@ IN TXT "v=spf1 include:_spf.brevo.com ~all"
La tilde (~all) significa “softfail”: email non autorizzate vengono marcate ma non scartate. Per produzione, dopo aver testato, passa a -all (hardfail) per scartare definitivamente. Non usare +all mai: equivale a nessun SPF.
DKIM (DomainKeys Identified Mail)
DKIM aggiunge una firma crittografica alle email. Il server mittente firma ogni email con una chiave privata, e il server destinatario verifica la firma con la chiave pubblica pubblicata nel DNS. Se qualcuno intercetta e modifica l’email, la firma non coincide più.
Configurazione DKIM per Brevo:
; DNS TXT record — DKIM per Brevo
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ..."
; Brevo fornisce la chiave pubblica nella dashboard
Ogni servizio ha il suo record DKIM. Non puoi usare lo stesso per Brevo e SendGrid. Se usi due servizi (uno per transactional, uno per newsletter), configura due record DKIM con selettori diversi (es. mail._domainkey per Brevo, news._domainkey per SendGrid).
DMARC (Domain-based Message Authentication)
DMARC dice al server destinatario cosa fare se SPF o DKIM falliscono. Senza DMARC, la decisione è lasciata al server destinatario (di solito: manda in spam). Con DMARC, sei tu a decidere.
Record DMARC minimo per iniziare:
; DNS TXT record — DMARC in modalità monitoraggio
_dmarc IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@clientdomain.it"
La policy p=none è per monitoraggio: non scarta nulla, ma raccoglie report dai provider. Dopo 2-4 settimane di monitoraggio, passa a p=quarantine (manda in spam le email non autenticate), poi a p=reject (scarta definitivamente). Questo è il percorso raccomandato da Google per la conformità email 2024-2026.
Checklist Autenticazione DNS
| Record | Scopo | Stato nel 2026 |
|---|---|---|
| SPF | Server autorizzati | Obbligatorio da febbraio 2024 (Google/Yahoo) |
| DKIM | Firma crittografica | Obbligatorio da febbraio 2024 |
| DMARC | Policy su fallimenti | Obbligatorio nel 2025 per volume > 5k/giorno |
| MX | Server riceventi | Obbligatorio per ricevere risposte |
| PTR (rDNS) | Reverse DNS | Obbligatorio per delivery diretta |
Gestione Email Multi-Sito per Agenzie
Qui arriva il vero problema. Gestire un sito è facile: installi un plugin, configuri SMTP, fai un test. Gestire 50 siti è un’altra storia. Ogni sito ha un dominio diverso, ogni dominio ha DNS diversi, ogni cliente ha un budget diverso per email.
Strategia 1: SMTP Centralizzato su un Solo Dominio
La soluzione più semplice. Tutti i 50 siti inviano email attraverso un unico account SMTP (Brevo, SendGrid), usando un singolo dominio mittente (es. noreply@agencypilot.it). Vantaggi: una sola configurazione, un solo set di record SPF/DKIM/DMARC, un solo posto da monitorare.
Svantaggi: le email arrivano da agencypilot.it non da clientdomain.it. Il cliente vede l’email e non riconosce il mittente. Per form di contatto e notifiche tecniche va bene. Per email commerciali o di brand, no.
#!/bin/bash
# Script: setup-smtp-all-sites.sh
# Configura SMTP centralizzato su tutti i siti WordPress di un server
SITES=$(wp site list --field=path --allow-root)
SMTP_HOST="smtp-relay.brevo.com"
SMTP_USER="noreply@agencypilot.it"
SMTP_PASS="your-brevo-key"
for SITE in $SITES; do
wp config set WPMS_ON true --raw --path="$SITE" --allow-root
wp config set WPMS_SMTP_HOST "$SMTP_HOST" --path="$SITE" --allow-root
wp config set WPMS_SMTP_PORT 587 --raw --path="$SITE" --allow-root
wp config set WPMS_SMTP_AUTH true --raw --path="$SITE" --allow-root
wp config set WPMS_SMTP_USER "$SMTP_USER" --path="$SITE" --allow-root
wp config set WPMS_SMTP_PASS "$SMTP_PASS" --path="$SITE" --allow-root
wp config set WPMS_SMTP_SECURE "tls" --path="$SITE" --allow-root
wp config set WPMS_FROM "$SMTP_USER" --path="$SITE" --allow-root
echo "Configurato SMTP per: $SITE"
done
echo "Done."
Strategia 2: SMTP per Dominio con Configurazione Automatica
Per clienti che vogliono email dal loro dominio, configuri un SMTP per ogni dominio. Il costo aumenta, ma la deliverability è migliore perché ogni email arriva dal dominio corretto.
#!/bin/bash
# Script: setup-smtp-per-domain.sh
# Legge un CSV dominio,smtp_user,smtp_pass e configura ogni sito
CONFIG_FILE="/root/smtp-configs.csv"
while IFS=, read -r DOMAIN SMTP_USER SMTP_PASS; do
SITE_PATH="/var/www/$DOMAIN/wordpress"
if [ ! -d "$SITE_PATH" ]; then
echo "Skip: $DOMAIN (site not found)"
continue
fi
wp config set WPMS_ON true --raw --path="$SITE_PATH" --allow-root
wp config set WPMS_SMTP_HOST "smtp-relay.brevo.com" --path="$SITE_PATH" --allow-root
wp config set WPMS_SMTP_PORT 587 --raw --path="$SITE_PATH" --allow-root
wp config set WPMS_SMTP_USER "$SMTP_USER" --path="$SITE_PATH" --allow-root
wp config set WPMS_SMTP_PASS "$SMTP_PASS" --path="$SITE_PATH" --allow-root
wp config set WPMS_SMTP_SECURE "tls" --path="$SITE_PATH" --allow-root
wp config set WPMS_FROM "noreply@$DOMAIN" --path="$SITE_PATH" --allow-root
echo "Configurato SMTP per: $DOMAIN"
done < "$CONFIG_FILE"
Questo script legge un CSV con tre colonne e configura ogni sito in 2 secondi. Per 50 siti, l’intera operazione richiede meno di 2 minuti. Confrontalo con il metodo manuale: aprire wp-admin per ogni sito, navigare nelle impostazioni del plugin, inserire credenziali, salvare, testare. Almeno 5 minuti per sito, 250 minuti totali.
Strategia 3: API Transactional Centralizzata
La nostra preferizione per agenzie che gestiscono molti siti. Un singolo account Resend o Postmark, un’API key, un MU-plugin caricato su tutti i siti. Il dominio mittente è configurato nel dashboard del servizio (Resend supporta domini multipli su un singolo account).
#!/bin/bash
# Script: deploy-mu-plugin-all-sites.sh
# Carica il MU-plugin Resend su tutti i siti di un server
MU_PLUGIN="/root/resend-email.php"
SITES=$(find /var/www -name "wp-config.php" -exec dirname {} \;)
for SITE_PATH in $SITES; do
MU_DIR="$SITE_PATH/wp-content/mu-plugins"
mkdir -p "$MU_DIR"
cp "$MU_PLUGIN" "$MU_DIR/resend-email.php"
echo "Deployato MU-plugin su: $SITE_PATH"
done
echo "Done."
Testare la Email Delivery
Dopo aver configurato SMTP o API, devi testare. Ci sono tre livelli di test che dovresti eseguire su ogni nuovo sito.
Test 1: Invio Base via WP-CLI
Test rapido per verificare che wp_mail() funzioni dopo la configurazione:
# Test invio email via WP-CLI
wp eval 'var_dump(wp_mail("test@agencypilot.it", "Test SMTP",
"<h1>Test</h1><p>Email di prova dal sito.</p>",
["Content-Type: text/html"]));' --path=/var/www/site/wordpress
# Output atteso: bool(true)
Test 2: Deliverability con Mail-Tester
Mail-Tester è gratuito e ti dà un punteggio da 0 a 10. Mandi un’email all’indirizzo che ti forniscono, e loro analizzano SPF, DKIM, DMARC, content spam score, e reputation IP. Se ottieni 9/10 o 10/10, sei a posto. Se ottieni meno di 7, hai un problema di configurazione.
Test 3: Monitoraggio Continuo con Webhook
Il test una-tantum non basta. Se l’IP del tuo servizio SMTP viene blacklistato (succede), la deliverability crolla da un giorno all’altro. Configura un webhook per ricevere bounce e complaint in tempo reale:
<?php
// wp-content/mu-plugins/postmark-webhook.php
add_action('init', function() {
if ($_SERVER['REQUEST_URI'] !== '/postmark-webhook') return;
$payload = json_decode(file_get_contents('php://input'), true);
if ($payload['Type'] === 'Bounce') {
error_log(sprintf(
'Postmark bounce: %s — %s (MessageID: %s)',
$payload['BounceType'] ?? 'unknown',
$payload['Description'] ?? 'no description',
$payload['MessageID'] ?? 'unknown'
));
$bounces = get_option('ap_postmark_bounces', []);
$bounces[] = [
'email' => $payload['Email'] ?? '',
'type' => $payload['BounceType'] ?? '',
'date' => current_time('mysql'),
];
update_option('ap_postmark_bounces', array_slice($bounces, -100));
}
status_header(200);
exit;
});
Errori Comuni e Come Risolverli
Email vanno in spam su Gmail
Causa probabile: SPF o DKIM non configurati, o configurati male. Controlla con MXToolbox SuperTool incollando l’header completo dell’email ricevuta. Cerca Authentication-Results: deve dire pass per SPF e DKIM. Se dice fail o none, il record DNS è mancante o errato.
Email non partono (wp_mail restituisce false)
Causa probabile: credenziali SMTP errate, o il server SMTP non è raggiungibile dal server WordPress. Testa la connessione dal server:
# Test connessione SMTP dal server
openssl s_client -connect smtp-relay.brevo.com:587 -starttls smtp -quiet
# Se vedi "220 smtp-relay.brevo.com", la connessione funziona.
# Se timeout, il firewall blocca la porta 587.
Email partono ma non arrivano (silenzio totale)
Causa probabile: DMARC p=reject configurato sul dominio mittente, ma SPF/DKIM non allineati. L’email viene scartata dal server destinatario senza bounce. Controlla i report DMARC (ricevuti via email se hai configurato rua=mailto:...) per vedere se ci sono rejection.
WooCommerce non manda notifiche ordine
WooCommerce usa wp_mail() per tutte le notifiche, quindi se SMTP è configurato bene, WooCommerce funziona. Il problema comune è che WooCommerce imposta header From propri che possono sovrascrivere la configurazione SMTP. Usa il filtro woocommerce_email_from_address:
// functions.php — forza From address per WooCommerce
add_filter('woocommerce_email_from_address', function($from_email) {
return 'noreply@clientdomain.it';
});
add_filter('woocommerce_email_from_name', function($from_name) {
return get_bloginfo('name');
});
Comparazione Plugin WordPress Email
| Plugin | Metodi | Logging | Prezzo | Ideale per |
|---|---|---|---|---|
| WP Mail SMTP | SMTP, API (SendGrid, Brevo, Mailgun, SES) | Premium only | Free + $99/anno | Siti singoli, setup rapido |
| FluentSMTP | SMTP, API (Postmark, Resend, SendGrid, Brevo, SES) | Sì (gratis) | Gratuito | Agenzie, logging completo |
| SMTP Mailer | SMTP only | No | Gratuito | Siti semplici, solo SMTP |
| MU-plugin custom | API REST custom | Custom | $0 (tempo dev) | Agenzie con 50+ siti, automazione |
La nostra scelta: FluentSMTP per siti nuovi (setup visivo, logging gratuito) e MU-plugin custom con Resend API per siti esistenti in bulk (25 righe di PHP, deploy via script, nessuna dipendenza da plugin).
FAQ — WordPress Email Delivery
WordPress manda email gratis senza plugin?
Sì, tramite wp_mail() che usa Sendmail del server. Ma nel 2026 la deliverability è vicina allo zero su Gmail e Outlook senza SPF, DKIM e DMARC configurati. Non raccomandato per siti di produzione.
Qual è il miglior plugin SMTP per WordPress?
Per agenzie: FluentSMTP (gratuito, logging completo, supporta API). Per siti singoli: WP Mail SMTP (interfaccia semplice, documentazione ampia). Per agenzie con 50+ siti: MU-plugin custom con API Resend o Postmark, niente plugin.
Quanto costa configurare email delivery per 50 siti WordPress?
Con Brevo free plan (300 email/giorno per dominio): 0€ se usi un solo dominio mittente. Con Resend (3k/mese gratis): 0€ per i primi 3k email. Per volume maggiore: Brevo a 25€/mese (20k email) o Amazon SES a $0.10 per 1.000 email. Il costo maggiore è il tempo di configurazione, riducibile a 2 minuti con script WP-CLI.
SPF DKIM e DMARC sono obbligatori per WordPress?
Dal febbraio 2024, Google e Yahoo richiedono SPF o DKIM per qualsiasi email inviata a Gmail o Yahoo Mail. Dal 2025, DMARC è obbligatorio per volume superiore a 5.000 email al giorno. Senza questi record DNS, le email vengono scartate silenziosamente, non mandate in spam.
Posso usare Gmail SMTP per WordPress?
Tecnicamente sì, ma non raccomandato. Google ha limiti strict (500 email/giorno su account gratuiti, 2.000 su Workspace) e policy che vietano uso transactional. Usa un servizio dedicato: Brevo, Resend, Postmark. Costano meno e sono progettati per email transazionali.