2012-03-06 31 views
7

Tôi đang truy cập giao diện IMAP của Gmail thông qua python. Tôi chạy một lệnh như sau:Lệnh "tiêu đề tìm kiếm" IMAP không thành công khi văn bản tìm kiếm chứa dấu chấm than (!), Dấu và (&), v.v.

UID SEARCH HEADER Message-ID "[email protected]" 

Điều đó thành công (trả về 1 UID của thông báo trùng khớp hoặc 0 nếu không tồn tại). Tuy nhiên, nếu văn bản tìm kiếm chứa các ký tự nhất định (như & hoặc!), Văn bản tìm kiếm sẽ bị cắt bớt tại thời điểm đó. Điều này có nghĩa:

UID SEARCH HEADER Message-ID "[email protected]" 

Được đối xử giống như

UID SEARCH HEADER Message-ID "" 

Ngoài ra:

UID SEARCH HEADER Message-ID "[email protected]" 

Được coi là:

UID SEARCH HEADER Message-ID "abc" 

Tôi đã trải qua ngôn ngữ IMAP spec, và từ đặc tả ngôn ngữ ABNF nó s giống như những ký tự đó phải hợp lệ. Tại sao gmail cắt ngắn các cụm từ tìm kiếm này tại "!" và "&" ký tự? Có cách nào để trốn thoát họ không? (Tôi đã thử !, không thành chuỗi được mã hóa nặng). Có RFC hay tài liệu nào cho thấy điều gì thực sự nên được chấp nhận? Đây có phải là lỗi trong triển khai imap của gmail không?

Tôi cũng đã cố gắng định dạng chữ, kết quả tương tự:

UID SEARCH HEADER Message-ID {15} 
[email protected] 

Tuy nhiên đối xử như:

UID SEARCH HEADER Message-ID {3} 
abc 

Cảm ơn!

IMAP lệnh RFC3501 Tìm kiếm: http://tools.ietf.org/html/rfc3501#section-6.4.4 chính thức cú pháp: http://tools.ietf.org/html/rfc3501#section-9

+0

Tôi có thể khẳng định rằng không có gì đặc biệt về việc sử dụng dấu chấm than trong truy vấn tìm kiếm. Rất có thể bạn đã tìm thấy một lỗi trong gmail.Tôi khuyên bạn nên sử dụng một số máy chủ IMAP khác nhau trong quá trình phát triển, đặc biệt kể từ khi triển khai IMAP của Gmail không được biết đến với sự phù hợp với đặc tả IMAP. – nosid

+0

Cảm ơn nosid. Thật không may, máy chủ IMAP tôi cần phải sử dụng với mã này là gmail, vì vậy việc thử nghiệm trên những người khác sẽ không giúp được với lỗi này. Nhưng nó là tốt để biết rằng tôi không đọc spec sai. Tôi sẽ cố gắng tìm cách báo cáo lỗi này cho google. – rocketmonkeys

+0

Có, tôi hiện đang gặp sự cố này khi thực hiện tìm kiếm IMAP trên Gmail thông qua ứng dụng thư khách * alpine * cố gắng chọn tất cả thư có chủ đề chứa '!'. –

Trả lời

1

Tôi đã chạm vấn đề này bản thân mình trong nhiều tháng nay.

TÌM KIẾM HEADER Message-ID < -! &! ...>

Đã kết thúc bỏ qua một số tìm kiếm MsgId bắt đầu bằng '< -'. Ngoài ra, hãy xem các vấn đề với &! 'S ... Không chắc chắn cách giải quyết tốt điều này.

Bạn đã bao giờ nhận được một từ từ Google về lỗi này chưa?

Cảm ơn nhiều

2

tôi chủ yếu dựa câu trả lời của tôi trên sự khám phá (Max) trong các ý kiến ​​cho câu hỏi ban đầu mà TÌM KIẾM thực hiện GMail sử dụng một cơ sở dữ liệu sự ủng hộ mà có nội dung văn bản đã chia thành từ mã thông báo chứ không phải là lưu trữ toàn văn và thực hiện tìm kiếm chuỗi con.

Vì vậy, đây là một cách giải quyết khả năng mà bạn có thể sử dụng với GMail trong C# sử dụng MailKit thư viện của tôi (mà là một cấp thấp thư viện IMAP khá vì thế này nên dễ dàng chuyển thành giả cơ bản):

// given: text = "[email protected]" 

// 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" "[email protected]" 

// Do the UID SEARCH with the constructed query: 
// A001 UID SEARCH HEADER "Message-Id" "abc" HEADER "Message-Id" "[email protected]" 
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 
Các vấn đề liên quan