PHP erkennt Carriage-Return nicht

PHP erkennt Carriage-Return nicht

am 24.10.2006 20:18:55 von dev-null-use-reply-adress

N'abend zusammen,

ich schreibe gerade an einem Mailinglistenscript.
Dieses läuft als CLI und erhält die Mails per STDIN.
Soweit, sogut, es funktioniert schon prima.
Eine Sache hat mich allerdings zur Verzweifelung gestrieben:

Ein wenig Code:

// Lese komplette Mail und trenne Header und Body
$mail = '';
while (!feof(STDIN)) {
$mail .= fgets(STDIN, 2048);
}
$header = '';
$body = '';
list($header,$body) = explode("\n\n", $mail, 2);

Weil mir die Verarbeitung der Header so leichter fällt,
mache ich aus mehrzeiligen Headern einzeilige:

$header = str_replace("\n\t", " ", $header);

Aber eigentlich ist da ja noch ein \r vor dem \n.
Also meine ersten Versuche:

$header = str_replace("\r\n\t", " ", $header);
oder
$header = preg_replace("/\x0D\x0A\x20/", " ", $header);
oder ...

Aber das war nix. Zur Laufzeit, oder wie auch immer ich das
ausdrücken soll, ist da scheinbar kein Carriage-Return.
Es muß doch aber eigentlich da sein. Wenn ich $header z.B.
in eine Datei speichern lasse, sehe ich das auch im
(Hex)editor.

Kann mir jemand verraten, was da schief läuft?


Gruß
JPM

Re: PHP erkennt Carriage-Return nicht

am 24.10.2006 21:05:24 von Ulf Kadner

Jens Peter Moeller schrieb:

> $header = str_replace("\n\t", " ", $header);
>
> Aber eigentlich ist da ja noch ein \r vor dem \n.
> Also meine ersten Versuche:
>
> $header = str_replace("\r\n\t", " ", $header);
> oder
> $header = preg_replace("/\x0D\x0A\x20/", " ", $header);
> oder ...
>
> Aber das war nix. Zur Laufzeit, oder wie auch immer ich das
> ausdrücken soll, ist da scheinbar kein Carriage-Return.

Wieso scheinbar bzw. wieso solltest Du das nicht überprüfen können?

Debug-Code:


edit D:\test.php

> > $header = ":->\r\n\t:-)\r\n\t:-]";
> if (!preg_match('~\r\n\t~',$header)) die('Da fehlt was!');
> echo 'Is OK.';
> ?>

D:\>php -f test.php
Is OK.

Selbes auch unter Linux.

Wenn das nicht mit deinem $header funktioniert ist auch nicht das drin
was Du erwartest.

printf('%x',$header); zeigt details ;-)

Haste mal nach bugs geschaut? Bei mir windows PHP5.1.6 Linux PHP5.1.4

MfG, Ulf

Re: PHP erkennt Carriage-Return nicht

am 24.10.2006 21:21:25 von dev-null-use-reply-adress

Ulf Kadner schrieb:
> Jens Peter Moeller schrieb:
>
>> $header = str_replace("\n\t", " ", $header);
>>
>> Aber eigentlich ist da ja noch ein \r vor dem \n.
>> Also meine ersten Versuche:
>>
>> $header = str_replace("\r\n\t", " ", $header);
>> oder
>> $header = preg_replace("/\x0D\x0A\x20/", " ", $header);
>> oder ...
>>
>> Aber das war nix. Zur Laufzeit, oder wie auch immer ich das
>> ausdrücken soll, ist da scheinbar kein Carriage-Return.
>
> Wieso scheinbar bzw. wieso solltest Du das nicht überprüfen können?

Eben weil kein irgendwas_replace mit \r funktioniert hatte.

> Debug-Code:

Ich hatte einfach ein

$fp = fopen('/home/admin/mailinglisten/debug.txt', 'w+');
fwrite($fp, header);
fclose($fp);

gemacht, weil das Script so ohne Pipe und Parameter ja
keine Daten bekommt *).

Die debug.txt habe ich mir dann mit Ultraedit angeschaut und
da ist definitiv \r\n hinter jeder Zeile. Nein, Ultraedit
macht beim Laden nicht automagisch \r\n aus \n.


Für mich ein Mysterium, aber egal, es funktioniert ja.


Gruß
JPM

*) /etc/mail/aliasas:
_foo: "| php /home/admin/mailinglisten/mailinglist.php foo@example.org"

Re: PHP erkennt Carriage-Return nicht

am 24.10.2006 21:35:47 von Ulf Kadner

Jens Peter Moeller schrieb:

> Ich hatte einfach ein
>
> $fp = fopen('/home/admin/mailinglisten/debug.txt', 'w+');
> fwrite($fp, header);
> fclose($fp);
>
> gemacht, weil das Script so ohne Pipe und Parameter ja
> keine Daten bekommt *).
>
> Die debug.txt habe ich mir dann mit Ultraedit angeschaut und
> da ist definitiv \r\n hinter jeder Zeile. Nein, Ultraedit
> macht beim Laden nicht automagisch \r\n aus \n.

