Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] E-Mail-String parsen (https://www.delphipraxis.net/120641-%5Bphp%5D-e-mail-string-parsen.html)

Matze 14. Sep 2008 10:40


[PHP] E-Mail-String parsen
 
Hallo,

ich habe nun sehr lange herumprobiert und nachgeforscht, aber keine Möglichkeit gefunden, ohne großen Aufwand einen E-Mail-String zu parsen.
Dieser kann z.B. so aussehen:

Code:
1067 Return-Path: X-Original-To: [email]mail@domain.com[/email] Delivered-To: [email]abc@def.myserver.com[/email] Received: from mail.gmx.net (mail.gmx.net [213.165.164.203]) by [email]abc@def.myserver.com[/email] (Postfix) with SMTP id 00A9B420EDB3B for ; Sun, 14 Sep 2008 11:18:16 +0200 (CEST) Received: (qmail invoked by alias); 14 Sep 2008 09:18:14 -0000 Received: from p5B162543.dip.t-dialin.net (EHLO [192.168.178.241]) [91.222.167.99] by mail.gmx.net (mp045) with SMTP; 14 Sep 2008 11:18:14 +0200 X-Authenticated: #17560521 X-Provags-ID: V01U2FsdGVkX12bIAIDLTUbdOsRRVUoeN2u46Vpvt48ezOmwb1hVw ad4kl9ATYTyzNB Message-ID: <48CCD281.30703@gmx.de> Date: Sun, 14 Sep 2008 11:21:05 +0200 From: Matthias Hielscher User-Agent: Thunderbird 2.0.0.16 (Windows/20080708) MIME-Version: 1.0 To: [email]mail@domain.com[/email] Subject: Test-Betreff Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-FuHaFi: 0.00 X-KasLoop: m0123cf6 Test-Nachricht ....
Mir würde Betreff + Nachricht + Absender reichen.

geht das mit regulären Ausdrücken? Denn ich kann irgendwie keine Regelmäßigkeit feststellen, nach der man das parsen könnte.

Grüße

alcaeus 14. Sep 2008 10:48

Re: [PHP] E-Mail-String parsen
 
Moin,

lass den String mal durch explode durchlaufen:
Code:
$data = explode("\n\r", $email_string);
Das sollte einiges einfacher machen ;)

Greetz
alcaeus

Matze 14. Sep 2008 11:19

Re: [PHP] E-Mail-String parsen
 
Hi Andy!

Tatsache, danke. Mit "\n" (ohne "\r") sieht das schon besser aus.

Ich vermute, dass ich dann die Einträge alle durchgehen schauen muss, welcher mit "Subject: " beginnt, um den Betreff zu erhalten. Ebenso beim Absender. Doch wie erhalte ich die eigentliche Nachricht?

Code:
...
[20] => Content-Transfer-Encoding: 7bit
[21] => X-Y-GMX-Trusted: 0
[22] => X-FuHaFi: 0.00
[23] => X-KasLoop: m0123cf6
[24] => Test-Nachricht
[25] => ....
[26] => Ciao
Grüße

Daniel 14. Sep 2008 11:37

Re: [PHP] E-Mail-String parsen
 
Ich denke, dass RFC2822 weiterhelfen könnte, dort ist der "klassische" Aufbau von Emails beschrieben:
http://www.faqs.org/rfcs/rfc2822.html

Dort steht auch etwas über die Trennung von Header und Body:

Zitat:

The body is simply a sequence of characters that follows the header and is separated from the header by an empty line (i.e., a line with nothing preceding the CRLF).

Matze 14. Sep 2008 15:10

Re: [PHP] E-Mail-String parsen
 
Danke, aber das sieht sehr kompliziert aus.
Ich habe es nun so gelöst, dass ich die Regeln manuell festlege, bevor ich mich da ewig aufhalte:

Code:
$parser_beginnings = array(
   'date' => 'Date: ',
   'from' => 'From: ',
   'to' => 'X-Original-To: ',
   'subject' => 'Subject: ',
);

$parser_between_lines = array(
   'message' => array(
      'start_line' => 'X-KasLoop: ',
      'end_line' => '',
   ),
);
Nicht sonderlich schön, aber es geht und kann bei einem Serverumzug auch leicht angepasst werden. Ich rufe damit nur Mails ab, die an die aktuelle Domain adressiert werden, daher reicht mir dies aus.

Grüße

alcaeus 14. Sep 2008 16:33

Re: [PHP] E-Mail-String parsen
 
Moin Matze,

wenn du eine Mail nimmst und parst, kannst du sie erstmal am doppelten Umbruch splitten. Alles was vorher kommt sind Header, alles was nachher kommt ist Nachricht.
Anschliessend kannst du den Header nochmal an den einfachen Umbruechen splitten und dort das rauspicken, was du brauchst. Da kannst du dann jede Zeile am Trennzeichen (:) splitten, und hast den Namen des Headers und die Daten. Ist auf alle Faelle schneller und sicherer als mit preg_match() drueberzugehn.

Greetz
alcaeus

Matze 14. Sep 2008 18:50

Re: [PHP] E-Mail-String parsen
 
Hi,

das haut bei mir nicht hin. Die einzelnen Einträge werden übrigens mit "\r\n" getrennt und nicht mit "\n\r". Aber wenn ich

Code:
explode("\r\n\r\n", $mail_str);
aufrufe, erhalte ich nur ein Array-Item. Ich kann in der RFC-Beschreibung dazu auch nichts finden. :gruebel:

Grüße

S2B 18. Sep 2008 15:46

Re: [PHP] E-Mail-String parsen
 
Viele E-Mail-Clients halten sich leider nicht an den Standard... Du könntest evtl. zuerst einmal alle Zeilenumbrüche zu \n umwandeln und dann nach dem ersten Doppelumbruch suchen. Das sollte dann so funktionieren:
Code:
explode("\n\n", $mail_str, 2)

Matze 18. Sep 2008 18:02

Re: [PHP] E-Mail-String parsen
 
Hallo Simon,

danke. Da es mit meiner Lösung ganz gut funktioniert, lasse ich es vorerst einmal so. Da bin ich auch flexibler, wenn sich nicht jeder an den Standard halten sollte.

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz