La posta mandata da un'applicazione di solito fallisce in silenzio. La funzione restituisce true, il messaggio viene consegnato a un processo locale, e nulla le dice che un'ora dopo è stato rifiutato. Il rimedio è mandare via SMTP autenticato, dove un fallimento è un errore che si vede.
Non usi mail()
- Riferisce se il messaggio è stato consegnato all'anello successivo, non se è arrivato a destinazione.
- Manda con l'identità dell'utente del server web, quindi SPF e DKIM di solito falliscono.
- Non ha autenticazione, né un secondo tentativo, né un log che lei possa leggere.
Usi SMTP
use PHPMailer\PHPMailer\PHPMailer;
$m = new PHPMailer(true);
$m->isSMTP();
$m->Host = 'mail.yourdomain.com';
$m->SMTPAuth = true;
$m->Username = 'noreply@yourdomain.com';
$m->Password = getenv('SMTP_PASS');
$m->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
$m->Port = 465;
$m->setFrom('noreply@yourdomain.com', 'Your Shop');
$m->addReplyTo('support@yourdomain.com');
$m->addAddress($customerEmail);
$m->Subject = 'Your order';
$m->Body = $text;
$m->send();
Non metta mai la password nel codice. La legga dall'ambiente, e tenga il file d'ambiente fuori dal document root e fuori da git.
Il From dev'essere il suo dominio
Mettere nel From l'indirizzo del cliente perché le risposte funzionino è l'errore classico: così sta mandando come gmail.com, e questo non supera affatto il loro SPF e il loro DMARC. Mandi con il suo dominio e imposti Reply-To su quello del cliente.
La mandi in background
Mandarla durante la richiesta fa aspettare il visitatore dietro a un server remoto e trasforma un disservizio di posta in una cassa rotta. La metta in coda e la mandi da un worker.
E registri l'esito
$m->SMTPDebug = 2; // development only
// production: record the message ID and the accept/reject per recipient
Per tutto ciò che è transazionale - ricevute, reimpostazioni di password - usi un servizio di invio dedicato. La recapitabilità è tutto il loro mestiere, e separa le sue ricevute dalle sue newsletter: veda posta transazionale e newsletter.
