Start · Sprachen · PHP · Referenz · mail

mail

Funktion

Sendet eine E-Mail über den konfigurierten Mail-Transfer-Agent (MTA) des Servers.

seit PHP 4.0.0 Kategorie: http

Signatur

mail(string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = ''): bool

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

Typ
bool
Beschreibung
Gibt 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.';
}
E-Mail wurde erfolgreich übergeben.

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!';
HTML-Mail übergeben.

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.';
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.