W3docs

PHP Mail

Die mail()-Funktion in PHP ermöglicht das Versenden von E-Mails direkt aus einem PHP-Skript heraus.

Die eingebaute mail()-Funktion von PHP sendet E-Mails direkt aus einem Skript heraus — ohne zusätzliche Bibliothek. Sie ist der schnellste Weg, um eine Benachrichtigung, eine „Kontakt"-Nachricht oder einen Passwort-Reset-Link zu verschicken. Dieses Kapitel erläutert die Funktionssignatur, zeigt Beispiele für Nur-Text- und HTML-E-Mails und behandelt die Sicherheits- und Zustellbarkeitsprobleme, die in der Produktion häufig auftreten.

Was die mail()-Funktion tut

mail() übergibt eine Nachricht an den lokalen Mail Transfer Agent (MTA) des Servers — das Programm (z. B. Sendmail, Postfix oder Exim), das die E-Mail tatsächlich an die Außenwelt weiterleitet. PHP kommuniziert nicht selbst mit externen SMTP-Servern; es reiht die Nachricht lediglich lokal ein. Wenn der Host keinen funktionierenden MTA hat, gibt mail() false zurück und es wird nichts gesendet.

Die Funktion gibt einen boolean-Wert zurück: true, wenn die Nachricht zur Zustellung angenommen wurde (was nicht dasselbe wie zugestellt ist), und false bei einem Fehler.

Syntax

mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    string $additional_params = ""
): bool
ParameterErforderlichBeschreibung
$toJaEmpfängeradresse(n). Mehrere Adressen mit einem Komma trennen.
$subjectJaBetreffzeile. Darf keine Zeilenumbrüche enthalten.
$messageJaDer E-Mail-Text. Zeilen sollten durch \r\n getrennt sein und nicht länger als 70 Zeichen sein.
$additional_headersNeinZusätzliche Header wie From, Reply-To oder Content-Type. Ab PHP 7.2 kann dies ein assoziatives Array sein.
$additional_paramsNeinZusätzliche Befehlszeilenargumente für den MTA (z. B. den Envelope-Absender über -f).

Eine Nur-Text-E-Mail senden

Dies ist der häufigste Fall: eine einfache Textnachricht mit einigen Headern.

<?php
$to      = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP.';

// Additional headers
$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();

if (mail($to, $subject, $message, $headers)) {
    echo 'Email sent successfully.';
} else {
    echo 'Failed to send email.';
}
?>

Wir setzen Empfänger, Betreff und Nachrichtentext, dann erstellen wir einen Header-String. Der From-Header identifiziert den Absender, Reply-To steuert, wohin Antworten gehen, und X-Mailer ist informativ. Header werden mit \r\n (Wagenrücklauf + Zeilenvorschub) verbunden, was das vom E-Mail-Protokoll verlangte Zeilenende ist.

Eine HTML-E-Mail senden

Um formatiertes HTML zu senden, füge Content-type: text/html zu den Headern hinzu. Ohne diesen Header sieht der Empfänger rohe Tags anstatt gerendertes Markup.

<?php
$to      = '[email protected]';
$subject = 'HTML email';
$message = '
<html>
<body>
    <h1>Hello!</h1>
    <p>This message is <strong>formatted with HTML</strong>.</p>
</body>
</html>';

// To send HTML mail, the Content-type header must be set
$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);
?>

An mehrere Empfänger senden

Übergib eine kommagetrennte Liste in $to oder verwende Cc/Bcc-Header:

<?php
$to      = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'Meeting moved to 3 PM.';

$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

mail($to, $subject, $message, $headers);
?>

Schutz vor Header-Injection

Wenn ein Teil eines Headers — insbesondere From oder Reply-To — aus Benutzereingaben stammt (z. B. einem Kontaktformular), kann ein Angreifer zusätzliche Zeilenumbrüche einfügen, um eigene Header hinzuzufügen und dein Skript als Spam-Relay zu missbrauchen. Füge niemals rohe Benutzereingaben in Header ein. Validiere und bereinige zuerst:

<?php
// $_POST['email'] comes from an untrusted form
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);

if ($email === false) {
    exit('Invalid email address.');
}

// Strip any line breaks that could be used to inject headers
$email = str_replace(["\r", "\n"], '', $email);

$headers = 'From: ' . $email . "\r\n";
mail('[email protected]', 'Contact form', 'New message', $headers);
?>

Weitere Informationen zur Validierung von Eingaben findest du unter filter_var() und im Kapitel PHP Filter, sowie unter PHP-Formularvalidierung zur sicheren Handhabung von Formulardaten.

Zustellbarkeit und Produktionshinweise

Hinweis: Die mail()-Funktion ist auf den lokalen MTA des Servers angewiesen. In vielen modernen Hosting-Umgebungen schlägt sie lautlos fehl oder landet im Spam-Ordner, ohne ordentliche Konfiguration. Für echte Anwendungen empfiehlt sich eine etablierte Bibliothek wie PHPMailer oder Symfony Mailer, die SMTP-Authentifizierung, Anhänge, Codierung und Warteschlangen unterstützen. Für welchen Weg du dich auch entscheidest: Gib deiner Domain gültige SPF-, DKIM- und DMARC-Einträge, damit E-Mail-Anbieter deinen Nachrichten vertrauen.

Ein zurückgegebenes true bedeutet nur, dass der MTA die Nachricht angenommen hat — es ist keine Zustellungsbestätigung. Um tatsächliche Zustellungen, Rückläufer und Öffnungen zu verfolgen, nutze einen transaktionalen E-Mail-Dienst.

Häufige Anwendungsfälle

  • Kontaktformulare — eine Nachricht sammeln und per E-Mail an den Website-Betreiber schicken (kombiniert mit PHP-Formularverarbeitung).
  • Benachrichtigungen — Bestellbestätigungen, Hinweise, Passwort-Resets.
  • Berichte — geplante Skripte, die eine Zusammenfassung per E-Mail versenden.

Fazit

Die mail()-Funktion von PHP bietet eine schnelle, abhängigkeitsfreie Möglichkeit, E-Mails aus einem Skript heraus zu senden: Empfänger, Betreff und Nachrichtentext angeben, dann Header für Absender, Antwortadresse oder HTML-Inhalte hinzufügen. Beachte dabei ihre Einschränkungen — sie benötigt einen konfigurierten MTA, gibt Annahme statt Zustellung zurück, und darf niemals unsanitisierte Benutzereingaben in ihren Headern erhalten. Für alles jenseits einfacher, geringer E-Mail-Volumina greife auf eine dedizierte Bibliothek zurück. Um weiterzulernen, erkunde PHP-Funktionen und PHP-Strings.

Übung

Übung
Was sind die Parameter der PHP mail()-Funktion?
Was sind die Parameter der PHP mail()-Funktion?
Was this page helpful?