2012-12-01 24 views
12

मैं जीमेल खाते से सभी संदेश प्राप्त करने की कोशिश कर रहा हूं जिसमें कुछ बड़े अनुलग्नक (लगभग 30 एमबी) हो सकते हैं। मुझे सिर्फ फाइलों की जरूरत है, न कि पूरी फाइलें। मैं एक संदेश और लगाव का नाम प्राप्त करने के लिए कोड का एक टुकड़ा मिला, लेकिन यह फ़ाइल डाउनलोड करता है और फिर जैसा कि इसके नाम से पढ़ें:इसे डाउनलोड किए बिना जीमेल अटैचमेंट फ़ाइल नाम प्राप्त करें

import imaplib, email 

#log in and select the inbox 
mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login('username', 'password') 
mail.select('inbox') 

#get uids of all messages 
result, data = mail.uid('search', None, 'ALL') 
uids = data[0].split() 

#read the lastest message 
result, data = mail.uid('fetch', uids[-1], '(RFC822)') 
m = email.message_from_string(data[0][1]) 

if m.get_content_maintype() == 'multipart': #multipart messages only 
    for part in m.walk(): 
     #find the attachment part 
     if part.get_content_maintype() == 'multipart': continue 
     if part.get('Content-Disposition') is None: continue 

     #save the attachment in the program directory 
     filename = part.get_filename() 
     fp = open(filename, 'wb') 
     fp.write(part.get_payload(decode=True)) 
     fp.close() 
     print '%s saved!' % filename 

मैं इस एक मिनट में क्या करना है, तो मैं के सैकड़ों डाउनलोड नहीं कर सकता डेटा का एमबी। मैं वेब स्क्रिप्टिंग में नौसिखिया हूं, तो क्या कोई मेरी मदद कर सकता है? मुझे वास्तव में imaplib का उपयोग करने की आवश्यकता नहीं है, किसी भी पायथन lib मेरे लिए ठीक रहेगा।

सादर

+0

आप जीमेल में केवल 20 एमबी भेज सकते हैं क्या आप जानते हैं? – 0x90

+0

मेरा मतलब है सभी संदेशों में सभी अनुलग्नक। – mopsiok

उत्तर

8

RFC822 लाने की बजाय, जो पूर्ण सामग्री है, आप BODYSTRUCTURE निर्दिष्ट कर सकते हैं।

imaplib से परिणामी डेटा संरचना बहुत भ्रमित है, लेकिन आप पूरी चीज़ को डाउनलोड किए बिना संदेश के प्रत्येक भाग के फ़ाइल नाम, सामग्री-प्रकार और आकार ढूंढने में सक्षम होना चाहिए।

+0

और यही वह है जो मैं ढूंढ रहा था ... परिणाम वास्तव में भ्रमित है, लेकिन यह काम करता है। आपको बहुत - बहुत धन्यवाद! – mopsiok

+0

वही है जो मैं भी ढूंढ रहा था। लेकिन क्या आपको कोई पागल परिणाम है कि उस पागल परिणाम स्ट्रिंग को कैसे पार्स किया जाए? @ mopsiok, आप इसके साथ कैसे निपट गए? – jjon

+1

मैंने इसके साथ कुछ परीक्षण किए हैं, लेकिन परिणाम बहुत अच्छे नहीं थे। असल में मुझे अपने आवेदन के लिए संलग्नक सूची बहुत अपर्याप्त मिल रही है। आखिरकार मुझे सभी मेल सामग्री मिल रही है, पाठ और सभी अनुलग्नक इसे गुजरकर प्राप्त कर रहे हैं। मुझे पार्सिंग कोड नहीं मिला है, जैसा कि मैंने कहा था कि यह अप्रभावी था। माफ़ कीजिये... – mopsiok

3

आप फ़ाइल नाम के बारे में कुछ पता है, तो आप X-GM-RAW gmail extensions for imap SEARCH command उपयोग कर सकते हैं। ये एक्सटेंशन आपको संदेशों को फ़िल्टर करने के लिए gmail advanced search क्वेरी का उपयोग करने देते हैं। इस तरह आप डाउनलोड संदेशों को डाउनलोड प्रतिबंधित कर सकते हैं, या कुछ संदेशों को बाहर कर सकते हैं जिन्हें आप नहीं चाहते हैं।

mail.uid('search', None, 'X-GM-RAW', 
     'has:attachment filename:pdf in:inbox -label:parsed')) 

