Leere Zeile im Quelltext einer html-Mail
Hugo Egon Balder
- php
Hallo Leute,
ich versuche mich gerade im Schreiben eines Newsletter-Systems, bei dem die Besucher nach Eingabe von Namen und Mailadresse eine Mail mit einem Bestätigungslink erhalten.
Das Versenden der Mail funktioniert wunderbar. Ich habe auch keine Probleme mit Umlauten oder Kodierungen. Nur eines ist mir aufgefallen und ich komme einfach nicht dahinter, woran das liegen kann.
Bei allen html-Mails, die ich persönlich als Newsletter bekomme, fängt der Quelltext der Mail in der obersten Zeile an. Bei den Mails, die durch mein Skript ankommen, ist aber jedes mal die oberste Zeile leer und der Quelltext fängt erst in der 2. Zeile an. Woran kann das liegen?
2 Ausschnitte aus dem Code:
$mailinhalt="<html>\n<head>\n</head>\n<body>\n<p>Hallo ".htmlspecialchars($_POST['vorname'])." ".htmlspecialchars($_POST['familienname'])."</p>\n<p>Vielen Dank für die Bestellung <b>unseres</b> Newsletters!</p>\n<p>Auf Wiedersehen!</p>\n</body>\n</html>";
[...]
if(mail($empfaenger,$betreff,$mailinhalt,$header, "-fadmin@example.com"))
{
echo"Mail wurde gesendet.";
}
else
{
echo"Mail wurde nicht gesendet!";
}
Wieso kommt es da zu der Leerzeile, bevor es dann in der 2. Zeile mit dem <html> losgeht?
Danke für Erklärungen!
Hugo E.B.
Ich hatte grade eine Vermutung, die sich als richtig herausgestellt hat.
Hier ein weiterer Ausschnitt des (ursprünglichen) Codes:
$header="";
$header.="MIME-Version: 1.0\n";
$header.="Content-type: text/html; charset=utf-8\n";
$header.="Content-Transfer-Encoding: 8bit\n";
$header.="From: ".$sender."\n";
$header.= "Delivered-To: ".$empfaenger."\n";
Ich hab mir überlegt, wenn der Inhalt der Mail nach dem Header gesendet wird, dann bewirkt vielleicht der Zeilenumbruch im letzten Teil der Header-String-Zusammenführung diese leere Zeile. Wenn ich das entferne und ein
$header.= "Delivered-To: ".$empfaenger;
daraus mache, verschwindet die Leerzeile im Quelltext der angekommenen Mail. Eigentlich eh ganz logisch, wenn ich drüber nachdenke, aber das sah ich zuerst nicht. Dann bitte ich um Entschuldigung für die Störung!
LG
Hugo E.B.
Moin!
Ich hatte grade eine Vermutung, die sich als richtig herausgestellt hat.
Ja... Oftmals genügt es ein Problem richtig zu beschreiben um selbst auf die Lösung zu kommen. Deine beiden Einträge sind ein Beispiel dafür und insofern hast Du gerade keinen Grund um Nachsicht zu bitten.
Schade, dass mancher der hier oft fragenden dies nicht begreift.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Hello,
dies ist übrigens ein exquisites Beispiel für die Verwendung der Konstante PHP_EOL, von der in einem anderen Thread bereits die rede war:
$header = '';
$header .= 'MIME-Version: 1.0'.PHP_EOL;
$header .= 'Content-type: text/html; charset=utf-8' . PHP_EOL;
$header .= 'Content-Transfer-Encoding: 8bit' . PHP_EOL;
$header .= 'From: '. mail_header_encode($sender) . PHP_EOL;
$header .= 'Delivered-To: ' . mail_header_encode($empfaenger);
Außerdem müssen alle Eingaben im Header entsprechend "kastriert" und passend codiert werden (keine Zeichen über Codepoint 0xFF), was ich hier mal durch die erfundene Funktion mail_header_encode() andeute.
In Mails muss laut RFC 2822 und anderen immer 'CR LF' als Zeilenumbruch verwendet werden. Auf Linux-Systemen wird dies jedoch durch das Zusammenspiel von PHP und dem Script, dem der Mailversand obliegt, bewerkstelligt. In allen Headern der Mail wird automatisch "\n" durch "\r\n" ersetzt. Man darf daher in den Headern deshalb nur "\n" benutzen.
Auf WinDOSen benutzt PHP bei mail() automatisch den Port 25 (SMTP-Server) für den Mailversand und übergibt bereits eine fertige Mail. Daher _muss_ auf WinDOSen immer "\r\n" als Zeilenumbruch benutzt werden.
Die Konstante PHP_EOL ist entsprechend geladen, und sollte daher auch benutzt werden, damit PHP-Scripte ohne Nachbasteleien von WinDOSen auf Linuxhosts übertragen werden können.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Die Konstante PHP_EOL ist entsprechend geladen, und sollte daher auch benutzt werden, damit PHP-Scripte ohne Nachbasteleien von WinDOSen auf Linuxhosts übertragen werden können.
Ja, aber ich würde es nicht an der Stelle tun, an der du es im Code gezeigt hast.
Was du bzgl. des Handlings durch die Mailserver schreibst, stimmt zwar im großen und ganzen - aber es gibt auch ab und zu mal welche, die davon abweichendes Verhalten zeigen.
Deshalb würde ich eher an der Stelle, wo Zeilenumbrüche in Mail-Header eingefügt werden sollen, eine selbstdefinierte Konstante verwenden - die zwar mit dem Wert von PHP_EOL vorbelegt ist, aber dadurch auch einfache Anpassung an einer zentralen Stelle im Script erlaubt, falls man doch mal den „anderen“ Zeilenumbruch benötigen sollte, der nicht mit dem Wert von PHP_EOL auf dem jeweiligen System übereinstimmt.
MfG ChrisB
Hello,
Die Konstante PHP_EOL ist entsprechend geladen, und sollte daher auch benutzt werden, damit PHP-Scripte ohne Nachbasteleien von WinDOSen auf Linuxhosts übertragen werden können.
Ja, aber ich würde es nicht an der Stelle tun, an der du es im Code gezeigt hast.
Was du bzgl. des Handlings durch die Mailserver schreibst, stimmt zwar im großen und ganzen - aber es gibt auch ab und zu mal welche, die davon abweichendes Verhalten zeigen.Deshalb würde ich eher an der Stelle, wo Zeilenumbrüche in Mail-Header eingefügt werden sollen, eine selbstdefinierte Konstante verwenden - die zwar mit dem Wert von PHP_EOL vorbelegt ist, aber dadurch auch einfache Anpassung an einer zentralen Stelle im Script erlaubt, falls man doch mal den „anderen“ Zeilenumbruch benötigen sollte, der nicht mit dem Wert von PHP_EOL auf dem jeweiligen System übereinstimmt.
Wann sollte das sein?
Die Mail()-Funktion von PHP verlangt bei OS=Linux eutomatisch das Setzen des "sendmail-Scriptes" und bei OS=WinDOS benutzt sie automatisch den SMTP-Server (über Port 25).
Das "Sendmail-Script" muss sich an die Gepflogenheiten auf Linuxen halten und die Zeilenumbrüche ersetzen.
Dass man hier nochmals eine Translationsschicht einzieht kann nicht falsch sein, ist aber mMn hier nicht notwendig.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg