«Non arriva nessuna posta» ha due cause molto diverse: il server non l'ha mai spedita, oppure l'ha spedita e chi riceve l'ha rifiutata. Il registro della posta risponde in una riga, e tutto il resto discende da quella risposta.

tail -50 /var/log/mail.log
  • status=sent — è partita. Il problema è la consegna, non l'invio: vedi l'articolo sulla posta che finisce nell'indesiderata.
  • status=bounced — chi riceve ha rifiutato, e la riga dice perché.
  • Niente del tutto — l'applicazione non ha mai consegnato nulla.

Quando al registro non arriva nulla

La funzione mail() di PHP restituisce true quando il programma di posta locale ha ACCETTATO il messaggio, che non è la stessa cosa che spedirlo. Se non c'è alcun programma di posta installato restituisce false, e quasi tutte le applicazioni lo ignorano.

php -r 'var_dump(mail("you@example.com","test","body"));'
which sendmail

Usa SMTP invece di mail()

Un SMTP autenticato verso la tua casella è più affidabile e viene consegnato molto meglio: il messaggio è firmato e proviene da un server che ha una reputazione, non da un processo web.

Host: mail.yourdomain.com
Port: 465 (SSL) or 587 (TLS)
User: the full address
From: the SAME address
L'indirizzo nel campo From deve essere una casella che esiste davvero sul dominio mittente. Un modulo che spedisce con l'indirizzo del visitatore non supera l'SPF presso chi riceve, perché il tuo server non è autorizzato a spedire a suo nome. Metti il visitatore in Reply-To.

Prova il percorso, non il modulo

swaks --to you@example.com --from noreply@yourdomain.com --server mail.yourdomain.com:587 -tls -au noreply@yourdomain.com

Questo prova SMTP direttamente e stampa l'intera conversazione. Se funziona e il sito continua a fallire, il guasto sta nelle impostazioni dell'applicazione, non nel server di posta.

Guarda la coda oltre al registro: mailq. Un messaggio fermo in coda è stato accettato e non ancora consegnato, e la coda dice il motivo per cui aspetta.