Reguläre Ausdrücke
Turtle
- php
Hallo Leute,
folgendes Problem:
Aus einer Email möchte ich mittels imap()-Funktionen den Datei-Anhang
(Format: csv-datei) ausfíltern.
Das funktioniert soweit alles ganz gut bis zu dem Punkt,
wo ich die csv-Datei aus dem email-body auslesen möchte.
SKRIPT:
$emailText="
--PART.BOUNDARY.1 Content-Type:
application/octet-stream;name=DATEI.CSV Content-Transfer-Encoding: base64
Content-Description:
<DATEI.CSV>MTU5fDEzMTAwMXwxfDB8MTEsNDV8MTEsNDV8TnwwfDB8MHw1fEF8RUFTWSBWRVJMxE5HRVJV
IFRBRSA2TSAgIDE4NjM4fHw4NjR8NTl8NTk3fDU5Nzl8THwNCjE5MXwzNDAwMDF8MXwwfDQs
LDM5fDEsMzl8TnwwfDB8MHwwfEF8V0MgRlJJU0NIIERVTyBBS1RJViBMT1RVUyAgTkZQfFdD
IEZyaXNjaCBGciBTcPxsZXIgTkZQfDMwNHwwfDB8MHxVfA0KGg== --PART.BOUNDARY.1--
";
$pattern = "/--PART.BOUNDARY.1.*Content-Description:.*<DATEI.CSV>(.*)--PART.BOUNDARY.1--/ismU";
if (preg_match($pattern, $emailText, $found))
{
echo $found[1];
}
offline funktiert es, leider online nicht.
warum, was mache ich da falsch?
$pattern = "/--PART.BOUNDARY(.*)--PART.BOUNDARY.1--/ism";
liefert online ein ergebnis,
$pattern = "/--PART.BOUNDARY.1.*Description(.*)--PART.BOUNDARY.1--/ism";
schon nicht mehr.
Ich bin schon seit Stunden am verzweifeln.
Viele GRüsse aus Münster, Turtle
Hallo Turtle,
--PART.BOUNDARY.1 Content-Type:
application/octet-stream;name=DATEI.CSV Content-Transfer-Encoding: base64
Content-Description:
Du bist sicher, daß es content-DESCRIPTION gibt?
Jedes vernünftigte, (jetzt die westenliche Einschränkung:) mir bekannte Mail-Programm liefert Subheader etwar in der Art:
Content-Type: application/octet-stream;
name="[...]"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="[...]"
MTU5fDEzMTAwMXwxfDB8MTEsNDV8MTEsNDV8T.........
Zu bemerken ist, das nach dem boundary zwischen Header und Inhalt immer zwei Textumbrüche sind..... ;)
Gruß aus Berlin!
eddi
Hallo,
Du bist sicher, daß es content-DESCRIPTION gibt?
Ja, bin ich.
Zu bemerken ist, das nach dem boundary zwischen Header und Inhalt immer zwei Textumbrüche sind..... ;)
Textumbrüche werden mit (.*) doch auch eingeschlossen, oder?
Viele Grüsse aus Münster,
Turtle
Hallo,
Textumbrüche werden mit (.*) doch auch eingeschlossen, oder?
Das gilt m. E. nur für die explizite Angabe des Modifier m, denn du ja angegeben hast. Aber mal so gefragt: Was macht noch mal der Modifier s? - und wie verhält sich wohl m und s auf unterschiedlichen Systemen?
Allgemein fällt mir noch eine andere Schwachstelle auf:
echo $found[1];
Beispielmail mit einem nicht unüblichem Content-Type: multipart/mixed; in der Abfolge des Inhaltes =>
text/plain
text/html
application/octet-stream
Nach applocation/octet-stream suchen
Ab dort nach Umbrüchen suchen "\n\n"
Ab dort den String nach den nächsten beiden Umbrüchen abtrennen
String decodieren
Glücklich sein ;)
Gruß aus Berlin!
eddi
Hallo Eddi,
vielen Dank, Du hast mir weitergeholfen.
Viele Grüsse aus Münster nach Berlin,
Turtle