![]() |
[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:
Mir würde Betreff + Nachricht + Absender reichen.
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 ....
geht das mit regulären Ausdrücken? Denn ich kann irgendwie keine Regelmäßigkeit feststellen, nach der man das parsen könnte. Grüße |
Re: [PHP] E-Mail-String parsen
Moin,
lass den String mal durch explode durchlaufen:
Code:
Das sollte einiges einfacher machen ;)
$data = explode("\n\r", $email_string);
Greetz alcaeus |
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:
Grüße
...
[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 |
Re: [PHP] E-Mail-String parsen
Ich denke, dass RFC2822 weiterhelfen könnte, dort ist der "klassische" Aufbau von Emails beschrieben:
![]() Dort steht auch etwas über die Trennung von Header und Body: Zitat:
|
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:
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.
$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' => '', ), ); Grüße |
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 |
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:
aufrufe, erhalte ich nur ein Array-Item. Ich kann in der RFC-Beschreibung dazu auch nichts finden. :gruebel:
explode("\r\n\r\n", $mail_str);
Grüße |
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)
|
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 08:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz