IMAP - как искать все сообщения в потоке разговора?
Я работаю над клиентом IMAP и хотел бы иметь возможность найти список все сообщения, на которые ссылаются в потоке беседы.
Я знаю, что Заголовок "ссылки" включает список сообщений, на которые ссылаются в разговоре, поэтому я попытался найти его так:
TAG1 UID SEARCH all HEADER References "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"
но он ничего не возвращает. Я успешно искал одно сообщение, используя заголовок "Message-ID", например:
TAG2 UID SEARCH all HEADER Message-ID "<918171f1-8822-4869-afb4-de76b05b850b@xtnvmta101.xt.local>"
есть ли в любом случае, чтобы сделать это использование IMAP 4?
примечание: Я знаю, что поиск работает только на 1 почтовом ящике за раз, но по крайней мере половина этих сообщений находится в целевой папке для моих поисков, и они не отображаются в моих результатах поиска.
1 ответов
ваш поисковый запрос неверен - вы должны удалить ALL
токен оттуда -- то, что вы отправляете, не является синтаксически допустимым. Правильная форма-это, например:
1 UID SEARCH HEADER references "<CAOZnC-Nr+Q+bS_Nn5XiZ6A-kw=ZRBYrNbdoRfgZ65OjGA4_BKg@mail.gmail.com>"
это заставит вас идти.
однако, пожалуйста, имейте в виду, что References
заголовок вложенного сообщения может не содержит все, что сообщение ранее в потоке будет содержать -- применяются общие ограничения длины строки , и это означает, что общий размер заголовка ограничен, и некоторые из" средних " элементов могут быть удалены.
существуют методы преодоления этого ограничения, такие как INTHREAD
оператор, определенный в экспериментальное расширение который поддерживается Dovecot (и никаких других серверов IMAP, AFAIK). Используя это, вы можете просто запросить все UIDs в потоке, где присутствует конкретное сообщение, например:
1 UID SEARCH INTHREAD REFS HEADER Message-Id "something"
Я на самом деле протестировал это с Dovecot и это работает (и работает годами). Обратите внимание, что Dovecot делает не поддержка MESSAGEID
поиск ключа, хотя, и что синтаксис для INTHREAD REFS
отличается от того, что говорится в проекте стандарта. Однако команда выше работает.
Если вам нужно работать без какого-либо расширения, то похоже у вас нет другого шанса, кроме как:
- Fetch
HEADER.FIELDS[Message-Id References In-Reply-To]
сразу и анализировать сообщения на стороне клиента, - всякий раз, когда ваш
SEARCH HEADER References
возвращает новый UID, fetchHEADER.FIELDS[References In-Reply-To]
, извлеките оттуда" новые " идентификаторы сообщений, добавьте их в конце очереди и продолжайте дальше.
наконец, вы также можете положиться на GMail в X-GM-THRID
если вы ориентируетесь в основном на пользователей Gmail, но, пожалуйста, сообщите, что их реализация довольно ограничена, включая жесткий предел не более 100 сообщений на поток, нестандартную корреляцию потоков и т. д.
ну, выбери свой яд.