Сбой команды IMAP «заголовок поиска», когда текст поиска содержит восклицательный знак (!), Амперсанд (&) и т. Д. - PullRequest
7 голосов
/ 06 марта 2012

Я получаю доступ к интерфейсу IMAP GMail через python.Я запускаю команду, подобную этой:

UID SEARCH HEADER Message-ID "abcdef@abc.com"

Это успешно (возвращает 1 UID соответствующего сообщения или 0, если оно не существует).Однако, если текст поиска содержит определенные символы (например, & или!), Текст поиска обрезается в этой точке.Это означает:

UID SEARCH HEADER Message-ID "!abcdef@abc.com"

Обрабатывается так же, как

UID SEARCH HEADER Message-ID ""

Также:

UID SEARCH HEADER Message-ID "abc!def@abc.com"

Обрабатывается как:

UID SEARCH HEADER Message-ID "abc"

Я прошел спецификацию языка IMAP, и из спецификации языка ABNF кажется, что эти символы должны быть действительными.Почему Gmail усекает эти поисковые фразы в "!"и "&" символы?Есть ли способ избежать их?(Я пробовал!, Не удается в виде плохо закодированной строки).Есть RFC или документ, который показывает, что действительно должно быть принято?Это ошибка в реализации imap в gmail?

Я также пробовал литеральный формат, результаты те же:

UID SEARCH HEADER Message-ID {15}
abc!def@abc.com

Все еще рассматриваются как:

UID SEARCH HEADER Message-ID {3}
abc

Спасибо!

IMAP RFC3501 Команда поиска: http://tools.ietf.org/html/rfc3501#section-6.4.4 Формальный синтаксис: http://tools.ietf.org/html/rfc3501#section-9

Ответы [ 2 ]

2 голосов
/ 15 сентября 2016

Я в значительной степени основываю свой ответ на открытии (Максом) в комментариях к исходному вопросу о том, что реализация ПОИСКА в GMail использует резервную базу данных, которая уже разбивает текстовое содержимое на текстовые токены, а не хранит полный текст и выполняетпоиск по подстроке.

Итак, вот возможный обходной путь, который вы могли бы использовать с GMail в C #, используя мою библиотеку MailKit (которая представляет собой довольно низкоуровневую библиотеку IMAP, поэтому ее легко перевести в базовый псевдокод):

// given: text = "abc!abcdef@abc.com"

// split the search text on '!'
var words = text.Split (new char[] { '!' }, StringSplitOptions.RemoveEmptyEntries);

// build a search query...
var query = SearchQuery.HeaderContains ("Message-ID", words[0]);
for (int i = 1; i < words.Count; i++)
    query = query.And (SearchQuery.HeaderContains ("Message-ID", words[i]));

// this will result in a query like this:
// HEADER "Message-ID" "abc" HEADER "Message-ID" "abcdef@abc.com"

// Do the UID SEARCH with the constructed query:
// A001 UID SEARCH HEADER "Message-Id" "abc" HEADER "Message-Id" "abcdef@abc.com"
var uids = mailbox.Search (query);

// Now UID FETCH the ENVELOPE (and UID) for each of the potential matches:
// A002 UID FETCH <uids> (UID ENVELOPE)
var messages = mailbox.Fetch (uids, MessageSummaryItems.UniqueId |
    MessageSummaryItems.Envelope);

// Now perform a manual comparison of the Message-IDs to get only exact matches...
var matches = new UniqueIdSet (SortOrder.Ascending);
foreach (var message in messages) {
    if (message.Envelope.MessageId.Contains (text))
        matches.Add (message.UniqueId);
}

// 'matches' now contains only the set of UIDs that exactly match your search query
2 голосов
/ 04 июля 2012

Я сам решал эту проблему уже несколько месяцев.

SEARCH HEADER Message-ID <-! &! ...>

Закончено пропускание некоторых поисков MsgId, которые начинаются с '<-'.Также посмотрите на проблемы с &! S ... Не знаете, как обойти это хорошо. </p>

Вы когда-нибудь получали сообщение от Google об этой ошибке?

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...