Hallo Tom,
ich weiß nicht, ob es eine so gute Idee ist, die Darstellung des Zeilenumbruchs dem Server zu überlassen: Die meisten Server sind Unix-basiert und verwenden ein einfaches Linefeed (0x0A) als Zeilenumbruch; RFC2822 verlangt aber CR/LF (0x0D, 0x0A) als Zeilenumbruch.
Das ist nur die halbe Wahrheit und führ tdaher zu Fehlern.
sagen wir's mal so: Die Darstellung war wohl nicht ganz vollständig, okay.
Die Funktion Mail() kann nur als Helferlein für den Programmierer angesehen werden.
Es kommt auf die Art und Weise an, wie mail() die email zum MTA transportiert.
Richtig.
Auf Unix-Hosts wird hierfür meistens ein sendmail-Script verwendet. [...] Wesentlich ist, dass das Script JEDES der beiden Zeilenschaltungszeichen in CRLF verwandelt. Wenn also nun bereits ein CRLF geliefert wird, dann wird daraus ein CRLFCRLF, was offensichtlich dem MTA nicht behagen wird.
Dann ist die Implementierung defekt und gehört gegen etwas Ordentliches ausgetauscht. Ehrlich, diesen "Fehler" habe ich noch nirgends gesehen.
Tatsache ist wohl, dass viele sendmail-Implementierungen (und wohl auch manche MTAs) fehlerhafte Zeilenschaltungen korrigieren, indem sie _einzeln_ vorkommende LF oder CR in das vorgeschriebene CR/LF-Pärchen umwandeln. Enthält der angelieferte Code aber bereits CR/LF als Kombination, bleibt das normalerweise unangetastet.
Problematisch kann höchstens im Einzelfall sein, wenn "verkehrte" Zeilenumbrüche in der Form LF/CR übergeben werden. Das wird nicht immer korr^Wwie vom Autor erwartet erkannt und kann daher die CR/LF-Verdopplung auslösen, die du oben beschrieben hast.
Ergo: für mail(), wenn die Weiterverarebitung auf einem Unix-Host mittels sendmail geschieht (in der INI ist es ja eingetragen), dann nur LF verwenden für die Separierung der Header.
Ergo: Dem sendmail-Handler oder MTA korrekte Zeilenumbrüche (CR/LF) anzuliefern, ist in nahezu 100% der Fälle richtig; lediglich ein paar wenige, defekte Implementierungen verhunzen diese Zeilenschaltungen.
Die Mailheader (auch Sub-Header im Multipart-Mails) dagegen nur mit LF zu trennen, ist ein Glücksspiel, das oft funktioniert, aber nicht zuverlässig.
Wenn jedoch Windows als OS verwendung findet, dann wird meistens der MTA direkt über Port 25 gefüttert. Dann MUSS man CRLF verwenden, um die Header zu trennen.
Oder darauf hoffen, dass auch der MTA unvollständige Zeilenumbrüche erkennt und akzeptiert, ggf. sogar korrigiert.
Soweit jedenfalls meine Kenntnisse zu diesem Problem.
Wenn wir uns zusammentun, kommen wir der Wahrheit vermutlich sehr nahe. ;-)
Schönes Wochenende noch,
Martin