2008-10-07 13 views
10

जीमेल में, मेरे पास लेबल किए गए संदेशों का एक गुच्छा है।मैं पाइथन (जीमेल और इमाप्लिब का उपयोग करके) में आईएमएपी खोज कैसे करूं?

मैं उन संदेशों को प्राप्त करने के लिए एक IMAP क्लाइंट का उपयोग करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि खोज incantation क्या है।

c = imaplib.IMAP4_SSL('imap.gmail.com') 
c.list() 
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...]) 
c.search(???) 

मुझे इस तरह की चीज़ के लिए कई उदाहरण नहीं मिल रहे हैं। Google के अनुसार

उत्तर

8

imaplib जानबूझकर आईएमएपी प्रोटोकॉल के चारों ओर एक पतला आवरण है, मैं मानता हूं कि उपयोगकर्ता लचीलापन की एक बड़ी डिग्री और आईएमएपी विनिर्देश में बदलावों को अनुकूलित करने की अधिक क्षमता के लिए अनुमति देता हूं। नतीजतन, यह वास्तव में आपके खोज प्रश्नों के लिए कोई संरचना प्रदान नहीं करता है और आपको IMAP specification से परिचित होने की आवश्यकता है।

जैसा कि आप अनुभाग "6.4.4। खोज कमांड" में देखेंगे, वहां कई चीजें हैं जिन्हें आप खोज मानदंड के लिए निर्दिष्ट कर सकते हैं। ध्यान दें कि इससे पहले कि आप कुछ भी खोज सकें, आपको SELECT मेलबॉक्स (किसी फ़ोल्डर के लिए IMAP का नाम) होना चाहिए। (एकाधिक फ़ोल्डर्स को एक साथ खोजना कई आईएमएपी कनेक्शन की आवश्यकता है, जैसा कि मैं इसे समझता हूं।) IMAP4.list आपको यह पता लगाने में मदद करेगा कि मेलबॉक्स पहचानकर्ता क्या हैं।

imaplib पर आपके द्वारा पारित तारों को बनाने में भी उपयोगी है, ऊपर से जुड़े आरएफसी से "9। औपचारिक सिंटेक्स" है।

r'(\HasNoChildren) "/"' रूट मेलबॉक्स, / पर एक मेलबॉक्स ध्वज है। "7.2.6 फ्लैग प्रतिक्रिया" देखें।

शुभकामनाएं!

5
+1

यह सच नहीं है। आप conn.select ("कुछ लेबल-नाम") नहीं कर सकते हैं। –

+2

@pyrony: हाँ, आप कर सकते हैं। जीमेल ** लेबल ** शीर्ष-स्तर के IMAP ** मेलबॉक्स ** के रूप में उजागर किए गए हैं। मुझे यकीन नहीं है कि उन्होंने आईएमएपी कीवर्ड के रूप में उन्हें बेनकाब करने के बजाए ऐसा करने का फैसला क्यों किया, लेकिन जीमेल ने ऐसा करने का फैसला किया। – dkarp

0

मुझे आश्चर्य हुआ है कि imaplib प्रतिक्रिया प्रतिक्रिया का बहुत कुछ नहीं करता है। और ऐसा लगता है कि जवाब पार्स करने के लिए कठिन होने के लिए तैयार किए गए थे।

Fwiw, अपने ही सवाल का जवाब देने: c.search (कोई नहीं, 'जीएम')

(मैं पता नहीं क्या '(\ HasNoChildren) "/"' भाग के बारे में है।)

+0

इसे एक संपादन के माध्यम से मूल प्रश्न में शामिल किया जाना चाहिए। (यह कोई जवाब नहीं है।) – cdleary

+0

@cdleary: क्या आपने देखा है 'सी। खोज (कोई नहीं,' जीएम ')' भाग। यह गलत जवाब हो सकता है। लेकिन यह एक जवाब है। – jfs

+0

ओह, याद आया। उसके लिए माफ़ करना। – cdleary

7
import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
obj.login('username', 'password') 
obj.select('**label name**') # <-- the label in which u want to search message 
obj.search(None, 'FROM', '"LDJ"') 
0

जीमेल के साथ imaplib उपयोग करने के लिए सबसे आसान तरीका है Gmail Imap Extensions page में वर्णित के रूप X-GM-RAW विशेषता का उपयोग करने के लिए है।

प्रक्रिया कुछ इस तरह होगा:

पहले उचित ईमेल और पासवर्ड से खाते से कनेक्ट:

c.select("INBOX") 
:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
email = '[email protected]' 
password = 'spamspamspam' 
c.login(email, password) 

फिर फ़ोल्डरों/लेबल में से एक से कनेक्ट

यदि आवश्यक हो, तो आप c.list() के साथ सभी उपलब्ध फ़ोल्डर्स/लेबल सूचीबद्ध कर सकते हैं।

अंत में, खोज विधि का उपयोग करें:

gmail_search = "has:attachment eggs OR spam" 
status, data = c.search(None, 'X-GM-RAW', gmail_search) 

में gmail_search आप gmail advanced search में इस्तेमाल एक ही खोज सिंटैक्स का उपयोग कर सकते हैं।

खोज कमांड कमांड की स्थिति और आपके gmail_search से मेल खाने वाले सभी संदेशों की आईडी वापस कर देगा।

इस के बाद आप के साथ आईडी द्वारा प्रत्येक संदेश लाने के कर सकते हैं:

for id in data[0].split(): 
    status, data = gmail.fetch(id, '(BODY[TEXT])') 
संबंधित मुद्दे