【问题标题】:File writing conflicts : file_get_contents() & fputs()文件写入冲突:file_get_contents() & fputs()
【发布时间】:2012-04-03 16:01:09
【问题描述】:

我有点不知所措,我有 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);
    }

第二个脚本通过获取在第一个脚本中添加到数据库中的文件名进行大量解析,然后将它们粘贴到以下内容中。

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

        $tickets = simplexml_load_string($addXML);

【问题讨论】:

    标签: php file-get-contents email-attachments fputs


    【解决方案1】:

    对于任何可能遇到类似情况的人,我想知道为什么某些文件显示为空白。

    创建的空白文件来自具有多个电子邮件附件的电子邮件。它适用于单个附件和多个附件电子邮件中的第一个附件。

    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() 方面犯了一个愚蠢的错误,但我决定发布此内容以防将来可能对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多