Signatur
Beschreibung
mb_send_mail() funktioniert ähnlich wie die eingebaute mail()-Funktion, kodiert jedoch Betreff, Empfänger-Adressen und den Nachrichtentext automatisch gemäß der aktuell eingestellten internen Zeichenkodierung (mb_internal_encoding()). Dadurch können E-Mails mit internationalen Zeichen (Umlaute, CJK-Zeichen usw.) zuverlässig versendet werden, ohne dass der Entwickler manuell mit mb_encode_mimeheader() o. Ä. arbeiten muss.
Die Funktion kodiert den Betreff automatisch nach RFC 2047 (MIME Encoded-Word) und setzt passende Header wie Content-Type mit dem korrekten Charset sowie Content-Transfer-Encoding. Die interne Kodierung lässt sich vorab mit mb_language() und mb_internal_encoding() konfigurieren.
Zusätzliche Header (z. B. From, CC, Reply-To) können als assoziatives Array (ab PHP 7.2) oder als CRLF-getrennter String übergeben werden. Der Parameter $additional_params ermöglicht das Setzen von MTA-spezifischen Optionen wie dem Envelope-Sender (-f user@example.com).
Diese Funktion ist besonders nützlich bei mehrsprachigen Webanwendungen, bei denen E-Mail-Inhalte in nicht-lateinischen Zeichensätzen übertragen werden müssen. Für komplexere Anwendungsfälle (HTML-Mails, Anhänge) empfiehlt sich jedoch der Einsatz einer dedizierten Bibliothek wie PHPMailer oder Symfony Mailer.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $to Pflicht | string | Empfänger-Adresse(n) der E-Mail. Mehrere Empfänger werden durch Komma getrennt (z. B. "user1@example.com, user2@example.com"). Enthält die Adresse Multibyte-Zeichen (z. B. im Display-Namen), werden diese automatisch kodiert. |
|
| $subject Pflicht | string | Betreffzeile der E-Mail. Wird automatisch nach RFC 2047 MIME-kodiert, sodass auch Umlaute und andere Multibyte-Zeichen korrekt übertragen werden. | |
| $message Pflicht | string | Nachrichtentext der E-Mail. Wird entsprechend der internen Zeichenkodierung und dem via mb_language() gesetzten Sprachprofil kodiert (z. B. Base64 oder Quoted-Printable). Zeilenumbrüche sollten \n sein. |
|
| $additional_headers | array|string | [] | Zusätzliche E-Mail-Header wie From, CC, BCC oder Reply-To. Ab PHP 7.2 kann ein assoziatives Array übergeben werden (z. B. ["From" => "sender@example.com"]); alternativ ein CRLF-getrennter String. Achtung: Nicht valide Eingaben können Header-Injection ermöglichen. |
| $additional_params | string | "" | Zusätzliche Kommandozeilenparameter, die an das Mail-Programm (MTA) übergeben werden, z. B. "-f sender@example.com" zum Setzen des Envelope-Senders. Nur mit vertrauenswürdigen Eingaben verwenden, da sonst Shell-Injection möglich ist. |
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 zugestellt wurde.Beispiele
Einfache UTF-8-E-Mail mit deutschen Umlauten senden
<?php
mb_language('uni');
mb_internal_encoding('UTF-8');
$to = 'empfaenger@example.com';
$subject = 'Bestellbestätigung – Vielen Dank!';
$message = "Hallo Müller,\n\nIhre Bestellung wurde erfolgreich aufgenommen.\n\nMit freundlichen Grüßen\nIhr Shop-Team";
$headers = [
'From' => 'shop@example.com',
'Reply-To' => 'support@example.com',
'X-Mailer' => 'PHP/' . PHP_VERSION,
];
$result = mb_send_mail($to, $subject, $message, $headers);
if ($result) {
echo 'E-Mail erfolgreich übergeben.';
} else {
echo 'Fehler beim Senden der E-Mail.';
}
Mehrsprachige E-Mail mit japanischen Zeichen
<?php
// Japanisches Sprachprofil aktivieren
mb_language('ja');
mb_internal_encoding('UTF-8');
$to = 'tanaka@example.jp';
$subject = 'ご注文の確認';
$message = "田中様、\n\nご注文ありがとうございます。\n\n敬具";
$headers = [
'From' => 'info@example.jp',
];
$result = mb_send_mail($to, $subject, $message, $headers);
var_dump($result);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Header-Injection: Benutzereingaben in
$to,$subjectoder$additional_headersmüssen unbedingt validiert werden. Zeichen wie\rund\nin diesen Feldern können es Angreifern ermöglichen, eigene Header einzuschleusen und damit z. B. Spam-Mails zu versenden. Eingaben sollten mitfilter_var()undFILTER_VALIDATE_EMAILgeprüft werden. - Shell-Injection via
$additional_params: Dieser Parameter wird direkt an die Kommandozeile übergeben. Niemals ungeprüfte Benutzerdaten hier einsetzen. PHP aktiviert densafe_mode-Schutz (in alten Versionen) bzw. prüft den Benutzer in neueren Versionen – dennoch ist Vorsicht geboten. - Die Funktion setzt voraus, dass ein MTA auf dem Server konfiguriert ist (z. B. Sendmail, Postfix). In Docker- oder Cloud-Umgebungen ohne MTA schlägt der Aufruf fehl.
- Für produktive Anwendungen mit komplexeren Anforderungen (HTML-Mails, Anhänge, SMTP-Auth) sind Bibliotheken wie PHPMailer oder Symfony Mailer empfehlenswert.