Функция PHP IMAP для отключения вложения и сохранения в каталоге - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь использовать функцию IMAP, чтобы отсоединить вложение, полученное из папки «Входящие», и сохранить его в указанном каталоге сервера.

Я делаю это для всех НЕПРАВИЛЬНЫХ сообщений, но проблема в том, что это делается только для одного сообщения.

Ниже приведен код (я удалил переменные $ host, $ login, $ password по понятным причинам):

$type = 'ReadAttachment';
    $obj = new $type;
    $obj->getdata($host,$login,$password,$savedirpath,$delete_emails=false);
    class ReadAttachment
    {

        function getdecodevalue($message,$coding) {
            switch($coding) {
                case 0:
                case 1:
                    $message = imap_8bit($message);
                    break;
                case 2:
                    $message = imap_binary($message);
                    break;
                case 3:
                case 5:
                    $message = imap_base64($message);
                    break;
                case 4:
                    $message = imap_qprint($message);
                    break;
            }
            return $message;
        }


        function getdata($host,$login,$password,$savedirpath,$delete_emails=false, $read_type="UNSEEN") {
            // make sure save path has trailing slash (/)
            //print_r("test");
            $savedirpath = str_replace('\\', '/', $savedirpath);
            if (substr($savedirpath, strlen($savedirpath) - 1) != '/') {
                $savedirpath .= '/';
            }

            $mbox = imap_open ($host, $login, $password) or die("can't connect: " . imap_last_error());
            $message = array();
            $message["attachment"]["type"][0] = "text";
            $message["attachment"]["type"][1] = "multipart";
            $message["attachment"]["type"][2] = "message";
            $message["attachment"]["type"][3] = "application";
            $message["attachment"]["type"][4] = "audio";
            $message["attachment"]["type"][5] = "image";
            $message["attachment"]["type"][6] = "video";
            $message["attachment"]["type"][7] = "other";
            //print_r($message);
            $emails = imap_search($mbox,$read_type) or die(print_r(imap_last_error()));
            print_r($emails);

            $e = imap_search($mbox,$read_type, SE_UID) or die(print_r(imap_last_error()));
            print_r($e);
            $i=0;
            foreach($emails as $email_number) {
                $structure = imap_fetchstructure($mbox, $e[$i] , FT_UID) or die(print_r(imap_last_error()));
                $parts = $structure->parts;
                $fpos=2;
                for($i = 1; $i < count($parts); $i++) {
                    $message["pid"][$i] = ($i);
                    $part = $parts[$i];

                    if($part->disposition == "attachment") {
                        $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;

                        $mege="";
                        $data="";
                        $mege = imap_fetchbody($mbox,$email_number,$fpos);  
                        $filename="$filename";
                        $fp=fopen($savedirpath.$filename,"w");
                        $data=$this->getdecodevalue($mege,$part->type);
                        //print_r($mege);
                        fputs($fp,$data);
                        fclose($fp);
                        $fpos+=1;
                    }
                }
                ++$i;
            }
            // imap_expunge deletes all tagged messages

            imap_close($mbox);
        }
    }

Есть что-то, что я мог бы изменить выше?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2012

На самом деле, глядя на скрипт, я думаю, что он неправильно использует $ i в 2 местах. $ i в пределах foreach должно быть другой переменной.

для переменной структуры $ он должен использовать $ i, как и ожидалось ... но части почты должны использовать отдельную переменную (я использовал $ p)

Я знаю, что это старый пост, но он мне немного помог.

0 голосов
/ 19 февраля 2012

Я не уверен, является ли это причиной проблемы, или я даже правильно понял ваш код. Однако я думаю, что ваш $ i = 0 должен идти внутри цикла foreach, и вам нужно потерять ++ $ i в конце.

Давайте пройдем через это. Сначала вы устанавливаете $ i = 0. foreach получает первое сообщение и входит в цикл for, который перебирает инкрементные значения $ i. Предположим, что $ i установлен в 4, когда цикл for заканчивается. На этом этапе ++ $ i устанавливает его в 5. Итерация foreach заканчивается, и следующее электронное письмо должно быть обработано. Но этого не происходит, потому что $ i все еще 5, поэтому, когда вы делаете:

$structure = imap_fetchstructure($mbox, $e[$i] , FT_UID)

Вы выбрали не тот адрес электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...