mail()
Die Funktion mail() in PHP wird verwendet, um E-Mail-Nachrichten direkt aus einem PHP-Skript heraus zu versenden.
Die Funktion mail() sendet E-Mail-Nachrichten direkt aus einem PHP-Skript. Sie ist der einfachste integrierte Weg, um E-Mails zu versenden. Dieser Leitfaden behandelt ihre Syntax und Parameter, die Funktionsweise von Headern, das Versenden von HTML- und Mehrfachempfänger-Nachrichten, Sicherheitsfallen sowie den Einsatz einer dedizierten Bibliothek als Alternative.
Was ist die Funktion mail()?
Die Funktion mail() ist eine integrierte PHP-Funktion, die eine E-Mail an den Mail Transfer Agent (MTA) des Systems weiterleitet — typischerweise sendmail unter Linux — oder an den in php.ini konfigurierten SMTP-Server. Da sie von dieser lokalen Konfiguration abhängt, gibt mail() auf einem Entwicklungsrechner ohne installierten MTA häufig false zurück oder schlägt still fehl. Sie öffnet selbst keine SMTP-Verbindung und kann sich daher nicht bei einem externen Anbieter wie Gmail authentifizieren.
Ein Rückgabewert von true bedeutet lediglich, dass die Nachricht vom MTA zur Auslieferung angenommen wurde — es ist keine Garantie, dass die E-Mail im Posteingang des Empfängers angekommen ist.
Syntax
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$to | Ja | Empfängeradresse(n). Mehrere Adressen werden durch Komma getrennt, z. B. "[email protected], [email protected]". |
$subject | Ja | Die Betreffzeile. Darf keine Zeilenumbrüche enthalten. |
$message | Ja | Der Nachrichtentext. Jede Zeile sollte durch \r\n getrennt und nicht länger als 70 Zeichen sein. |
$additional_headers | Nein | Zusätzliche Header wie From, Cc, Bcc, Content-Type. Als String (CRLF-getrennt) oder seit PHP 7.2 als assoziatives Array. |
$additional_params | Nein | Zusätzliche Flags, die an die Befehlszeile des MTA übergeben werden (z. B. -f zum Setzen des Envelope-Absenders). |
Verwendung der Funktion mail()
Hier ist ein vollständiges Beispiel mit Klartext, das Header aufbaut und den Rückgabewert prüft:
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP';
// Additional headers
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n"
. 'X-Mailer: PHP/' . phpversion();
// Send the email and check the result
if (mail($to, $subject, $message, $headers)) {
echo "Email sent successfully.";
} else {
echo "Email delivery failed.";
}
?>Wir definieren Empfänger, Betreff und Nachricht und erstellen dann die Header. Da mail() einen booleschen Wert zurückgibt, empfiehlt es sich, den Rückgabewert zu prüfen, anstatt den Erfolg vorauszusetzen. Der From-Header ist wichtig: Ohne ihn lehnen viele Mailserver die Nachricht ab oder markieren sie als Spam.
HTML-E-Mail versenden
Um HTML statt Klartext zu versenden, fügt man Content-Type: text/html zu den Headern hinzu. Ohne diesen Header zeigt der Client die rohen Tags als Text an.
<?php
$to = '[email protected]';
$subject = 'HTML email test';
$message = '<h1>Hello</h1><p>This message is <b>HTML</b>.</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Mehrere Empfänger, Cc und Bcc
Mehrere Adressen in $to (kommagetrennt) erscheinen in der sichtbaren „An"-Zeile; für Kopien werden Cc/Bcc-Header verwendet:
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'See attached agenda.';
$headers = "From: [email protected]\r\n";
$headers .= "Cc: [email protected]\r\n";
$headers .= "Bcc: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Empfänger in Bcc sind für alle anderen unsichtbar, während Cc-Adressen für alle Empfänger sichtbar sind.
Sicherheit: Header-Injection vermeiden
Wenn ein Teil der Empfängeradresse, des Betreffs oder der Header aus Benutzereingaben stammt — z. B. aus einem Kontaktformular — kann ein Angreifer zusätzliche Zeilenumbrüche einfügen, um eigene Cc/Bcc-Header hinzuzufügen und den Server zum Versand von Spam zu missbrauchen. Adressen immer validieren und Zeilenumbrüche entfernen, bevor sie an mail() übergeben werden:
<?php
$email = $_POST['email'] ?? '';
// Reject anything that is not a valid email address
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Invalid email address.');
}
// Strip CR/LF so the value can't inject new headers
$email = str_replace(["\r", "\n"], '', $email);
?>filter_var() mit FILTER_VALIDATE_EMAIL zur Validierung verwenden; weitere sichere Formularverarbeitungsmuster finden sich unter PHP-Formularvalidierung und Formular-URL/E-Mail-Behandlung.
Einschränkungen und wann eine Bibliothek sinnvoll ist
mail() eignet sich gut für einfache Nachrichten mit geringem Volumen, hat aber echte Grenzen:
- Es kann sich nicht bei einem externen SMTP-Server authentifizieren (kein Benutzername/Passwort, kein TLS-Handshake).
- Es bietet keine native Unterstützung für Anhänge — MIME-Teile müssen manuell aufgebaut werden.
- Die Fehlerberichterstattung ist minimal: ein
false-Rückgabewert gibt kaum Auskunft darüber, warum die Zustellung fehlgeschlagen ist.
Für den Produktionseinsatz, transaktionale E-Mails oder Nachrichten mit Anhängen empfiehlt sich eine dedizierte Bibliothek wie PHPMailer oder Symfony Mailer. Diese übernehmen SMTP-Authentifizierung, Kodierung, Anhänge und bieten eine deutlich bessere Fehlerberichterstattung.
Fazit
Die Funktion mail() bietet einen schnellen Weg zum Versenden von E-Mails direkt aus PHP und eignet sich gut für einfache Benachrichtigungen, wenn ein funktionierender MTA vorhanden ist. Zu beachten ist, dass der Erfolg von der Serverkonfiguration abhängt, dass Benutzereingaben gegen Header-Injection abgesichert werden müssen und dass Produktionssysteme in der Regel besser mit PHPMailer oder Symfony Mailer bedient sind. Zur weiteren Lektüre empfehlen sich PHP-Funktionen und die Funktion header().