Получение нового идентификатора после перемещения электронной почты в IMAP


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

public function moveMail($mailId, $mailBox) {
    return imap_mail_move($this->getImapStream(), $mailId, $mailBox, CP_UID) && $this->expungeDeletedMails();
}

После их перемещения я определяю, является ли электронное письмо актуальным. Если это не так, я хочу переместить его во вторую папку. Однако после его перемещения внутренний идентификатор почты изменяется, и поэтому я больше не могу перемещать электронное письмо.

Я ищу способ получить идентификатор перемещенного электронного письма так что я могу передвинуть его во второй раз.

Есть идеи?

Author: Peter, 2016-06-01

3 answers

(Это не специфично для PHP и не дает прямого ответа на ваш вопрос)

Обычно это делается двумя способами:

1) Расширение UIDPLUS, если оно поддерживается, должно дать ответ COPYUID в ответе OK. Это включает в себя UIDVALIDITY и новый идентификатор UID в новой папке при копировании сообщения.

2) Если это не удается, откройте новое соединение или перейдите в папку назначения и выполните UID SEARCH для заголовка идентификатора сообщения. Если вы получите один ответ, это вероятно, ваше сообщение. Если вы получаете несколько ответов, самый высокий из них, вероятно, является вашим сообщением (при условии, что несколько клиентов не копируют сообщения с одним и тем же идентификатором сообщения примерно в одно и то же время). Поскольку идентификатор сообщения является заголовком отправителя и не обязательно уникален (сообщения могут дублироваться), это несовершенно, но в большинстве случаев дает разумные результаты. Недостатком является то, что он медленный.

К счастью, почти все серверы поддерживают UIDPLUS. К сожалению, библиотека PHP, вероятно, делает нет.

 3
Author: Max, 2016-06-07 17:55:45

После некоторого поиска я обнаружил, что в библиотеке imap в PHP нет решения для получения нового uid. Я подумал, могу ли я просто получить последний идентификатор uid и увеличить его на единицу, но, поскольку может прийти новое электронное письмо, это тоже не сработает.

Моим лучшим решением может быть использование расширения UIDPLUS IMAP и обращение к коду ответа APPENDUID.

Заключение

Мой окончательный вывод заключается в том, что если вышеупомянутое расширение недоступно и ваша почта сервер не поддерживает SEARCH HEADER, просто невозможно найти сообщение по его Message-id, и по этой причине невозможно узнать, какой идентификатор был присвоен моему новому электронному письму.

 3
Author: Peter, 2016-06-08 14:18:21

В документации указано, что идентификатор UID не должен изменяться: http://php.net/manual/en/function.imap-uid.php

 0
Author: C Würtz, 2016-06-07 16:57:43