Also meins macht das! Aber nur weil ichs so will und brauche.
Schreibs doch einfach sicherheitshalber mal in hexdezimaldarstellung in
die datei. Man weis ja nie!

Evtl. liegts ja auch an einem fehlenden Tabulator?

Ansonsten bin ich ratlos.

MfG, Ulf

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 10:34:53 von sk

Jens Peter Moeller schrieb:

> Aber das war nix. Zur Laufzeit, oder wie auch immer ich das
> ausdrücken soll, ist da scheinbar kein Carriage-Return.
> Es muß doch aber eigentlich da sein. Wenn ich $header z.B.
> in eine Datei speichern lasse, sehe ich das auch im
> (Hex)editor.
>
> Kann mir jemand verraten, was da schief läuft?

Nix geht hier schief.

In meiner Glaskukel steht du hast die Mails von einer *IX Kiste
heruntergeladen. Die meisten MTA's nehmen in den Mails das CR raus bevor
sie die Mail speichern. Aber halt nicht alle.

Um sicher zu gehen solltest du alle '\r' mit '' ersetzen, dann nur noch
auf "\n" oder "\t\n" oder "\n\n" usw. testen.

Daher ist PHP mal nicht dran Schuld.

Jörg

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 10:48:15 von Ulf Kadner

Jörg Singendonk schrieb:

> In meiner Glaskukel steht du hast die Mails von einer *IX Kiste
> heruntergeladen. Die meisten MTA's nehmen in den Mails das CR raus bevor
> sie die Mail speichern. Aber halt nicht alle.

Er schrieb doch bereits das die existieren wenn er sie in eine
Datei speichert.

Entweder das stimmt so nicht (bezweifle ich bei JP) oder ein Wurmloch
verursacht die Probleme.

MfG, Ulf

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 11:24:29 von sk

Ulf Kadner schrieb:

> Er schrieb doch bereits das die existieren wenn er sie in eine
> Datei speichert.
>
> Entweder das stimmt so nicht (bezweifle ich bei JP) oder ein Wurmloch
> verursacht die Probleme.

Oh Richtig im anderem Thread überlesen. Ultraedit läuft aber unter Windows.

> while (!feof(STDIN)) {
> $mail .= fgets(STDIN, 2048);
> }

Wenn das Script Daten über STDIN unter Windows lädt ist automatisch der
Textmode aktiv der dann aus "\r\n" einfach ein "\n" macht. STDIN muss
man unter Windows erst auf binär umschalten. Unter *IX natürlich nicht.

Jörg

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 11:37:10 von Ulf Kadner

Jörg Singendonk schrieb:

>> Er schrieb doch bereits das die existieren wenn er sie in eine
>> Datei speichert.
>>
>> Entweder das stimmt so nicht (bezweifle ich bei JP) oder ein Wurmloch
>> verursacht die Probleme.
>
> Oh Richtig im anderem Thread überlesen. Ultraedit läuft aber unter Windows.

Wohl wahr.

> Wenn das Script Daten über STDIN unter Windows lädt ist automatisch der
> Textmode aktiv der dann aus "\r\n" einfach ein "\n" macht. STDIN muss
> man unter Windows erst auf binär umschalten. Unter *IX natürlich nicht.

Die Datei wird unter Unix erzeugt! Sieht man doch an seinem 1. Posting.

MfG, Ulf

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 11:39:11 von Ulf Kadner

Ulf Kadner schrieb:

> Die Datei wird unter Unix erzeugt! Sieht man doch an seinem 1. Posting.

Am 2. Posting meine ich.

MfG, Ulf

Re: PHP erkennt Carriage-Return nicht

am 25.10.2006 12:00:33 von sk

Ulf Kadner schrieb:

>> Die Datei wird unter Unix erzeugt! Sieht man doch an seinem 1. Posting.

Bleibt zu klären wo das Script läuft was die Daten liest?

Wenn er Daten von *ix nach Windows zum lesen kopiert, könnte doch der
Ftp-Client, oder was auch immer, die CRs wieder eingefügt haben weil er
die Datei für ein Textfile hielt.

Ich denke der OP sollte mal sagen was er wo womit gemacht hat.

Jörg

Re: PHP erkennt Carriage-Return nicht

am 26.10.2006 10:09:58 von dev-null-use-reply-adress

Jörg Singendonk schrieb:
> Ulf Kadner schrieb:
>
>>> Die Datei wird unter Unix erzeugt! Sieht man doch an seinem 1. Posting.
>
> Bleibt zu klären wo das Script läuft was die Daten liest?
>
> Wenn er Daten von *ix nach Windows zum lesen kopiert, könnte doch der
> Ftp-Client, oder was auch immer, die CRs wieder eingefügt haben weil er
> die Datei für ein Textfile hielt.

Was soll ich sagen, genau das war es. Man, man, peinlich.
Für dieses Projekt verwendete ich einen anderen FTP-Zugang, der
auf Übertragungsmodus ASCII stand.
Ich hatte mir darüber einfach keine Gedanken gemacht, weil
mein Ultraedit ansonsten einfach immer korrekt mit allen
möglichen Dateiformaten umgeht und nicht eigenmächtig Umbrüche
ändert.


Gruß
JPM