Stefan: Script um eMails in eine Datenbank zu schreiben

Hallo,

ich habe ein Script geschrieben, dass meinen eMail-Account auf bestimmte eMails überprüft, relevante eMails (Identifikation durch Angabe einer bestimmten Kennung) in eine Datenbank schreibt und anschließend löscht. eMails, die nicht den Kriterien entsprechen, werden nicht berücksichtigt. Das Script läuft soweit einwandfrei, allerdings muss ich es immer mehrmals aufrufen, bis auch wirklich alle relevanten eMails in die Datenbank geschrieben bzw. anschließen gelöscht wurden. Hat jemand eine Idee woran das liegt?

Weiterhin wäre ich für Verbesserungsvorschläge (evtl. zur Optimierung) sehr dankbar, da das Script später einmal über einen Cronjob laufen soll.

Vielen Dank an alle,

Stefan

Hier das Script: <? // (C)2003 by  Stefan Spieren // stefan@spieren.de // http://stefan.spieren.de // // Dieser Header, der Scriptname und alle anderen Kommentare in // diesem Script müssen intakt bleiben.

//Zugangsdaten MySQL $server = ""; $user = ""; $pass = ""; $db = ""; $table = "";

$conn = @mysql_connect($server, $user, $pass); if (!$conn) {echo "Datenbankfehler!"; exit;} $verbindung = @mysql_select_db($db); if (!$verbindung){echo "Datenbank existiert nicht"; exit;}

//Zugangsdaten Mailbox $username = ""; $password = ""; $mailserver = ""; //POP=110, IMAP=143

//Einstellungen $subject_kennung = "APO"; $body_auswertung = "###BESTELLUNG###"; $bestellung_name = "Bestellung:"; $adresse_name = "Adresse:"; $telefon_name = "Telefon:"; $nachricht_name = "Nachricht:";

//Mailbox öffnen $mbox = imap_open("{$mailserver}INBOX",$username,$password); $mail_insg = imap_num_msg($mbox);

//alle vorgemerkten Mails löschen if($QUERY_STRING==delall) { imap_expunge($mbox); }