INBOX में पीडीएफ संलग्नक वाले संदेशों के लिए उपरोक्त खोज "पार्स" लेबल नहीं है।

कुछ समर्थक टिप्स:

  • लेबल संदेशों आप पहले से ही, पार्स है आप ऐसा फिर उन्हें लाने की जरूरत नहीं है (-label: ऊपर के उदाहरण में पार्स फिल्टर)
  • हमेशा उपयोग मानक अनुक्रमिक आईडी के बजाय यूआईडी संस्करण (आप पहले से ही यह कर रहे हैं)
  • दुर्भाग्य से एमआईएम गन्दा है: बहुत सारे ग्राहक अजीब (या सादे गलत) चीजें करते हैं। आप केवल हेडर डाउनलोड और पार्स करने का प्रयास कर सकते हैं, लेकिन क्या यह समस्या के लायक है?

[संपादित करें]

आप इसे पार्स करने के बाद संदेश लेबल हैं, तो आप संदेशों आप पहले से ही पार्स है छोड़ सकते हैं। यह आपके क्लास मेलबॉक्स की निगरानी के लिए पर्याप्त उचित होना चाहिए।

शायद आप दुनिया के कोने में रहते हैं जहां इंटरनेट बैंडविड्थ प्रोग्रामर समय से अधिक महंगा है; इस मामले में, आप केवल शीर्षलेख प्राप्त कर सकते हैं और "सामग्री-स्वभाव" == "अनुलग्नक; फ़ाइल नाम = somefilename.ext" ढूंढ सकते हैं।

+0

यह अच्छा है, लेकिन समस्या यह है कि मुझे लगाव के बारे में कुछ नहीं पता है। मैं अपने वर्ग के खाते के सभी जीमेल इनबॉक्स को "स्कैन" करने के लिए एक स्क्रिप्ट लिख रहा हूं और मुझे बताता हूं कि यह कुछ नया है, जिसमें संलग्नक (नाम और आकार) के बारे में जानकारी शामिल है। अपठित संदेशों की खोज काम नहीं करेगी क्योंकि खाता 30 लोगों द्वारा उपयोग किया जाता है। – mopsiok

+0

कम से कम आप संलग्नक के बिना संदेशों को छोड़ सकते हैं और जिन संदेशों को आपने पहले ही पार्स किया है; ध्यान दें कि आप आकार के अनुसार भी फ़िल्टर कर सकते हैं। –

+0

बेशक मैं कर सकता हूं, लेकिन पहले से पार्स किए गए संदेशों को छोड़ने में कोई समस्या नहीं है। समस्या एक मिनट में 20 एमबी अनुलग्नकों के साथ अगले 20 संदेशों को पार्स करना है। – mopsiok

2

RFC822 संदेश डेटा आइटम का एक फ़ंक्शन BODY[] के समतुल्य समतुल्य है। IMAP4 section 6.4.5 of RFC 3501 में सूचीबद्ध अन्य संदेश डेटा आइटम का समर्थन करता है।

केवल आपको आवश्यक जानकारी प्राप्त करने के लिए संदेश डेटा आइटम के एक अलग सेट का अनुरोध करने का प्रयास करें। उदाहरण के लिए, आप RFC822.HEADER या शायद BODY.PEEK[MIME] आज़मा सकते हैं।

0

पुराना सवाल, लेकिन बस इस समाधान को साझा करना चाहता था कि मैं आज के साथ आया हूं। अनुलग्नकों के साथ सभी ईमेल के लिए खोजें और यूआईडी, प्रेषक, विषय, और अनुलग्नकों की एक स्वरूपित सूची आउटपुट करता है।संपादित प्रासंगिक कोड कैसे BODYSTRUCTURE फ़ॉर्मेट करने के लिए दिखाने के लिए:

data = mailobj.uid('fetch', mail_uid, '(BODYSTRUCTURE)')[1] 
    struct = data[0].split()   
    list = []      #holds list of attachment filenames 

    for j, k in enumerate(struct): 
     if k == '("FILENAME"': 
      count = 1 
      val = struct[j + count] 
      while val[-3] != '"': 
       count += 1 
       val += " " + struct[j + count] 
      list.append(val[1:-3]) 
     elif k == '"FILENAME"': 
      count = 1 
      val = struct[j + count] 
      while val[-1] != '"': 
       count += 1 
       val += " " + struct[j + count] 
      list.append(val[1:-1]) 

मैं भी GitHub पर प्रकाशित किया है।

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