2012-04-03 15 views
1

Ich bin ein wenig Verlust, habe ich 2 Skripte 1, die E-Mail-Anhänge aus einem Postfach und eine zweite, die dann die Anhänge analysiert und fügt sie in die DB.Datei schreiben Konflikte: file_get_contents() & fputs()

Dies funktioniert die meiste Zeit gut, wirft aber immer wieder ein paar Probleme auf. Manchmal wird der E-Mail-Anhang erstellt, aber nicht ausgefüllt (leere Datei mit Ausnahme des Namens) und manchmal wird er überhaupt nicht erstellt (heruntergeladen).

Das erste Skript öffnet eine neue Datei und schreibt darauf, das zweite Skript greift dann auf den Inhalt dieser Datei zu. Könnten diese Probleme auftreten, weil die Datei immer noch geöffnet ist, wenn das zweite Skript versucht, darauf zuzugreifen?

Sie laufen alternativ alle 15 Sekunden.

erster Skript (es ist ziemlich groß, so habe ich versucht, nur die Teile in Frage zu zeigen)

  for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++) { 
       echo "~~~~~~~~~~~~~~BEGIN!~~~~~~~~~~~~~~~~~~\n"; 
       echo imap_num_msg($mbox); 
       $structure = imap_fetchstructure($mbox,$jk); echo "imap_fetchstructure()\n"; 
       $parts = $structure->parts; echo "structure->parts\n"; 
       $fpos=2; 


       for($i = 1; $i < count($parts); $i++) { echo "loop through parts of email\n"; 
        $message["pid"][$i] = ($i); 
        $part = $parts[$i]; 

        if($part->disposition == "ATTACHMENT") { echo "if ATTACHMENT exists then grab data from it\n"; 
         $message["type"][$i] = $message["attachment"]["type"][$part->type] . "/" . strtolower($part->subtype); 
         $message["subtype"][$i] = strtolower($part->subtype); 
         $ext=$part->subtype; 
         $params = $part->dparameters; 
         $filename=$part->dparameters[0]->value; 

         $num = $this->append(); 
         $newFilename = $this->addToDB($filename,$num); 
         echo $newFilename."- Added tp DB\n"; 

         $mege=""; 
         $data=""; 
         $mege = imap_fetchbody($mbox,$jk,$fpos); 
         $filename="$newFilename"; 
         $fp=fopen($savedirpath.$filename,w); echo "Create file at specified location\n"; 
         $data=$this->getdecodevalue($mege,$part->type); 
         fputs($fp,$data); echo "Write data to the file\n"; 
         echo ">>>>>>>>>>>>> File ".$savedirpath.$newFilename." ~ now exists!\n"; 
         fclose($fp); 
         $fpos+=1; 

         imap_mail_move($mbox,'1:1','Processed'); 
         echo "****************************************************\n"; 
         echo "* Matched - Download and move to Processed folder. *\n"; 
         echo "****************************************************\n"; 
         echo "\n\n\n"; 

        } 

       } 

      } 

     }else{ 
      imap_mail_move($mbox,'1:1','Other'); 
      echo "***************************************************\n"; 
      echo "******** No Match - Move to Other folder **********\n"; 
      echo "***************************************************\n"; 
     } 

     imap_close($mbox); 
    } 

Das zweite Skript macht eine Reihe von Parsen von Dateinamen nehmen im ersten Skript zu dem db hinzugefügt, dann klebte sie in das Folgende.

Antwort

0

Für jeden, der auf etwas Ähnliches stoßen könnte, fand ich heraus, warum bestimmte Dateien leer erschienen.

Die leeren Dateien, die erstellt wurden, stammen von E-Mails mit mehreren E-Mail-Anhängen. Es funktionierte gut mit einzelnen Anhängen und dem ersten Anhang in mehreren Anhang E-Mails.

for($i = 1; $i < count($parts); $i++) { echo "loop through parts of email\n"; 

//some code 

if($part->disposition == "ATTACHMENT") { echo "if ATTACHMENT exists then grab data from it\n"; 

//bunch of code that gets the attachment using the section number 

imap_mail_move($mbox,'1:1','Processed'); 
echo "****************************************************\n"; 
echo "* Matched - Download and move to Processed folder. *\n"; 
echo "****************************************************\n"; 
echo "\n\n\n"; 
} 

}

Grundsätzlich mehrere Anlagen dieser Teil Schleifen zu bekommen, aber ich hatte das imap_mail_move() Funktion in der Schleife, so dass die E-Mail in einen anderen Ordner, bevor eine andere Iteration verschoben wurde, konnte seine Sachen tun für die anderen E-Mail-Anhänge, daher die leeren Dateien

D'oh!

Was es bestimmte E-Mails gehen, ich über ein Theaterstück wurde mit mit

for ($jk = 1; $jk <= imap_num_msg($mbox); $jk++) { } 

Es stellte sich heraus, dass dieser nach etwa 4 Iterationen wurde crapping aus, einige der E-Mails verursacht übersprungen werden. An dieser Stelle bin ich mir nicht sicher warum, aber für meine Zwecke brauche ich diese Schleife eigentlich nicht, also habe ich sie entfernt.

Ich weiß, dass dies ein dummer Fehler meinerseits in Bezug auf die imap_mail_move() war, aber ich beschloss, dies zu veröffentlichen, falls es anderen in Zukunft helfen könnte.