Seite 1 von 1

Regex und Mailheader

Verfasst: 08.09.2012, 21:17
von 13pixelchen
Hallo,

ich möchte aus dem Mailquelltext den From-Header extrahieren, der sieht ja so aus:
From: abcöäü <mail@mail.de>
oder auch so:
From: "abcöäü" <mail@mail.de>

Habe das hier versucht was nicht funktioniert:
#\^From: [^<]* <(.*)>\]#m

Hat jemand bessere Ideen?

Verfasst:
von

Verfasst: 08.09.2012, 23:00
von Melegrian
Der Ausdruck an sich ist nicht das Problem, nur je nachdem was Du da benutzt, solltest Du beim Einlesen Hochkomma maskieren.

Code: Alles auswählen

<?php

$string = "From&#58; \"abcöäü\" <mail@mail.de>";
$muster = "/From&#58;&#40;.+&#41;<&#40;.+&#41;\.&#40;\w&#41;&#123;2,4&#125;>/i";

preg_match&#40;$muster, $string, $ausgabe&#41;;

echo htmlspecialchars&#40;$ausgabe&#91;0&#93;&#41;."\n";


// Ausgabe&#58; From&#58; "abcöäü" <mail@mail.de> 
?>
Kommt aber darauf an, wie Du die ein- und auslesen möchtest, beim Durchsuchen von Dateien ist es nicht zwingend erforderlich.

Code: Alles auswählen

<?php

$datei = fopen&#40;"abc.html", "r"&#41;; 
$muster = "/From&#58;&#40;.+&#41;<&#40;.+&#41;@&#40;&#91;-\w&#93;+&#41;\.&#40;&#91;a-z&#93;&#41;&#123;2,4&#125;>/i";

while &#40;!feof&#40;$datei&#41;&#41; &#123;
    
	$suche_in= fgets&#40;$datei, 1000&#41;;
	
	if &#40;stripos&#40;$suche_in, "from&#58;"&#41;!== false&#41; &#123;
	
		preg_match&#40;$muster, $suche_in, $ausgabe&#41;;	
		
		echo htmlspecialchars&#40;$ausgabe&#91;0&#93;&#41;."\n";
    &#125;	
&#125; 
fclose &#40;$datei&#41;;
?>
Habe jetzt mal beide Ausdrücke etwas abgewandelt, der letztere gefällt mir etwas besser, obwohl der erste Ausdruck genügen sollte.

Verfasst: 09.09.2012, 10:41
von 13pixelchen
Habs nochmal abgewandelt zu /From: ((.+)@([-\w]+)\.([a-z>]){2,5})/i

Verfasst: 09.09.2012, 10:56
von 13pixelchen
Allerdings tuts dann für .co.uk nicht.

Verfasst: 09.09.2012, 13:36
von Melegrian
13pixelchen hat geschrieben:Habs nochmal abgewandelt zu /From: ((.+)@([-\w]+)\.([a-z>]){2,5})/i
Bei Aufnahme von > in einer Zeichenklasse spielt die Reihenfolge der in der Zeichenklasse enthaltenen Zeichen keine Rolle mehr und der Teilausdruck würde auch mit .a>bcd übereinstimmen. Der Teilausdruck \.([a-z]){2,4}> passt hingegen nur auf .ab> bis .abcd>.

Damit der Ausdruck auch auf .co.uk passt, nimmst Du den Punkt noch einen Teilausdruck weiter vorn auf bei ([-.\w]+).

Die Datei abc.html enthält:

Code: Alles auswählen

Erste Zeile ...
From&#58; "abcöäü" <mail@mail-_mail.de>
Dritte Zeile ...
From&#58; "abcöäü" <mail@mail-_mail.co.uk>
Fünfte Zeile ...
Ausgabe getestet mit:

Code: Alles auswählen

<?php

$datei = fopen&#40;"abc.html", "r"&#41;; 
$muster = "/From&#58;&#40;.+&#41;<&#40;.+&#41;@&#40;&#91;-.\w&#93;+&#41;\.&#40;&#91;a-z&#93;&#41;&#123;2,4&#125;>/i";

while &#40;!feof&#40;$datei&#41;&#41; &#123;
    
	$suche_in= fgets&#40;$datei, 1000&#41;;
	
	if &#40;stripos&#40;$suche_in, "from&#58;"&#41;!== false&#41; &#123;
	
		preg_match&#40;$muster, $suche_in, $ausgabe&#41;;	
		
		echo htmlspecialchars&#40;$ausgabe&#91;0&#93;&#41;."<br>\n";
    &#125;	
&#125; 
fclose &#40;$datei&#41;;

/*
Ausgabe&#58; 

From&#58; "abcöäü" <mail@mail-_mail.de>
From&#58; "abcöäü" <mail@mail-_mail.co.uk>
*/
?>
Und was hast Du damit vor? Ich hoffe, ich helfe Dir hier nicht bei Schandtaten, die in einer Grauzone liegen.

Verfasst: 09.09.2012, 13:44
von 13pixelchen
Ich will eingehende Mails automatisch in eine Datenbank kloppen. Ich habs geändert zu /From: ((.+)@([-\w]+)\.([a-z>\.])*)/i so das auch "From: mail@mail.de" erfasst wird, quasi einfach alles bis zum Ende der Zeile. Danke für Deine Hilfe. Tipp: https://www.myregextester.com/