Mail, die eine Anwendung versendet, scheitert meist lautlos. Die Funktion gibt true zurück, die Nachricht geht an einen lokalen Prozess, und nichts sagt Ihnen, dass sie eine Stunde später abgewiesen wurde. Die Abhilfe: über authentifiziertes SMTP senden, wo ein Fehlschlag ein Fehler ist, den Sie sehen.
Benutzen Sie mail() nicht
- Es meldet, ob die Nachricht übergeben wurde, nicht ob sie zugestellt wurde.
- Es versendet als Webserver-Benutzer, deshalb scheitern SPF und DKIM meistens.
- Es hat keine Authentifizierung, keinen zweiten Versuch und kein Log, das Sie lesen könnten.
Nehmen Sie 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();
From muss Ihre eigene Domain sein
From auf die Adresse des Kunden zu setzen, damit Antworten funktionieren, ist der klassische Fehler: Sie senden dann als gmail.com, und das scheitert an deren SPF und DMARC schlicht. Senden Sie als Ihre Domain und setzen Sie Reply-To auf die des Kunden.
Im Hintergrund versenden
Während der Anfrage zu senden lässt den Besucher auf einen fremden Server warten und macht aus einer Mailstörung eine kaputte Kasse. Stellen Sie es in eine Warteschlange und senden Sie aus einem Worker.
Und das Ergebnis protokollieren
$m->SMTPDebug = 2; // development only
// production: record the message ID and the accept/reject per recipient
