Hello,
Wenn wir uns zusammentun, kommen wir der Wahrheit vermutlich sehr nahe. ;-)
Das sollten wir unbedingt auch nochmal tun.
Nur habe ich momentan leider nicht die Möglichkeiten, alles zu untersuchen und auszuprobieren.
Anfangen könnte man ja mal mit dem PHP-Source-Code von mail().
Einsteigen müsste wir da wohl Zeile 354 in /main/main.c
#if defined(PHP_PROG_SENDMAIL) && !defined(NETWARE)
define DEFAULT_SENDMAIL_PATH PHP_PROG_SENDMAIL " -t -i "
#elif defined(PHP_WIN32)
define DEFAULT_SENDMAIL_PATH NULL
#else
define DEFAULT_SENDMAIL_PATH "/usr/sbin/sendmail -t -i"
#endif
Hier wird bereits zwischen Windows, Unix und Netware unterschieden
/ext/standard/php_mail.h:
-------------------------
#ifndef PHP_MAIL_H
#define PHP_MAIL_H
PHP_FUNCTION(mail);
PHP_MINFO_FUNCTION(mail);
PHP_FUNCTION(ezmlm_hash);
PHPAPI extern int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd TSRMLS_DC);
#endif /* PHP_MAIL_H */
/ext/standard/mail.c
-------------------------
239 ff:
if (sendmail) {
#ifndef PHP_WIN32
if (EACCES == errno) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Permission denied: unable to execute shell to run mail delivery binary '%s'", sendmail_path);
pclose(sendmail);
return 0;
}
#endif
fprintf(sendmail, "To: %s\n", to);
fprintf(sendmail, "Subject: %s\n", subject);
if (headers != NULL) {
fprintf(sendmail, "%s\n", headers);
}
fprintf(sendmail, "\n%s\n", message);
ret = pclose(sendmail);
Das sollte Dir zu denken geben.
So hatte ich es auch in Erinnerung.
Die Standardheader To:, Subject: und die Zusatzheader als Paket werden alle nur mit "\n" an Sendmail übergeben.
Ich hatte dazu auch einen Dialog per email mit einem PHP-Programmierer, den ich leider zur Zeit nicht raussuchen kann. Ich befürchte, ich habe ihn nur im eMail-Programm abgelegt und nicht separat auf der Platte gespeichert.
Die Aussage war (auf Englisch und aus der Erinnerung wiedergegeben):
da sendmail und alle seine Derivate von einer Konsoleneingabe unter Linux/Unix ausgehen müssen, und diese ja nur "\n" produziert, werden die "\n" intern zu "\r\n" vervollständigt. Dabei gehen alle bekannte Scripte so vor, dass JEDES Zeichen einzeln aufgefüllt wird, also sowohl ein "\r" als auch ein "\n" zu "\r\n" wird. Es wird NICHT darauf geachtet, ob die beiden bereits im Pärchen "\r\n" oder "\n\r" (das wäre sowieso falsch herum) auftreten.
Die mail-Funktion in PHP wurde deshalb für die Übergabe an sendmail so programmiert.
Man darf dann also KEINESFALLS zur Begrenzung der (selbst definierten) Header "\r\n" benutzen!
Für die Ausgabe an Windows (oder Netware) werden alle Parameter nur 1:1 durchgereicht.
Liebe Grüße
Tom vom Berg
Nur selber lernen macht schlau