2010-11-01 17 views
18

पर मेल अटैचमेंट प्राप्त करना मुझे एक ईमेल मल्टीपार्ट संदेश ऑब्जेक्ट मिला है, और मैं उस ईमेल संदेश में अनुलग्नक को पायथन फ़ाइल ऑब्जेक्ट में कनवर्ट करना चाहता हूं। क्या यह संभव है? यदि यह संभव है, तो पाइथन I में किस विधि या वर्ग को ऐसा कार्य करने में देखना चाहिए?पायथन फ़ाइल ऑब्जेक्ट

+0

अजगर पुस्तकालय के किस हिस्से आप अब तक पढ़ा है कर रहे हैं? क्या आपने पॉप या इमेप पुस्तकालयों को बिल्कुल देखा है? –

+0

मैंने केवल ईमेल.मेसेज में देखा है। संदेश और mimetools.Message। ठीक है, मैं पॉप और इमेल में पढ़ूंगा और देख सकता हूं कि मैं इसके साथ क्या कर सकता हूं। –

उत्तर

47

मैं वास्तव में समझ नहीं पा रहा हूं कि "ईमेल मल्टीपार्ट संदेश ऑब्जेक्ट" से आपका क्या मतलब है। क्या आपका मतलब email.message.Message वर्ग से संबंधित एक वस्तु है?

यदि आपका मतलब है, तो यह सीधा है। मल्टीपार्ट संदेश पर, get_payload विधि संदेश भागों की एक सूची लौटाती है (जिनमें से प्रत्येक स्वयं Message ऑब्जेक्ट है)। आप इन हिस्सों पर पुन: प्रयास कर सकते हैं और उनकी गुणों की जांच कर सकते हैं: उदाहरण के लिए, get_content_type विधि भाग के एमआईएमई प्रकार को लौटाती है, और get_filename विधि भाग का फ़ाइल नाम (यदि कोई संदेश में निर्दिष्ट है) देता है। फिर जब आपको सही संदेश भाग मिल गया है, तो आप डीकोडेड सामग्री प्राप्त करने के लिए get_payload(decode=True) पर कॉल कर सकते हैं।

>>> import email 
>>> msg = email.message_from_file(open('message.txt')) 
>>> len(msg.get_payload()) 
2 
>>> attachment = msg.get_payload()[1] 
>>> attachment.get_content_type() 
'image/png' 
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True)) 

आप प्रोग्राम ई-मेल संदेशों के लिए आपको प्राप्त से संलग्नक निकालने रहे हैं, तो आप वायरस और ट्रोजन के खिलाफ सावधानी बरतने की चाह सकते हैं। विशेष रूप से, आपको शायद उन अनुलग्नकों को निकालना चाहिए जिनके एमआईएम प्रकार जिन्हें आप जानते हैं सुरक्षित हैं, और शायद आप अपना स्वयं का फ़ाइल नाम चुनना चाहते हैं, या कम से कम get_filename के आउटपुट को स्वच्छ करना चाहते हैं।

+0

यह बहुत अच्छा काम करता है। धन्यवाद। –

+1

एचटीएमएल मेल में अक्सर पाद लेखों में छवियां होती हैं, जिन्हें अनुलग्नक के रूप में भी भेजा जाता है। सामग्री-विस्थापन को देखकर आप इन्हें "वास्तविक" अनुलग्नकों से अलग कर सकते हैं: इनलाइन छवियां "इनलाइन" से शुरू होती हैं, जबकि वास्तविक अनुलग्नक "अनुलग्नक" से शुरू होते हैं। सामग्री स्वभाव प्राप्त करने के लिए कोई विधि नहीं है, लेकिन आप part.get ('Content-disposition') को कॉल कर सकते हैं। Startwith ('attachment') यदि आप केवल वास्तविक अनुलग्नकों में रूचि रखते हैं। – jrial

9

यहाँ समाधान काम कर रहा है, संदेशों रूप IMAP सर्वर

self.imap.select() 
typ, data = self.imap.uid('SEARCH', 'ALL') 
msgs = data[0].split() 
print "Found {0} msgs".format(len(msgs)) 

for uid in msgs: 
    typ, s = self.imap.uid('FETCH', uid, '(RFC822)') 
    mail = email.message_from_string(s[0][1]) 

    print "From: {0}, Subject: {1}, Date: {2}\n".format(mail["From"], mail["Subject"], mail["Date"]) 

    if mail.is_multipart(): 
     print 'multipart' 
     for part in mail.walk(): 
      ctype = part.get_content_type() 
      if ctype in ['image/jpeg', 'image/png']: 
       open(part.get_filename(), 'wb').write(part.get_payload(decode=True)) 
संबंधित मुद्दे