كيف يمكنني إجراء IMAP البحث في بيثون (باستخدام Gmail و imaplib)?

StackOverflow https://stackoverflow.com/questions/179026

  •  05-07-2019
  •  | 
  •  

سؤال

في Gmail ، لدي مجموعة من الرسائل المصنفة.

أود أن استخدام IMAP العميل للحصول على تلك الرسائل, ولكن لست متأكدا ما بحث في الرقية هو.

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

لا أجد أمثلة كثيرة لهذا النوع من الشيء.

هل كانت مفيدة؟

المحلول

وimaplib غير قصد مجمع رقيقة حول بروتوكول IMAP، وأفترض للسماح للحصول على درجة أكبر من المرونة المستخدم وقدرة أكبر على التكيف مع التغييرات في مواصفات IMAP. ونتيجة لذلك، فإنه لا يقدم في الواقع أي هيكل لاستعلامات البحث الخاصة بك ويتطلب منك أن تكون على دراية في مواصفات IMAP .

وكما سترى في قسم "6.4.4. بحث القيادة"، وهناك العديد من الأشياء التي يمكن أن تحدد لمعيار البحث. لاحظ أن لديك لSELECT علبة بريد (اسم IMAP لمجلد) قبل أن تتمكن من البحث عن أي شيء. (البحث مجلدات متعددة في وقت واحد يتطلب اتصالات IMAP متعددة، كما أفهمها.) سوف IMAP4.list تساعدك على معرفة ما هي معرفات صندوق البريد.

وأيضا مفيدة في صياغة الجمل التي تمرر إلى imaplib هو "9. الرسمي بناء الجملة" من RFC مرتبطة أعلاه.

ووr'(\HasNoChildren) "/"' هو العلم علبة البريد على صندوق بريد الجذر، /. انظر "7.2.6. استجابة الأعلام".

وحظا سعيدا!

نصائح أخرى

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"')

أسهل طريقة استخدام imaplib مع Gmail هو استخدام X-GM-RAW السمة كما هو موضح في Gmail Imap امتداد الصفحة.

العملية سوف يكون مثل هذا الطقس:

الأولى ربط الحساب مع البريد الإلكتروني وكلمة المرور:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
password = 'spamspamspam'
c.login(email, password)

ثم وصل إلى أحد المجلدات/التسميات:

c.select("INBOX")

إذا لزم الأمر يمكنك سرد كافة المجلدات المتوفرة/التسميات مع c.list().

وأخيرا استخدام طريقة البحث:

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

في gmail_search يمكنك استخدام نفس البحث في بناء الجملة المستخدم في جوجل البحث المتقدم.

البحث الأمر سيعود مركز القيادة ومعرفات من كل الرسائل التي تطابق gmail_search.

بعد هذا يمكنك جلب كل الرسائل عن طريق id مع:

for id in data[0].split():
    status, data = gmail.fetch(id, '(BODY[TEXT])')

ولقد كنت مندهشا جدا أن imaplib لا تفعل الكثير من إعراب استجابة. ويبدو أن الاستجابات كانت وضعت ليكون من الصعب تحليل.

وFWIW، للإجابة على سؤالي الخاص:     c.search (لا يوجد، 'جنرال موتورز')

و(ليس لدي أي فكرة عما "(\ HasNoChildren)" / "" جزء حوالي).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top