SystemMail vom DomainRobot Parsen - Hilfe :(

#1
Hallo Zusammen,

ich versuche derzeit ein DomainModul zu schreiben, welches es ermöglicht Domains direkt beim Registrar (InternetX / AutoDNS) zu registrieren.
Die kommunikation erfolgt prinzipiell über ein XML-API, das ist auch soweit kein problem. Jedoch bekomme ich natürlich auch asynchrone Antworten vom Registrar bzw. von der Registry über mail. Nun stehe ich irgendwie auf dem Schlauch, wie ich die SystemMail parsen kann.
Also der IMAP connect und das ausgeben der Nachricht im PlainText war kein problem. Nun müssen halt die Datenfelder seperat in die jeweiligen Spalten einer MySQL DB geschrieben werden. Der Aufbau der Mails sieht folgendermaßen aus:

Code:
<system>
user: 1122334455
task: 0102
status: S0102 [Die Domain wurde erfolgreich aktualisiert.]  // Hier brauche ich nur den Statuscode, der keine feste länge hat
autoupdate: true
</system>

<reply>
tld: de
sld: my-domain
owner: 11223344
owner_context: 4
owner-c: 123123123
admin-c: 123123123
tech-c: 456456456
zone-c: 345345345
nserver: ns1.mein-dns.de
nserver: ns2.mein-dns.de
period: 1
status: success
registry_status: ACTIVE
registrar_status: ACTIVE
autorenew: true
authinfo:
</reply>

<notify>
Unformatierter Text als Kommentar
</notify>
Was ich nun bönötige ist dies:
Code:
$user = Inahlt aus Antwortmail
$task = Inahlt aus Antwortmail
$status = Inahlt aus Antwortmail
$autoupdate = Inahlt aus Antwortmail
$tld = Inahlt aus Antwortmail
$sld = Inahlt aus Antwortmail
$owner = Inahlt aus Antwortmail
$owner_context = Inahlt aus Antwortmail
$owner-c = Inahlt aus Antwortmail
$admin-c = Inahlt aus Antwortmail
usw..............
Bei XML ist halt alles klar strukturiert, aber in dem Fall wo die Datenfelder nicht klar definiert sind, weiß ich derzeit nicht wie ich es angehen soll. Bei versuchen mit preg_match_all() oder explode() sind alle gescheitert :( Ich hoffe hier kann mir jemand helfen.

Vielen lieben Dank schon im Voraus :)
Liebe Grüße
Simone
 
#2
Hallo Simone,

ich habe würde die Antwort Zeilenweise lesen und dann nach dem Doppelpunkt suchen. Der Teil vor dem Doppelpunkt ist die Variable und der Teil hinter dem Doppelpunkt ist der Wert.
 
#3
Hi,
ja ans zeilenweise Auslesen habe ich auch schon gedacht. Mein Gedanke war dann, die Datenfelder aus der Mail mit
Code:
list($user, $task, $status, $owner, etc.....) = explode(":", $data);
zu erfassen und in die Variablen zu schreiben. Geht aber nicht :( da die Datenfelder in der Mail jenach Auftragsart immer anders sind.
D.h. ich müsste vorher erstmal checken was überhaubt da ist, und das was da ist in die entsprechende Variablen einsortieren (Das einzige was konstant ist sind meine vordefinierten Variablen über die Datenfelder die ich benötige) und den rest den ich von den Informationen nicht benötige verwerfen bzw. ignorieren. Und an dem Punkt scheiterts momentan an meinem logischen Denken.

Liebe Grüße
Simone
 
#4
Mit dem explode ist schon mal gut. Dann würde ich mit foreach über das Array laufen und schauen ob in Array[0] z. B. ein "user" enthalten ist. Wenn ja, dann $user= Array[1]. Und dann die nächste Prüfung. So bekommst du nach und nach die Variablen gefüllt.
 
#5
Hi, danke schonmal :) manchmal sieht man vor lauter Bäumen den Wald nicht. Trotzdem habe ich noch ein Problem, in der ganzen E-Mail gibt es das Datenfled "status" 2x; einmal im <system> Tag und einmal im <reply> Tag, wie kann ich die nun auseinanderhalten und in zwei verschiedene Variablen schreiben?

Code:
$tmp = explode("\n", $message);

foreach ($tmp as $data)
{
   $array = array("", "");
   $output = explode(':', $data, 2);
   if ($output[0] == "user") { $user = $output[1];}
   if ($output[0] == "task") { $task = $output[1];}
   if ($output[0] == "status") { $sys_status = $output[1];}
   if ($output[0] == "tld") { $tld = $output[1];}
   if ($output[0] == "sld") { $sld = $output[1];}
   if ($output[0] == "status") { $rep_status = $output[1];} // ????????????????

   }
Liebe Grüße
Simone
 

Till

Administrator
#6
Wenn Du die Email zeilenweise liest dann kannst Du ja auch feststellen in welchem Segment der mail Du bist. So in etwa:

$section_info = false;
$section_reply = false;

Dann das foreach durch die zeilen, wobei Du da prüfts:

if($line == '<system>') $section_system = true;
if($line == '</system>') $section_system = false;
if($line == '<reply>') $section_reply = true;
if($line == '</reply>') $section_reply = false;

so dass Du im weiteren Code innerhalb des loops immer genau weißt, in welcher Sektion Du bist und somit auch weißt, um welchen status tag es sich handelt.
 

Werbung

Top