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();
Schreiben Sie das Passwort nie in den Code. Lesen Sie es aus der Umgebung und halten Sie die Umgebungsdatei aus dem Document Root und aus git heraus.

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
Für alles Transaktionale - Belege, Passwort-Rücksetzungen - nehmen Sie einen eigenen Versanddienst. Zustellbarkeit ist dessen ganzes Geschäft, und es trennt Ihre Belege von Ihren Newslettern: siehe Transaktionsmail gegenüber Newslettern.