2012-04-03 4 views
1

イムは、私は、メールボックスとその後、添付ファイルを解析し、DBに追加秒1から電子メールの添付ファイルを引っ張る2つのスクリプト1を持っています。ファイル書き込みの競合:損失のビットでのfile_get_contents()&fputs()

これはほとんどの場合はうまくいきますが、毎回いくつかの問題を投げかけています。電子メールの添付ファイルは作成されますが、名前が付いていない空白のファイルや、作成されていない(ダウンロードされた)場合もあります。

最初のスクリプトは新しいファイルを開き、そのファイルに書き込みを行い、2番目のスクリプトはそのファイルの内容にアクセスします。これらの問題は、2番目のスクリプトがファイルにアクセスしようとしているときにファイルが開いていることが原因ですか?

15秒ごとに交互に実行されます。

第一スクリプト(そのかなり大きなので、私はちょうど問題の部分を表示しようとしてきた)

  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); 
    } 

第二スクリプトは、ファイル名をとることにより、解析の束が第一スクリプトでのDBに追加さありません、それを次のものに貼り付けます。

 $addXML = "<xml>".file_get_contents($filename)."</xml>"; 

     $tickets = simplexml_load_string($addXML); 

答えて

0

何か似たようなことに遭遇する可能性がある人のために、なぜ特定のファイルが空白に見えるのかを考え出しました。

複数の電子メール添付ファイルを持つ電子メールからのどこに作成される空白ファイル。単一の添付ファイルと、複数の添付ファイルの電子メールの最初の添付ファイルで正常に動作しました。

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"; 
} 

}

基本的に複数の添付ファイルにこの部分ループを取得するが、他の反復がために、そのようなものを行うことができます前に電子メールを別のフォルダに移動さ​​れたので、私は、ループ内でimap_mail_move()関数を持っていました他の電子メールの添付ファイル、したがって、空白のファイル

D'OH!それは、特定の電子メールをスキップするよう

、私は

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

、約遊びを持っていたこれは電子メールの一部がスキップさせる、約4回の反復後にcrappingたことが判明しました。この時点で私はなぜ私の目的のために実際には私はそれを削除したので、ループのために必要はありません理由はわかりません。

は、私は、これはimap_mail_move()についての私の部分にばか間違いだったけど、私はそれが将来的には他の誰を助けるかもしれない場合にはこれを投稿することを決めました。

関連する問題