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, fetch HEADER.FIELDS[References In-Reply-To], извлеките оттуда" новые " идентификаторы сообщений, добавьте их в конце очереди и продолжайте дальше.

наконец, вы также можете положиться на GMail в X-GM-THRID если вы ориентируетесь в основном на пользователей Gmail, но, пожалуйста, сообщите, что их реализация довольно ограничена, включая жесткий предел не более 100 сообщений на поток, нестандартную корреляцию потоков и т. д.

ну, выбери свой яд.