2009-07-05 18 views
18

मैं एक क्लाइंट एप्लिकेशन लिख रहा हूं जो IMAP सर्वर से ईमेल प्राप्त करता है और फिर उन्हें डेटाबेस में संग्रहीत करता है। समस्या यह है कि एक बार जब मैंने मेल की जांच की है, अगली बार मैं केवल उस मेल को डाउनलोड करना चाहता हूं जो तब से आया है। तो अगर मैंने दो घंटे पहले मेल के लिए सर्वर की जांच की थी, तो मैं केवल पिछले दो घंटों में मेल प्राप्त करना चाहता हूं।किसी IMAP सर्वर से केवल नए मेल प्राप्त करना

मैं SINCE DATE के साथ खोज का उपयोग कर सकता हूं, लेकिन समय के लिए कोई समर्थन नहीं है + तारीख आसानी से खराब हो सकती है।

मैंने हाल ही में ध्वज की कोशिश की, लेकिन यह जीमेल के साथ काम नहीं कर रहा है (रूबी में यह हर बार शून्य दिखाता है)।

उत्तर

40

आप संदेशों के लिए UniqueId (UID) का उपयोग करना चाहते हैं। यह विशेष रूप से क्यों बनाया गया था।

आप अनुरोधित अंतिम यूआईडी का ट्रैक रखना चाहते हैं, और फिर, संदेश सेट "[यूआईडी]: *" का उपयोग करने वाले सभी नए संदेशों का अनुरोध करने के लिए, जहां [यूआईडी] वास्तविक यूआईडी मान है।

उदाहरण के लिए, मान लें कि आखिरी संदेश प्राप्त करने के लिए "123456" की एक अनूठी आईडी थी। आप लाने होगा

123456: *

फिर, पहले लौट आए संदेश त्यागें।

यूआईडी सत्रों में स्थिर होने के लिए 'माना जाता है', और कभी नहीं बदलता है, और हमेशा मूल्य में वृद्धि करता है। यह सत्यापित करने के लिए पकड़, जब आप फ़ोल्डर का चयन करते हैं तो UIDValidity की जांच करना है। यदि यूआईडीवी वैधता संख्या नहीं बदली है, तो यूआईडी अभी भी सत्रों में मान्य होना चाहिए।

2.3.1.1:

यहाँ आरएफसी से प्रासंगिक हिस्से हैं। विशिष्ट पहचान संख्या (यूआईडी) संदेश गुण

प्रत्येक संदेश है, जो जब अद्वितीय पहचानकर्ता वैधता मान के साथ किया (देखें नीचे) को आवंटित किए गए 32-बिट मूल्य एक 64-बिट मूल्य कि किसी भी अन्य संदेश का उल्लेख नहीं करना चाहिए रूपों मेलबॉक्स में या उसी मेलबॉक्स के लिए हमेशा के लिए मेलबॉक्स में हमेशा के लिए। अद्वितीय पहचानकर्ता मेलबॉक्स में सख्ती से बढ़ते फैशन में असाइन किए गए हैं; क्योंकि प्रत्येक मेलबॉक्स में संदेश जोड़ा जाता है, इसे संदेश (ओं) से पहले एक उच्च यूआईडी असाइन किया गया था जो पहले जोड़ा गया था। संदेश अनुक्रम संख्याओं के विपरीत, अद्वितीय पहचानकर्ता आवश्यक रूप से संगत नहीं हैं।

किसी संदेश का अद्वितीय पहचानकर्ता सत्र के दौरान नहीं बदला जाना चाहिए, और सत्रों के बीच नहीं बदला जाना चाहिए। सत्रों के बीच अद्वितीय पहचानकर्ता UIDVALIDITY तंत्र का उपयोग करके नीचे पता लगाए जा सकते हैं।लगातार अद्वितीय पहचानकर्ता क्लाइंट के लिए सर्वर के साथ पिछले सत्र (जैसे डिस्कनेक्ट या ऑफलाइन पहुंच क्लाइंट) से अपने राज्य को पुन: सिंक्रनाइज़ करने के लिए आवश्यक है; [आईएमएपी-डीआईएससी] में इस पर चर्चा की गई है।

नोट: अगले अद्वितीय पहचानकर्ता मूल्य करने का इरादा है एक ग्राहक को निर्धारित करने के लिए किसी भी संदेशों पिछले समय यह इस मूल्य की जाँच के बाद से मेलबॉक्स में वितरित किया गया है कि क्या एक साधन प्रदान करते हैं।

http://www.faqs.org/rfcs/rfc3501.html

मैं क्या करना होगा क्या, यह भी डाउनलोड किया संदेशों के InternalDate का ट्रैक रखने के है:

यहाँ अधिक जानकारी के साथ संबंध है। इस तरह, यदि आप कभी भी यूआईडी सिंक खो देते हैं, तो आप कम से कम संदेशों के माध्यम से पुन: प्रयास कर सकते हैं, और संदेश के आंतरिक दिनांक के आधार पर आपके द्वारा डाउनलोड किया गया अंतिम खोज सकते हैं।

+0

हाँ यह सही है! सुनिश्चित करें कि आप "123: *" के बजाय "UID 123: *" कमांड चलाएं जो अप्रत्याशित परिणाम देता है - उदाहरण के लिए। क्लाइंट। फ़ोल्डर्स। इनबॉक्स। खोज ("यूआईडी 123: *") –

4

"देखा" नामक एक इमेप ध्वज है। अधिकतर ग्राहक संदेश देखते समय देखे गए संदेश को चिह्नित करेंगे, इसलिए आप उस सर्वर पर संदेशों पर पुनरावृत्ति करना चाहते हैं, जिसमें उस ध्वज सेट नहीं है।

यहां एक कोड स्निपेट है जो आपको सही विचार देना चाहिए। निश्चित रूप से ऑपरेटिव बिट

imap.search(["NOT", "SEEN"]).each do bla.bla.bla 
+0

धन्यवाद, लेकिन मेरा आवेदन केवल एकमात्र ऐसा नहीं है जिसके पास उस ईमेल खाते तक पहुंच है। उदाहरण के लिए, दृष्टिकोण में एक विशेष संदेश पढ़ा जा सकता था, और इस प्रकार "देखा" के रूप में चिह्नित किया गया था। "देखा" का उपयोग करने से मेरा एप्लिकेशन इसे याद कर देगा। –

+0

उस स्थिति में आप सर्वर पर मेल में संदेश-आईडी शीर्षकों पर फिर से प्रयास करना चाहते हैं और डेटाबेस में जो कुछ भी है उसके विरुद्ध तुलना करें। http://www.freesoft.org/CIE/RFC/850/10.htm – JosefAssad

0

है क्या आप सर्वर साइड पर एक विशिष्ट IMAP फ़ोल्डर में आने वाली मेल फिल्टर करने के लिए सक्षम हैं, तो अपने अनुप्रयोग उस फ़ोल्डर में नए संदेश पढ़ सकते हैं और फिर उन्हें मानक इनबॉक्स में स्थानांतरित कर सकते इसके बाद फ़ोल्डर।

संबंधित मुद्दे