Signatur
Beschreibung
mail() ist die eingebaute PHP-Funktion zum Versenden von E-Mails direkt über den Sendmail-kompatiblen MTA des Servers (z. B. Sendmail, Postfix, Exim) bzw. auf Windows über SMTP. Sie ermöglicht das Versenden einfacher Textnachrichten sowie – durch das Setzen entsprechender Header – auch HTML-Mails und Mails mit Anhängen.
Die Funktion eignet sich für einfache Anwendungsfälle wie Kontaktformulare, Benachrichtigungs-E-Mails oder Passwort-Resets. Für komplexe Anforderungen (SMTP-Authentifizierung, DKIM-Signierung, Anhänge, HTML-Mails mit Plaintext-Fallback) empfiehlt sich der Einsatz spezialisierter Bibliotheken wie PHPMailer oder Symfony Mailer.
Der Parameter $additional_headers erlaubt das Setzen von Headern wie From, Reply-To, Cc, Bcc oder Content-Type. Ab PHP 7.2 kann dieser Parameter auch ein Array sein, was die Handhabung erheblich vereinfacht und bestimmte Injection-Risiken reduziert.
Das Verhalten von mail() hängt stark von der Serverkonfiguration (php.ini, Eintrag sendmail_path bzw. SMTP auf Windows) ab. Die Funktion übergibt die Nachricht lediglich an den MTA und gibt true zurück, wenn die Übergabe erfolgreich war – nicht aber, ob die E-Mail tatsächlich zugestellt wurde.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $to Pflicht | string | Empfängeradresse der E-Mail im Format user@example.com oder Name <user@example.com>. Mehrere Empfänger werden durch Komma getrennt. |
|
| $subject Pflicht | string | Betreffzeile der E-Mail. Sonderzeichen und Nicht-ASCII-Zeichen sollten gemäß RFC 2047 kodiert werden (z. B. mit mb_encode_mimeheader()). |
|
| $message Pflicht | string | Der eigentliche Nachrichtentext. Zeilenenden müssen als \r\n (CRLF) angegeben werden. Zeilen sollten auf 70 Zeichen begrenzt werden (RFC 2822). Bei HTML-Mails muss der entsprechende Content-Type-Header gesetzt werden. |
|
| $additional_headers | array|string | [] | Zusätzliche Mail-Header, entweder als String (einzelne Header durch \r\n getrennt) oder ab PHP 7.2 als assoziatives Array. Typische Header: From, Reply-To, Content-Type, Cc, Bcc. |
| $additional_params | string | '' | Zusätzliche Parameter, die direkt an das Sendmail-Programm übergeben werden (z. B. -f sender@example.com zum Setzen des Envelope-Senders). Nur auf Unix-Systemen relevant; Benutzereingaben dürfen hier niemals ungeprüft eingesetzt werden. |
Rückgabewert
true zurück, wenn die E-Mail erfolgreich an den MTA übergeben wurde, andernfalls false. Ein Rückgabewert von true bedeutet nicht, dass die E-Mail tatsächlich beim Empfänger angekommen ist.Beispiele
Einfache Text-E-Mail versenden
<?php
$to = 'empfaenger@example.com';
$subject = 'Testmail von PHP';
$message = "Hallo,\r\n\r\nDies ist eine Testnachricht.\r\n\r\nViele Grüße";
$headers = [
'From' => 'absender@example.com',
'Reply-To' => 'absender@example.com',
'X-Mailer' => 'PHP/' . PHP_VERSION,
];
if (mail($to, $subject, $message, $headers)) {
echo 'E-Mail wurde erfolgreich übergeben.';
} else {
echo 'Fehler beim Übergeben der E-Mail.';
}
HTML-E-Mail mit Plaintext-Fallback versenden
<?php
$to = 'empfaenger@example.com';
$subject = mb_encode_mimeheader('Willkommen auf unserer Plattform', 'UTF-8');
$boundary = md5(uniqid(time()));
$headers = [
'From' => 'no-reply@example.com',
'MIME-Version' => '1.0',
'Content-Type' => 'multipart/alternative; boundary="' . $boundary . '"',
];
$plaintext = "Willkommen!\r\nBitte besuchen Sie: https://example.com\r\n";
$html = '<html><body><h1>Willkommen!</h1><p><a href="https://example.com">Jetzt starten</a></p></body></html>';
$message = "--{$boundary}\r\n";
$message .= "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
$message .= $plaintext . "\r\n";
$message .= "--{$boundary}\r\n";
$message .= "Content-Type: text/html; charset=UTF-8\r\n\r\n";
$message .= $html . "\r\n";
$message .= "--{$boundary}--";
$result = mail($to, $subject, $message, $headers);
echo $result ? 'HTML-Mail übergeben.' : 'Fehler!';
Sicherheit: Header-Injection verhindern
<?php
// Benutzereingabe NIEMALS ungefiltert in Header oder additional_params einfügen!
function sanitizeEmailHeader(string $value): string {
// Zeilenumbrüche entfernen, die für Header-Injection genutzt werden könnten
return str_replace(["\r", "\n", "\0"], '', $value);
}
$userInput = $_POST['email'] ?? '';
$safeEmail = sanitizeEmailHeader($userInput);
// Adresse zusätzlich mit filter_var validieren
if (!filter_var($safeEmail, FILTER_VALIDATE_EMAIL)) {
die('Ungültige E-Mail-Adresse.');
}
mail($safeEmail, 'Bestätigung', 'Vielen Dank für Ihre Anfrage.', [
'From' => 'no-reply@example.com',
]);
echo 'Mail versendet.';
// Wichtig · Fallstricke
Sicherheit – Header-Injection: Werden Benutzereingaben ungefiltert in $to, $subject oder $additional_headers eingesetzt, können Angreifer zusätzliche Header einschleusen und die Mail für Spam missbrauchen. Alle Eingaben müssen vor der Verwendung validiert und bereinigt werden (filter_var($email, FILTER_VALIDATE_EMAIL), Zeilenumbrüche entfernen).
Sicherheit – Shell-Injection in $additional_params: Benutzereingaben dürfen niemals direkt in $additional_params eingesetzt werden, da diese als Shell-Argumente übergeben werden. Verwende in diesem Parameter ausschließlich statische, kontrollierte Werte.
Zustellung nicht garantiert: Ein Rückgabewert von true bedeutet nur, dass die Übergabe an den MTA erfolgreich war. Spam-Filter, falsche DNS-Konfiguration (fehlende SPF/DKIM-Einträge) oder ungültige Adressen können dazu führen, dass die Mail nie ankommt.
Empfehlung für Produktionsumgebungen: Für zuverlässiges E-Mail-Versenden mit SMTP-Authentifizierung, Fehlerbehandlung und modernen Standards empfiehlt sich der Einsatz von PHPMailer, SwiftMailer oder Symfony Mailer statt der nativen mail()-Funktion.