当搜索文本包含感叹号(!),&符号(&)等时,IMAP“搜索标题”命令失败

时间:2012-03-06 18:20:29

标签: search gmail imap

我正在通过python访问GMail的IMAP界面。我运行这样的命令:

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或doc显示真正应该接受的内容?这是gmail的imap实现中的错误吗?

我也尝试了文字格式,结果相同:

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 个答案:

答案 0 :(得分:2)

我在很大程度上根据发现(Max)对原始问题的评论做出了回答,GMail的SEARCH实现使用了一个支持数据库,该数据库已经将文本内容分成单词代币而不是存储全文并进行子串搜索。

所以这里有一个可能的解决方法,您可以使用我的MailKit库(这是一个相当低级别的IMAP库,因此可以轻松转换为基本伪代码)在C#中使用GMail:

// 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

答案 1 :(得分:1)

我自己已经打了好几个月了。

SEARCH HEADER消息ID&lt; - !&amp;!...&gt;

结束跳过一些以'&lt; - '开头的MsgId搜索。另请参阅&amp;!的问题...不确定如何解决这个问题。

你有没有得到谷歌关于这个错误的消息?

非常感谢