如何获取 imap 标志?

发布于 2024-09-10 16:37:09 字数 278 浏览 13 评论 0原文

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

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

提前致谢。

I used the imap4flag plugin for Dovecot sieve: http://wiki.dovecot.org/LDA/Sieve#Flagging_or_Highlighting_your_mail

The flag is correctly show in thunderbird but I search how get the flags for show them in roundcube.

Thank's in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

那请放手 2024-09-17 16:37:09

这是一个缺失的功能,请参阅 PHP bug #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));

This is a missing feature, see the PHP bug #53043 : http://bugs.php.net/bug.php?id=53043

A example code using directly the IMAP protocol:

<?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;
    }
}

Usage:

<?php

$imap = new ImapSocket([
    'server' => 'localhost',
    'port' => 143,
    'login' => 'login',
    'password' => 'secret',
    'tls' => false,
], 'INBOX');
var_dump($imap->get_flags(0));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文