if(imap_num_msg($mbox)!=0) { $mail_norel=""; $entryok="0"; for ($i = 1; $i <= imap_num_msg($mbox); $i++) {

$header = imap_headerinfo($mbox, $i, 80, 80);

$from = $header->from[0]; $name = $from->personal; $email = $from->mailbox . "@" . $from->mailbox; $subject = $header->fetchsubject; $date = $header->udate; $messageBody = imap_body($mbox, $i);

//Prüfen ob Mail erlaubte Mail, Filtern nach $subject_kennung     if (ereg($subject_kennung,$subject))     {

//Prüfen ob HTML             if (eregi('<body',$messageBody))             {             preg_match_all("=<body[^>]>(.)</body>=siU", $messageBody, $a);             $messageBody = strip_tags($a[1][0]);             }

//Bereich festlegen         $start_bereich = strpos($messageBody,$body_auswertung)+strlen($body_auswertung);         $ende_bereich = strrpos($messageBody,$body_auswertung);         $laenge_bereich = $ende_bereich-$start_bereich-strlen($body_auswertung);

$bereichBody = trim(substr($messageBody, $start_bereich, $laenge_bereich));

//Positionen bestimmen         $positionen_start = 0;         $bestellung_start = $positionen_start+strlen($bestellung_name);         $adresse_start = strpos($bereichBody,$adresse_name)+strlen($adresse_name);         $telefon_start = strpos($bereichBody,$telefon_name)+strlen($telefon_name);         $nachricht_start = strpos($bereichBody,$nachricht_name)+strlen($nachricht_name);         $positionen_ende = strlen($bereichBody);

//Längen berechnen         $bestellung_laenge = $adresse_start-strlen($adresse_name)-strlen($bestellung_name);         $adresse_laenge = $telefon_start-$adresse_start-strlen($telefon_name);         $telefon_laenge = $nachricht_start-$telefon_start-strlen($nachricht_name);         $nachricht_laenge = $positionen_ende;

//Ausgabe der Positionen bestimmen         $bestellung = trim(substr($bereichBody, $bestellung_start, $bestellung_laenge));         $adresse = trim(substr($bereichBody, $adresse_start, $adresse_laenge));         $telefon = trim(substr($bereichBody, $telefon_start, $telefon_laenge));         $nachricht = trim(substr($bereichBody, $nachricht_start, $nachricht_laenge));

//Formatieren der Datensätze         $id = "";

//Filterkennung löschen             $subject = ereg_replace($subject_kennung,'',$subject);

//Header konvertieren (non-Microsoft)             if(ereg("=?.{0,}?[Bb]?",$subject)){             $arrHead=split("=?.{0,}?[Bb]?",$subject);             while(list($key,$value)=each($arrHead)){             if(ereg("?=",$value)){             $arrTemp=split("?=",$value);             $arrTemp[0]=base64_decode($arrTemp[0]);             $arrHead[$key]=join("",$arrTemp);             }             }             $subject=join("",$arrHead);             }

//deutsche Sonderzeichen konvertieren             if(ereg("=?.{0,}?Q?",$subject)){             $subject=quoted_printable_decode($subject);             $subject=ereg_replace("=?.{0,}?Q?","",$subject);             $subject=ereg_replace("?=","",$subject);             }

//Sonderzeichen entfernen             $subject=ereg_replace("-"," ",$subject);             $subject=ereg_replace("_"," ",$subject);             $subject = trim(preg_replace("/[^a-zA-Z0-9 äüöÄÜÖ]/","",$subject));

$kategorie = $subject;         $bestellung = trim($bestellung);         $adresse = trim($adresse);         $telefon = trim($telefon);         $nachricht = trim($nachricht);         $name = $name;         $email = $email;         $datum = $date;         $status = "0";

//Eintrag in Datenbank         $abfrage = "INSERT INTO $table (id, kategorie, bestellung, adresse, telefon, nachricht, name, email, datum, status) VALUES ('$id', '$kategorie', '$bestellung', '$adresse', '$telefon', '$nachricht', '$name', '$email', '$datum', '$status')";         $result = mysql_query($abfrage, $conn);         if ($result)         {         //zum Löschen markieren         imap_delete ($mbox, $i);         $entryok++;         }

//entgültig Löschen         imap_expunge($mbox);

//Ausgabe         if($QUERY_STRING==det)         {         echo "<b>Name:</b><br>\n".$name;         echo "<br>\n";         echo "<b>eMail:</b><br>\n".$email;         echo "<br>\n";         echo "<b>Kategorie:</b><br>\n".$kategorie;         echo "<br>\n";         echo "<b>Bestellung:</b><br>\n".$bestellung;         echo "<br>\n";         echo "<b>Adresse:</b><br>\n".$adresse;         echo "<br>\n";         echo "<b>Telefon:</b><br>\n".$telefon;         echo "<br>\n";         echo "<b>Nachricht:</b><br>\n".$nachricht;         echo "<br>\n";         echo "<b>Datum:</b><br>\n".$date;         echo "<hr>\n";         }     }     //Filtern nicht erlaubter Mails     else     {     $mail_norel++;     } }

//Ergebnis if($QUERY_STRING==erg || $QUERY_STRING==det) { $mail_rel = $mail_insg-$mail_norel; $mail_uebrig = imap_num_msg($mbox); echo "<h4>Einstellungen</h4>"; echo "Filter für Betreffzeile: ".$subject_kennung; echo "<br>\n"; echo "Start/Ende für Auswertung: ".$body_auswertung; echo "<br>\n"; echo "Einleitung 1: ".$bestellung_name; echo "<br>\n"; echo "Einleitung 2: ".$adresse_name; echo "<br>\n"; echo "Einleitung 3: ".$telefon_name; echo "<br>\n"; echo "Einleitung 4: ".$nachricht_name; echo "<br>\n"; echo "<br>\n"; echo "<h4>Ergebnis</h4>"; echo $mail_insg." eMail(s) insgesamt"; echo "<br>\n"; echo "davon enthalten ".$mail_norel." nicht '".$subject_kennung."' in der Betreffzeile"; echo "<br>\n"; echo $entryok." von ".$mail_rel." relevanten eMails(s) wurden in der Datenbank gespeichert und gelöscht."; echo "<br>\n"; echo $mail_uebrig." eMail(s) auf dem Server."; }

} else { echo "keine Nachrichten auf dem Server!"; }

//Mailbox schließen imap_close($mbox); ?>

  1. Hallo Stefan,

    auf den ersten Blick kann ich keinen Fehler sehen, bin aber auch nicht in die Arbeit mit Mail-Servern in PHP involviert.

    Ich kann nur vorschlagen, daß Du vielleicht die gelesenen Header-Zeilen ausgeben läßt und ebenfalls ausgeben läßt, ob in die $subject-Bedingung gesprungen wird oder nicht. So bekommst Du vielleicht mehr heraus, als wenn alle Leute in dem Script Fehler suchen, zumal die Blöcke nicht besonders gut eingerückt sind und somit das Lesen erschwert wird. Ausgaben kannst Du ja auf die Standard-Ausgabe oder in eine Datei schreiben.

    Hoffe, daß Du so den/die Fehler oder das/die Problem(e) findest.

    Gruß
    Andreas Schigold