1

メールボックスから電子メールの添付ファイルを取得するスクリプトと、添付ファイルを解析して DB に追加するスクリプトの 2 つがあります。

これはほとんどの場合問題なく動作しますが、時々いくつかの問題が発生します。メールの添付ファイルが作成されても入力されない場合 (名前以外は空のファイル) もあれば、まったく作成 (ダウンロード) されない場合もあります。

最初のスクリプトは新しいファイルを開いて書き込み、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);
    }

2 番目のスクリプトは、1 番目のスクリプトでデータベースに追加されたファイル名を取得して一連の解析を行い、それらを以下に貼り付けます。

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

        $tickets = simplexml_load_string($addXML);
4

1 に答える 1

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() 関数があったため、他の反復が他の電子メール添付ファイルに対して処理を実行する前に、電子メールが別のフォルダーに移動されたため、空のファイル

ああ!

特定のメールをスキップすることに関しては、私は遊んでいました

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

約 4 回繰り返した後、これがうまくいかず、メールの一部がスキップされることが判明しました。この時点で理由はわかりませんが、私の目的では実際にはこの for ループは必要ないため、削除しました。

これは imap_mail_move() に関する私の間違いだったことはわかっていますが、将来他の誰かに役立つかもしれない場合に備えて、これを投稿することにしました。

于 2012-04-04T09:48:43.510 に答える