Turtle: Reguläre Ausdrücke

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

  1. 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

    1. 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

      1. 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

        Vorgehensweise:

        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 ;)

        stristr();
          explode();
            echo base64_decode($explode_array[1]);
              echo "Ich hasse unnötige Reguläre Ausdrücke";

        Gruß aus Berlin!
        eddi

        1. Hallo Eddi,

          vielen Dank, Du hast mir weitergeholfen.

          Viele Grüsse aus Münster nach Berlin,
          Turtle