使用PHP中的IMAP将附件下载到目录中的操作会随机进行 [英] Downloading attachments to directory with IMAP in PHP, randomly works

查看:81
本文介绍了使用PHP中的IMAP将附件下载到目录中的操作会随机进行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在网上找到了PHP代码,可以从此处使用IMAP将附件下载到目录中. http://www.nerdydork.com/download-pop3imap-email -attachments-with-php.html

I found PHP code online to download attachments to a directory using IMAP from here. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.html

我对其进行了稍微的修改

I modified it slightly changing

        $structure = imap_fetchstructure($mbox, $jk);
        $parts = ($structure->parts);

        $structure = imap_fetchstructure($mbox, $jk);
        $parts = ($structure);

使其正常运行,否则我将收到有关stdClass如何未定义名为$ parts的属性的错误.这样做,我能够下载所有附件.我最近又对其进行了测试,但没有成功.好吧,它没有工作6次,没有工作7次,但是此后一直没有工作.我认为这与我搞砸了部分处理有关,因为count($ parts)会为每条消息始终返回1,因此找不到我认为的任何附件.

to get it to run properly, as otherwise I got an error about how stdClass doesn't define a property called $parts. Doing that, I was able to download all the attachments. I tested it again recently though, and it didn't work. Well, it didn't work 6 times, worked the 7th, and then hasn't worked since. I'm thinking it has something to do with me screwing up the parts handling, since count($parts) keeps returning 1 for each message, so it's not finding any attachments I think.

由于它一口气下载了附件,没有任何问题,所以我有信心解决问题的地方就在这里.在此代码块之前是for循环,它将遍历框中的每个消息,而在循环之后,将仅循环每个imap结构的$ parts.感谢您的任何帮助,您可以提供.我查看了php.net上的imap_fetchstructure页面,但无法弄清楚我在做什么错.

Since it downloaded the attachments at one point with no issues, I feel confident that the area things are getting screwed up is right here. Before this block of code is a for loop that goes through each message in the box, and after it is loop that just goes through $parts for each imap structure. Thanks for any help you can provide. I looked at the imap_fetchstructure page on php.net and can't figure out what I'm doing wrong.

我只是在输入问题后仔细检查了文件夹,然后所有文件都弹出了.我觉得我疯了.在开始键入此代码之前几分钟,我就没有运行过代码,并且触发它需要很长时间对我来说没有任何意义.我的邮箱中有大约800条消息,但是我想起了,因为它在PHP的最后打印了我的声明,所有文件创建工作都已完成.

I just double-checked the folder after typing up my question and it all popped up. I feel like I'm going nuts. I hadn't run the code since a few minutes before I started typing this, and it doesn't make sense to me that it would take this long to trigger. I have some 800 messages in the mailbox, but I figured since it printed my statement at the very end of the PHP that all of the file creation work was done.

推荐答案

这是最终的工作示例

<? include('application.php'); 
/* connect to gmail */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'XX@XX.com';
$password = 'XX';

/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());

/* grab emails */
$emails = imap_search($inbox, 'FROM "xxx@gmail.com"');



/* if emails are returned, cycle through each... */
if($emails) {

  /* begin output var */
  $output = '';

  /* put the newest emails on top */
  rsort($emails);




    foreach($emails as $email_number) {

    /* get information specific to this email */
    $overview = imap_fetch_overview($inbox,$email_number,0);
    $message = imap_fetchbody($inbox,$email_number,2);
    $structure = imap_fetchstructure($inbox,$email_number);


    pre($overview);


     $attachments = array();
       if(isset($structure->parts) && count($structure->parts)) {
         for($i = 0; $i < count($structure->parts); $i++) {
           $attachments[$i] = array(
              'is_attachment' => false,
              'filename' => '',
              'name' => '',
              'attachment' => '');

           if($structure->parts[$i]->ifdparameters) {
             foreach($structure->parts[$i]->dparameters as $object) {
               if(strtolower($object->attribute) == 'filename') {
                 $attachments[$i]['is_attachment'] = true;
                 $attachments[$i]['filename'] = $object->value;
               }
             }
           }

           if($structure->parts[$i]->ifparameters) {
             foreach($structure->parts[$i]->parameters as $object) {
               if(strtolower($object->attribute) == 'name') {
                 $attachments[$i]['is_attachment'] = true;
                 $attachments[$i]['name'] = $object->value;
               }
             }
           }

           if($attachments[$i]['is_attachment']) {
             $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);
             if($structure->parts[$i]->encoding == 3) { // 3 = BASE64
               $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
             }
             elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
               $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
             }
           }             
         } // for($i = 0; $i < count($structure->parts); $i++)
       } // if(isset($structure->parts) && count($structure->parts))


    if(count($attachments)!=0){
        foreach($attachments as $at){
            if($at['is_attachment']==1){
                file_put_contents($at['filename'], $at['attachment']);
            }
        }
    }

  }

 // echo $output;
} 

/* close the connection */
imap_close($inbox);

?>

这篇关于使用PHP中的IMAP将附件下载到目录中的操作会随机进行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