PHP und IMAP: Mails filtern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHP und IMAP: Mails filtern

    Hi zusammen,

    Folgenden Code habe ich mir zusammengeschustert :) Aber Wenn ich ihn ausführe wird die Variable Message nur beim ersten Durchlauf ausgegeben. Ich glaube das beim zweiten Durchlauf irgendwas mit der Count Variable schiefgeht, kann das sein?

    Quellcode

    1. <?php
    2. $imap = imap_open ("{mail.orczak.de/pop3:110}INBOX", "web2p2", "geändert");
    3. $check = imap_mailboxmsginfo ($imap);
    4. $newmails = $check->Recent;
    5. for($count = 1; $count <= $newmails; $count++)
    6. {
    7. $header = imap_header($imap, $count);
    8. $from = $header->from;
    9. foreach ($from as $id => $object) {
    10. $fromaddress = $object->mailbox . "@" . $object->host;
    11. }
    12. if($fromaddress == "matthias@orczaki.com"){
    13. $info = imap_fetch_overview($imap, $count);
    14. foreach ($info as $msg)
    15. {
    16. }
    17. $message = imap_body($imap, $count);
    18. $text = $msg->to;
    19. $needle = strpos($text, '@');
    20. $newnumber = substr($text, 0,$needle);
    21. echo $newnumber;
    22. echo $message;
    23. $cusid = "3537";
    24. $passwd = "aaaaaa";
    25. $dnis = $newnumber;
    26. $content = $message;
    27. $client = new SoapClient("http://webservices.venali.net/fax/1.0/faxservice.asmx?WSDL",array("trace" => 1, "exceptions" => 0));
    28. $params = array
    29. (
    30. "customerID" => $cusid,
    31. "password" => $passwd,
    32. "phone" => $dnis,
    33. "body" => $content
    34. );
    35. $res = $client->SendLite($params);
    36. print_r($res);
    37. imap_close ($imap);
    38. }
    39. else
    40. {
    41. echo "pech";
    42. }
    43. }
    44. ?>
    Alles anzeigen


    Merci für's reinschaun!

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Wenn du nach Mails von einem bestimmten Absender suchen willst, dann nutze [phpdoc]imap_search[/phpdoc].
    Deine Schleifenlösung ist aber sowieso überflüssig, da es nur einen Absender geben kann ;)

    In #19 bis #21 hast du wieder eine merkwürdige Schleifenlösung. Erst iterierst du durch alles durch und dann benutzt du das letzte Element ($msg->to).

    Stelle erstmal um auf imap_search und baue dann ein paar Ausgaben ein, damit wir wissen wo sich das Script befindet.

    Und bitte diesmal einrücken ;)
  • Kommt das nicht aufs selbe hinaus?

    Zur Zeit holst du alle Message IDs, lädst die Header von allen Message IDs und wertest diesen dann aus indem du den Absender vergleichst.

    Als Ergebnis der IMAP Suche erhältst du alle Message IDs der Nachrichten mit dem bestimmten Absender. Du sparst dir also die Zeilen 10-18 und dazu noch viel Wartezeit die durch die IMAP Anfragen entstehen.

    Was ich in deinem Code vermisse und was die Suche auch beherrscht: Du kannst das Flag UNSEEN hinzufügen. Dann faxt er eine Nachricht nicht jedes mal wieder durch,
  • HI!

    Also, das er es nicht jedesmal faxt wäre natürlich schon praktisch *dummymodeoff* ... ich dachte mir halt das in der Final dann die Nachricht vom Server gelöscht (oder verschoben wird) ....

    Hmmm... ich weiß nicht ob wir das gleiche meinen :)

    In der final wird in einer MySQL eine Row mit Emailadressen sein, ist der Sender einer Email da nicht drinnen wird das Fax nicht versendet. Im ersten Schritt möchte ich es halt mal nur mit einer einzigen und wenn das funzt kommt die Anbindung dran.

    Und nun überlege ich ob IMAP_SEARCH das richtige ist .... meinst du immer noch es wäre besser als mein Weg?

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • definitiv.. schau dir den Code mal an...

    Quellcode

    1. <?php
    2. $imap = imap_open("{imap.server.tld}INBOX","user","password");
    3. foreach(imap_search($imap, "FROM \"matthias@orczaki.com\" UNSEEN") as $id)
    4. $header = imap_headerinfo($imap, $id);
    5. echo "Send Fax to ". $header->to ." with contents: ".imap_body($imap, $id);
    6. }
    7. imap_close($imap);
    8. ?>


    etwas kürzer, oder?
  • Hi!

    Wenn ich den Code richtig verstehe passiert folgendes:

    imap_search($imap, "FROM \"matthias@orczaki.com\" UNSEEN"

    sucht in meiner Mailbox nach der obigen Emailadresse, wenn er diese findet wird weitergearbeitet, wenn nicht, dann ned, richtig?

    Okay, nun tritt aber anstelle der einzelnen Emailadresse ein Array mit Emailadressen und darin sind 1000 Emailadressen (als Beispiel) .... und wir gehen weiter davon aus das ich 10 Nachrichten in der Mailbox habe, macht es dann denn auch Sinn deinen Weg zu gehen? Denn dann wird ja 1000x die Mailbox durchsucht, richtig?

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Okay. (Du glaubst nicht wie froh ich bin mal nicht als Trottel dazustehen) :)

    Und wenn man nun genau das erreichen möchte ist mein Script doch okay, oder? Nur das eben bei den wiederholten Schleifendurchläufen die Variablen nicht mehr gefüllt werden, ergo beginnt die Schleife entweder zu spät oder aber mitm Counter passt was nicht, richtig?
    Und da hänge ich momentan ... :(

    Matthias

    P.S. Ich find es immer wieder Klasee euch gefunden zu haben, hier bekommt man wenigstens wirklich Hilfe ...
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Hi!

    Okay, ein bisschen Stolz darf ich sein denke ich - es läuft :)

    Hier der Code den ich mir gebastelt habe:

    Quellcode

    1. <?php
    2. $imap = imap_open ("{mail.hoster.de/pop3:110}INBOX", "web2p2", "changed");
    3. $check = imap_mailboxmsginfo ($imap);
    4. $rescheck = $check->Recent;
    5. $count = 1;
    6. while($count <= $rescheck)
    7. {
    8. $message = imap_body($imap, $count);
    9. $header = imap_header($imap, $count);
    10. $from = $header->from;
    11. $to = $header->to;
    12. foreach ($from as $id => $object) {
    13. $fromaddress = $object->mailbox . "@" . $object->host;
    14. foreach ($to as $id => $object)
    15. $toaddress = $object->mailbox;
    16. }
    17. $verify = "matthias@hosteri.com";
    18. if ( $fromaddress == $verify ) {
    19. echo $count."<br>".$toaddress."<br>".$message."<br>".$fromaddress."<br>";
    20. }
    21. else
    22. {
    23. echo $count." ".$fromaddress." Hier ist der Sender ein anderer"."<br>";
    24. }
    25. $count++;
    26. }
    27. ?>
    Alles anzeigen


    Und nun warte ich auf d0nUt der mir zeigt wie er den Code optimieren könnte (oder andere eben) :) Aber laufen tut er *freu*

    Matze
    Das Leben ist binär - du bist eine 1, oder eine 0
  • ich glaube ich habe jetzt auch durchschaut warum du die beiden foreach schleifen nutzt. 3 Schleifen ineinander sind sehr, sehr böse ;)

    Ich glaube du hast das Array Kapitel übersprungen :P
    An Index und Value kommst du mit [phpdoc]list[/phpdoc] und each

    Quellcode

    1. <?php
    2. $imap = imap_open ("{mail.hoster.de/pop3:110}INBOX", "web2p2", "changed");
    3. $check = imap_mailboxmsginfo ($imap);
    4. $count = 1;
    5. $verify = "matthias@hosteri.com";
    6. while($count <= $check->Recent) {
    7. $message = imap_body($imap, $count);
    8. $header = imap_header($imap, $count);
    9. list($id, $ob) = each($header->from);
    10. $fromaddress = $ob->mailbox . "@" . $ob->host;
    11. $ob = array_pop($header->to);
    12. $toaddress = $ob->mailbox;
    13. if ($fromaddress == $verify) {
    14. echo $count."<br />".$toaddress."<br />".$message."<br>".$fromaddress."<br>";
    15. } else {
    16. echo $count." ".$fromaddress." Hier ist der Sender ein anderer"."<br>";
    17. }
    18. $count++;
    19. }
    20. ?>
    Alles anzeigen


    Kleiner Schönheitsfehler: $object ist ein Schlüsselwort - das solltest du nicht verwenden.
  • *lach*

    Bloody NoOb against Specialist :) Da war der Ausgang ja klar :) ... ich habe ja auch nur geschrieben das der Code läuft, nicht das er valid is *grins* Aber wenigstens geb ich mir Mühe :)

    So, nun muss ich nur noch den "festen" Wert verify durch ein Array ersetzen welches durchsucht wird, und dann ist mein Test beendet (zumindestens der Part) :) Des krieg ich schon irgendwie hin, und dann post ich meinen Code wieder zum verbessern? :)

    MERCI auf jeden Fall,

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • So,

    Nachdem ich nicht schlafen konnte hier nun der Code der ein Array prüft und wenn der jeweilige Wert im Array ist wird entsprechend der if Schleife gehandelt.

    Leider ist der Code etwas "langsam" .... also beim Vergleich mit 3 Emailadressen braucht er schon so 1-4 Sekunden, wie des dann bei 1000 Vergleichen wohl aussieht? *grins* ... sicherlich habe ich mal wieder was nicht "optimal" sondern "nur" funktionell gelöst .... vielleicht weiß jemand Rat.

    Hier der Code:

    Quellcode

    1. <?php
    2. $imap = imap_open ("{mail.anbieter.de/pop3:110}INBOX", "web2p2", "changed");
    3. $check = imap_mailboxmsginfo ($imap);
    4. $count = 1;
    5. // $verify = "matthias@hosteri.com";
    6. while($count <= $check->Recent) {
    7. $message = imap_body($imap, $count);
    8. $header = imap_header($imap, $count);
    9. list($id, $ob) = each($header->from);
    10. $fromaddress = $ob->mailbox . "@" . $ob->host;
    11. $mysearch = array("matthias@hoster.com","matthias@nixda.de","matthias@web.de");
    12. if (in_array($fromaddress, $mysearch)) {
    13. $verify = $fromaddress;}
    14. $ob = array_pop($header->to);
    15. $toaddress = $ob->mailbox;
    16. if ($fromaddress == $verify) {
    17. echo $count."<br />".$toaddress."<br />".$message."<br>".$fromaddress.$verify."<br>";
    18. } else {
    19. echo $count." ".$fromaddress." Hier ist der Sender ein anderer".$verify."<br>";
    20. }
    21. $count++;
    22. }
    23. ?>
    Alles anzeigen


    Merci vorab :)

    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Da hatte ich mal wieder ne große Klappe glaube ich :)

    Könnte mir jemand die Richtung zeigen wie ich das am besten anstelle?

    In folgende Zeile gehören doch die Werte aus der MySQL, richtig?
    $mysearch = array("matthias@vi.com","matthias@nixda.de","matthias@web.de");


    Die MySQL Abfrage sollte doch so aussehen, oder?

    $lala = mysql_query("SELECT emailaddress FROM allowed");
    $row = mysql_fetch_row($result);

    Und da scheine ich meinen Fehler zu haben, richtig? mysql_fetch_row ist nicht was ich brauche, richtig? Wie also lautet hier der richtige Befehl?

    Merci,
    Matthias
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Sry, ich würds nicht unbedingt funktional nennen ;)

    Also das Array mit erlaubten Sendern solltest du VOR Beginn der while Schleife laden.
    Gerade wenn das ein MySQL Select ist, willst du den sicherlich nicht jedesmal wiederholen.
    Des weiteren solltest du imap_body erst holen, NACHDEM der Sender verifiziert wurde.

    Doch, mysql_fetch_row ist genau das richtige.
    Musst halt das Array füllen

    Quellcode

    1. $result = mysql_query("SELECT emailaddress FROM allowed");
    2. while($row = mysql_fetch_row($result)) {
    3. $mysearch[] = $row[0];
    4. }


    .. und versuch mal deinen Code formatiert zu lassen ;)