【问题标题】:How to get imap flags?如何获取 imap 标志?
【发布时间】:2010-07-19 22:44:10
【问题描述】:

我使用了 Dovecot sieve 的 imap4flag 插件:http://wiki.dovecot.org/LDA/Sieve#Flagging_or_Highlighting_your_mail

标志在雷鸟中正确显示,但我搜索如何获取标志以在圆形立方体中显示它们。

提前致谢。

【问题讨论】:

    标签: php imap flags


    【解决方案1】:

    这是一个缺失的功能,请参阅 PHP 错误 #53043:http://bugs.php.net/bug.php?id=53043

    直接使用 IMAP 协议的示例代码:

    <?php
    declare(strict_types=1);
    
    class ImapSocket
    {
        private $socket;
    
        public function __construct($options, $mailbox = '')
        {
            $this->socket = $this->connect($options['server'], $options['port'], $options['tls']);
            $this->login($options['login'], $options['password']);
    
            if ($mailbox !== null) {
                $this->select_mailbox($mailbox);
            }
        }
    
        private function connect(string $server, int $port, bool $tls)
        {
            if ($tls === true) {
                $server = "tls://$server";
            }
    
            $fd = fsockopen($server, $port, $errno);
            if (!$errno) {
                return $fd;
            }
            else {
                throw new \Exception('Unable to connect');
            }
        }
    
        private function login(string $login, string $password): void
        {
            $result = $this->send("LOGIN $login $password");
            $result = array_pop($result);
    
            if (substr($result, 0, 5) !== '. OK ') {
                throw new \Exception('Unable to login');
            }
        }
    
        public function __destruct()
        {
            fclose($this->socket);
        }
    
        public function select_mailbox(string $mailbox): void
        {
            $result = $this->send("SELECT $mailbox");
            $result = array_pop($result);
    
            if (substr($result, 0, 5) !== '. OK ') {
                throw new \Exception("Unable to select mailbox '$mailbox'");
            }
        }
    
        public function get_flags(int $uid): array
        {
            $result = $this->send("FETCH $uid (FLAGS)");
            preg_match_all("|\\* \\d+ FETCH \\(FLAGS \\((.*)\\)\\)|", $result[0], $matches);
            if (isset($matches[1][0])) {
                return explode(' ', $matches[1][0]);
            }
            else {
                return [];
            }
        }
    
        private function send(string $cmd, string $uid = '.')
        {
            $query = "$uid $cmd\r\n";
            $count = fwrite($this->socket, $query);
            if ($count === strlen($query)) {
                return $this->gets();
            }
            else {
                throw new \Exception("Unable to execute '$cmd' command");
            }
        }
    
        private function gets()
        {
            $result = [];
    
            while (substr($str = fgets($this->socket), 0, 1) == '*') {
                $result[] = substr($str, 0, -2);
            }
            $result[] = substr($str, 0, -2);
    
            return $result;
        }
    }
    

    用法:

    <?php
    
    $imap = new ImapSocket([
        'server' => 'localhost',
        'port' => 143,
        'login' => 'login',
        'password' => 'secret',
        'tls' => false,
    ], 'INBOX');
    var_dump($imap->get_flags(0));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 2018-06-03
      • 1970-01-01
      • 2012-04-26
      • 2018-12-23
      • 2014-05-16
      • 2011-08-27
      • 2018-04-05
      相关资源
      最近更新 更多