Schlagwort-Archive: mail()

PHP mail() – Header-Fehler in aktuellen Versionen

„Das hat aber früher funktioniert“! Exakt das dachte ich mir, als nach einem PHP-Update ein kleines „Aushilfsscript“ seinen Dienst verweigerte. Das Script nimmt eine fertige E-Mail, entfernt einige Header, welche das Quellsystem nicht Standardkonform einbringt, und sendet die gesäuberte Mail weiter. Um unnötiges Parsing zu vermeiden ging die komplette Mail in den Header.

$headers[] = 'From: Test <test@adlerweb.info>';
$headers[] = 'Cc: Test2 <test2@adlerweb.info>';
$headers[] = 'X-cleaned: cleaned';
//[…]
$headers[] = '  boundary="'.$boundary.'"';

//Neue Header und Content zusammenführen
$content = implode("\r\n", $headers)."\r\n\r\n".'-----'.implode('-----',$content);

//Mailversand
$check = mail($receiver, NULL, NULL, $content);

Nicht schön, da aber nur ersetzt/ergänzt wird muss nicht bei jeder Änderung der Quelle eine Anpassung erfolgen um Content und Header sauber zu trennen. Leider ist seit den letzten Versionen (vermutlich 5.4.43/5.5.26) diese Anwendung nicht mehr erlaubt. Hat man zwei Newlines (\r\n\r\n – genutzt zur Content-Trennung) im Header bricht PHP mit einer Fehlermeldung ab. Das Ganze soll dazu dienen Personen zu schützen, welche Fremddaten aus unsicheren Quellen ohne Eingabevalidierung nutzen und so ihre Anwendung verwundbar machen. Leider trifft es aber eben auch solche Anwendungen wie meine, was gerade bei solchen minor-Versions etwas unschön ist. Nunja, mein Script spricht nun direkt SMTP mit dem zuständigen Mailserver und umgeht so die PHP-mail()-Funktion. Problem solved.

Related:

PHP mail(): Sonderzeichen im Betreff richtig Codieren

Na das ist mir noch nie aufgefallen: Offenbar ist die mail()-Funktion von PHP nicht in der Lage deutsche Sonderzeichen im Betreff korrekt zu verarbeiten. Die erste Meldung besagte, dass der Betreff bei einigen Providern verstümmelt ankommen würde. Der IT-Fluch schlug natürlich wieder zu: Sowohl mein Thunderbird als auch K9-Mail und Roundcude zeigten keinen Fehler. Dankenswerterweise brachte dann Amavis die Erleuchtung:

X-Amavis-Alert: BAD HEADER SECTION, Non-encoded 8-bit data (char C3 hex):
Subject: Testm\303\203\302\244il

Argument, so passt das nicht… In den Mailheadern ist das genünschte „ä“ einfach nur als UTF-8-„ä“ vorhanden – E-Mails sind aber üblicherweise nur 7 Bit… Um den Betreff korrekt zu versenden muss man den String vorab mit mb_mime_mimeheader in die richtige Form bringen:

mail('empfang@emfang.em', mb_encode_mimeheader('Testmäil', 'UTF-8', 'Q'), 'Text');