SystemMail vom DomainRobot Parsen - Hilfe :(

Dieses Thema im Forum "Entwicklerforum" wurde erstellt von Simone-Alicia, 9. Apr. 2016.

  1. Simone-Alicia

    Simone-Alicia Member

    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. robotto7831a

    robotto7831a Member

    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. Simone-Alicia

    Simone-Alicia Member

    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. robotto7831a

    robotto7831a Member

    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. Simone-Alicia

    Simone-Alicia Member

    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
     
  6. Till

    Till Administrator

    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.
     
    Simone-Alicia gefällt das.
  7. Simone-Alicia

    Simone-Alicia Member

    Vielen lieben Dank! :)
     
  8. robotto7831a

    robotto7831a Member

    So etwas in der Richtung hatte ich auch im Kopf.
     

Diese Seite empfehlen