Email Header splitten

Shooter2k

Erfahrenes Mitglied
Hallo liebes Forum,
ich arbeite gerade an einem Webinterface das auf MySQL basiert. Ich möchte lediglich die Headerinformationen auslesen und dann Betreff + Nachricht in die DB packen.

Leider gelingt es mir nicht die Informationen zu Splitten(Subject:yxz). Kann mir vieleicht jemand sagen wie ich das am besten machen kann?

So sieht mein Header aus:

Return-Path: <sender@meineemail.de>
X-Flags: 1001
Delivered-To: GMX delivery to empf@email.de
Received: (qmail invoked by alias); 22 Jun 2009 21:56:41 -0000
Received: from mo-p00-ob.rzone.de (EHLO mo-p00-ob.rzone.de) [81.169.146.160]
by mx0.gmx.net (mx071) with SMTP; 22 Jun 2009 23:56:41 +0200
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1245707800; l=21;
s=domk; d=provider-email.de
h=Content-Transfer-Encoding:Content-Type:Subject:To:MIME-Version:From:
Date:X-RZG-CLASS-ID:X-RZG-AUTH;
bh=sNfMI26kL7M/XP91J3Xnf15CKnU=;
b=Yn3Fnm5BY+JTY44PRV7JgMPzU5Kk/v9XprA8dNq11ErKTf/fLxEd5ZhIpFiL71Rqw3D
nnnXYe0TgzKIrthVhk33OOyy9ApFDD0QsHqnynxC3iUDon7UqhPTw9MIllsnmdcEqCb6s
XdHInlpkjuVWVGjGoNV7UnbJHHHvzH1fVXw=
X-RZG-AUTH: :J2MKYUGjb98TFSEeFNALgw7I0fivszWPP4w4WG+y7iXTQDKykThZl3i4FHUrJgzNVP70
X-RZG-CLASS-ID: mo00
Received: from iMac.local (d065027.adsl.hansenet.de [80.170.1.27])
by post.strato.de (mrclete mo4) (RZmta 18.42)
with ESMTP id h01ba0l5MJ9FmM for <email@provider.com>;
Mon, 22 Jun 2009 23:56:40 +0200 (MEST)
Message-ID: <4A3FFE18.4090606@meineemail@yxc.de>
Date: Mon, 22 Jun 2009 23:56:40 +0200
From: =?UTF-8?B?SGVucnkgU2Nowp90dA==?= <kontakt@provider.de>

User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302)
MIME-Version: 1.0
To: empf@provider.de
Subject: ich bin ein test3
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-GMX-Antivirus: 0 (no virus found)
X-GMX-Antispam: 0 (Mail was not recognized as spam)
X-GMX-UID: L8sNckxAPjlsIHSNUjU248QzMTE2NYkY

test3 nachricht 123




Danke für die Hilfe
Gruß kenny
 
Trenne erst einmal den Kopf vom Rumpf. Das Bindeglied ist dabei die erste doppelte Zeilenumbruchsequenz (also \r\n\r\n). Dann kannst du den Kopf in sein Felder zerlegen. Zuvor machst du aus den mehrzeiligen Feldern aber einzeilige, indem du alle Zeilenumbrüche, denen weitere Leerraumzeichen folgen, entfernst (als reg. Ausdruck \r\n\s+). Die Felder kannst du dann an den übrigen Zeilenumbruchsequenzen zerlegen. Die Feldbezeichner und -werte sind dann wiederum durch das erste Doppelpunktzeichen gefolgt von Leerraumzeichen von einander getrennt (:\s+). Dann brauchst du nur noch das Feld zu suchen, dessen Bezeichner Subject ist.
 
Hallo Gumbo,
vielen Dank für deine Antwort. Ich habe das jetzt folgendermaßen gelöst:

$headers = explode("\r\n", $mail);
$anz = count($headers);

for($i=1; $i<=$anz-1;$i++){
$search = $headers[$i];
if ( ereg ("Subject", $search ) ) {
$subject = $headers[$i];
}
if ( ereg ("From", $search ) ) {
$from = $headers[$i];
}
if ( ereg ("Date", $search ) ) {
$date = $headers[$i];
}
...
}
Hier habe ich nun das $subject, $from, $date als Variable.

Nur plage ich mich gerade mit den Dateianhängen rum.
Normalerweise sind sie ja immer am Ende einer Mail und base64 encoded.

Ich war schon fast fertig mit meiner Arbeit und musste dann mit entsetzen feststellen, dass es einige kleine aber Unterschiede bei den MailProvidern gibt. Die das geschriebene wieder zur Nichte gemacht haben.

Beispiel:

Habe den kompletten Anhang wieder in Zeilen geteilt.

$in_rows = explode("\n", $body);

GMX schreibt in der ersten Zeile des Dateianhangs:

[9] => filename="image1.jpg"/9j/4AAQSkZJRgABAgEASABIAAD/4QUzRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEa

Also bestehend aus den Dateinamen und den Anfang des base64-encodeten teils.
Alles klar dachte ich mir und habe den filenamen vom base64-code getrennt und ihn dann später wieder zusammen geführt. Decoded und als File abgespeichert.

AppleMail schreibt in die erste Zeile:

Content-Transfer-Encoding: base64/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg

Wieder ein anderer Mix.

Und Googlemail:
X-Attachment-Id: f_fx4xakj50/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg

Es gibt auch einige Unterschiede in den letzten Zeilen des Dateianhangs.

Jetzt zu meiner Frage. Ist es möglich zu erkennen ob eine Zeile Base64 encoded wurde oder ob nicht? Das würde so einiges erleichtern.

Ich finde im Netz immer nur wie man Emailheaders erstellt, aber nicht wie mal sie in Parts aufteilt im Bezug auf die Dateianhänge und die unterschiedlichen Muster.

Gibt es nicht auf PHP basierte open source Webinterfaces(POP3) , wo man sich das ggf. abschauen könnte?

Warum gibt es dafür keine einheitliche Norm?
Gruß
Henry
 
Zuletzt bearbeitet:
Wie die Daten beschaffen sind, steht alles im jeweiligen Header. Du musst die Informationen nur herauslesen.
 

Neue Beiträge

Zurück