GMAIL Zend IMAP如何获取特定消息的ID

时间:2014-05-26 09:33:07

标签: php zend-framework gmail imap

我正在尝试在PHP编程时使用GMAIL api时实现Zend IMAP框架

一切顺利,我收到消息 - 电子邮件(从/到)但出于存储目的,我需要消息的唯一ID。

有没有办法解决这个问题?我使用标准代码。

非常感谢,希望这个问题显然已经足够描述了。

我想要唯一消息ID的原因是因为我需要存储数据。 如果我不使用唯一ID我无法将消息与db中的内容进行比较,则zend中给出的messagenumber为例8.如果我然后删除消息nr。 7然后nr。 8将成为nr。 7这使得它不是很有用。

我可以看到我必须使用:X-GM-MSGID,但我不知道在哪里放...当我把它放在我的提取中它不起作用:

$test = $imap->fetch("X-GM-MSGID", null, $emailto);

 public function fetch($items, $from, $to = null)
    {
        if (is_array($from)) {
            $set = implode(',', $from);
        } else if ($to === null) {
            $set = (int)$from;
        } else if ($to === INF) {
            $set = (int)$from . ':*';
        } else {
            $set = (int)$from . ':' . (int)$to;
        }

        $items = (array)$items;
        $itemList = $this->escapeList($items);

        $this->sendRequest('FETCH', array($set, $itemList), $tag);

        $result = array();
        while (!$this->readLine($tokens, $tag)) {
            // ignore other responses
            if ($tokens[1] != 'FETCH') {
                continue;
            }
            // ignore other messages
            if ($to === null && !is_array($from) && $tokens[0] != $from) {
                continue;
            }
            // if we only want one item we return that one directly
            if (count($items) == 1) {
                if ($tokens[2][0] == $items[0]) {
                    $data = $tokens[2][1];
                } else {
                    // maybe the server send an other field we didn't wanted
                    $count = count($tokens[2]);
                    // we start with 2, because 0 was already checked
                    for ($i = 2; $i < $count; $i += 2) {
                        if ($tokens[2][$i] != $items[0]) {
                            continue;
                        }
                        $data = $tokens[2][$i + 1];
                        break;
                    }
                }
            } else {
                $data = array();
                while (key($tokens[2]) !== null) {
                    $data[current($tokens[2])] = next($tokens[2]);
                    next($tokens[2]);
                }
            }
            // if we want only one message we can ignore everything else and just return
            if ($to === null && !is_array($from) && $tokens[0] == $from) {
                // we still need to read all lines
                while (!$this->readLine($tokens, $tag));
                return $data;
            }
            $result[$tokens[0]] = $data;
        }

        if ($to === null && !is_array($from)) {
            /**
             * @see Zend_Mail_Protocol_Exception
             */
            require_once 'Zend/Mail/Protocol/Exception.php';
            throw new Zend_Mail_Protocol_Exception('the single id was not found in response');
        }

        return $result;
    }

1 个答案:

答案 0 :(得分:1)

 public function getMessage($id)
    {
        $data = $this->_protocol->fetch(array('FLAGS', 'RFC822.HEADER', 'RFC822.TEXT', 'X-GM-MSGID'), $id);
        $header = $data['RFC822.HEADER'];
        $content = $data['RFC822.TEXT'];
        $messageid = $data['X-GM-MSGID'];

        var_dump($messageid);



        $flags = array();
        foreach ($data['FLAGS'] as $flag) {
            $flags[] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : $flag;
        }

        return new $this->_messageClass(array('handler' => $this, 'id' => $id, 'headers' => $header, 'content' => $content, 'flags' => $flags, 'messageid' => $messageid));
    }

由于某种原因,从IMAP类中提取它时工作正常。

只需将其传递给您的其他课程并按原样使用