PHPs eingebaute Funktion mail() kennt keine Anmeldung am Mailserver. Sie übergibt die Nachricht an das Mailprogramm des Webservers, und von dort geht sie hinaus, ohne dass irgendwer nachweist, dass der Absender überhaupt senden darf. Solche Mails landen im Spam oder werden gar nicht erst angenommen.
Der zuverlässige Weg führt über den SMTP-Server des eigenen Mailanbieters, mit Benutzername und Passwort. Dann verschickt der Anbieter die Nachricht über seine eigenen, dafür zugelassenen Server.
Warum das heute noch wichtiger ist
Empfangende Server prüfen inzwischen, ob eine Mail wirklich von der Domain stammt, die sie als Absender angibt. Dafür gibt es drei DNS-Einträge: SPF legt fest, welche Server für eine Domain senden dürfen, DKIM signiert die Nachricht, und DMARC bestimmt, was mit Mails passiert, die diese Prüfungen nicht bestehen. Gmail und Yahoo verlangen seit Februar 2024 von allen Absendern mindestens SPF oder DKIM, von Massenversendern alle drei.
Wer über den SMTP-Server seines Anbieters verschickt, erfüllt das in der Regel von selbst, sofern der SPF-Eintrag der Domain den Anbieter enthält und DKIM dort eingerichtet ist. Mit mail() vom eigenen Webserver aus muss man sich um all das selbst kümmern.
Installation
PHPMailer bringt alles mit, was für den Versand nötig ist, und läuft mit jeder aktuellen PHP-Version. Installiert wird es mit Composer:
composer require phpmailer/phpmailer
Code language: JavaScript (javascript)
Wer mit Symfony arbeitet, nimmt stattdessen Symfony Mailer.
Das Skript
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require __DIR__ . '/vendor/autoload.php';
$mail = new PHPMailer(true); // Fehler als Exception
$mail->CharSet = PHPMailer::CHARSET_UTF8;
// SMTP mit Anmeldung, verschlüsselt per STARTTLS auf Port 587
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->Port = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth = true;
$mail->Username = getenv('SMTP_USER'); // Zugangsdaten gehören nicht in den Code
$mail->Password = getenv('SMTP_PASSWORD');
$mail->setFrom('versand@example.com', 'Mein Shop');
$mail->addAddress('kunde@example.com');
$mail->Subject = 'Grüße per SMTP';
$mail->Body = "Hallo,\n\ndiese Mail kommt über SMTP mit Anmeldung.";
try {
$mail->send();
echo "Versendet\n";
} catch (Exception $e) {
echo "Fehler beim Versenden: {$mail->ErrorInfo}\n";
}Code language: PHP (php)
Worauf es beim Versand ankommt
Zeichensatz und Betreff. Umlaute dürfen nicht unkodiert im Kopf einer Mail stehen. Wer die Kopfzeilen selbst zusammensetzt, etwa für mail(), bekommt schnell eine Nachricht wie diese:
From: versand@example.com
To: kunde@example.com
Subject: Grüße per SMTP
Ohne Angabe des Zeichensatzes muss das Mailprogramm raten, und aus „Grüße” wird je nach Programm Zeichensalat. PHPMailer kodiert den Betreff und ergänzt, was ein vollständiger Mail-Kopf braucht:
Date: Sat, 26 Sep 2026 06:24:32 +0000
From: Mein Shop versand@example.com
Subject: =?utf-8?Q?Gr=C3=BC=C3=9Fe_per_SMTP?=
Message-ID: <…@example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Datum und Message-ID ergänzen manche Server selbst, andere werten ihr Fehlen als Hinweis auf Spam.
Der richtige Port. SMTP mit Anmeldung läuft über Port 587 mit STARTTLS oder über Port 465, wo die Verbindung von Anfang an verschlüsselt ist. Für Port 465 ändern sich im Skript zwei Zeilen: Port auf 465 und SMTPSecure auf PHPMailer::ENCRYPTION_SMTPS. Welcher Port gilt, steht in der Hilfe des Mailanbieters. Port 25 dagegen ist für den Austausch zwischen Mailservern gedacht und bei vielen Hostern und Cloud-Anbietern für ausgehende Verbindungen gesperrt, bei AWS zum Beispiel standardmäßig auch auf Lightsail.
Zugangsdaten. Benutzername und Passwort gehören in Umgebungsvariablen oder in eine Konfigurationsdatei außerhalb des Webroots. Im Quelltext landen sie früher oder später in einem Repository.
Dasselbe in Java beschreibt der Beitrag Mit Java eine E-Mail versenden.
danke fuer das php script..
Hallo,
ich verstehe im moment überhaupt nicht, was ich mit “Mail” und “Net_SMTP” machen muss…? *ratlos guck* 🙁
Damit die Mails per SMTP versendet werden können, werden diese beiden Pakete benötigt. Das ganze geht halt mittels PEAR
pear install Mail
pear install Net_Smtp
oder als manueller download.
Hm… *koppkratz* Also, ich habe mir jetzt die beiden Pakete da heruntergeladen und auf meinen Webspace hochgeladen. Soweit so gut… jetzt steht aber in der Mail.php als erste “require_once PEAR.php”, aber diese Datei finde ich wo nirgends…?
Da steht nicht ‘require_once PEAR.php’, sondern ‘require_once Mail.php’
Ansonsten: http://de.wikipedia.org/wiki/PHP_Extension_and_Application_Repository
funzt ned bei gmail brrr error code 555
Besten Dank für diesen Artikel, kam echt gelegen. Das Script wird gleich ausgetestet!!
Funktioniert bestens bei mir! Super sache!
Vielen Dank
Gruß Hunni