2010-02-09 9 views
16

मैं पूरा संदेश IMAP4 सर्वर से प्राप्त करना चाहता हूं।पायथन में imaplib का उपयोग कर एक ईमेल निकाय कैसे प्राप्त करें?

>>> t, data = M.fetch('1', '(RFC822)') 
>>> body = data[0][1] 

मैं अगर मैं हमेशा भरोसा कर सकते हैं डेटा [0] [1] संदेश के मुख्य भाग देता है कि सोच रहा हूँ: अजगर डॉक्स में अगर वह काम करता है कोड के इस बिट पाया। जब मैंने 'RFC822.SIZE' चलाया है तो मुझे बस एक टुपल की बजाय एक स्ट्रिंग मिल गई है।

मैंने आरएफसी 1730 के माध्यम से स्किम किया है लेकिन मैं 'आरएफसी 822' के लिए उचित प्रतिक्रिया संरचना को समझने में सक्षम नहीं था। इमेप्लिब दस्तावेज से fetch परिणाम संरचना को बताना मुश्किल है।

('OK', [('1 (RFC822 {858569}', 'body of the message', ')')]) 

लेकिन मैं हो रही है जब मैं RFC822.SIZE लाने:

('OK', ['1 (RFC822.SIZE 847403)']) 

मैं कैसे ठीक से [0] सूची डेटा को संभाल चाहिए

यहाँ जब RFC822 प्राप्त करते समय मैं क्या हो रही है है ? क्या मैं भरोसा कर सकता हूं कि जब यह टुपल्स की सूची है तो टुपल्स में बिल्कुल 3 भाग होते हैं और दूसरा भाग पेलोड होता है?

शायद आप imap4 के लिए कोई बेहतर लाइब्रेरी जानते हैं?

+0

यदि u सफलतापूर्वक मेल के शरीर को पुनः प्राप्त कर सकते हैं आप कृपया कोड का हिस्सा? – hussain

उत्तर

19

नहीं ... imaplib एक बहुत अच्छी लाइब्रेरी है, यह इंपैप इतना अनजान है।

आप t == 'OK' को जांचना चाहते हैं, लेकिन data[0][1] जितना मैंने उपयोग किया है उतना ही काम किया है।

यहाँ एक त्वरित उदाहरण मैं हस्ताक्षरित प्रमाणपत्र मैं ईमेल द्वारा प्राप्त हो गया है, नहीं बम प्रूफ को निकालने के लिए उपयोग करते हैं, लेकिन मेरे प्रयोजनों के सूट:

import getpass, os, imaplib, email 
from OpenSSL.crypto import load_certificate, FILETYPE_PEM 

def getMsgs(servername="myimapserverfqdn"): 
    usernm = getpass.getuser() 
    passwd = getpass.getpass() 
    subject = 'Your SSL Certificate' 
    conn = imaplib.IMAP4_SSL(servername) 
    conn.login(usernm,passwd) 
    conn.select('Inbox') 
    typ, data = conn.search(None,'(UNSEEN SUBJECT "%s")' % subject) 
    for num in data[0].split(): 
    typ, data = conn.fetch(num,'(RFC822)') 
    msg = email.message_from_string(data[0][1]) 
    typ, data = conn.store(num,'-FLAGS','\\Seen') 
    yield msg 

def getAttachment(msg,check): 
    for part in msg.walk(): 
    if part.get_content_type() == 'application/octet-stream': 
     if check(part.get_filename()): 
     return part.get_payload(decode=1) 

if __name__ == '__main__': 
    for msg in getMsgs(): 
    payload = getAttachment(msg,lambda x: x.endswith('.pem')) 
    if not payload: 
     continue 
    try: 
     cert = load_certificate(FILETYPE_PEM,payload) 
    except: 
     cert = None 
    if cert: 
     cn = cert.get_subject().commonName 
     filename = "%s.pem" % cn 
     if not os.path.exists(filename): 
     open(filename,'w').write(payload) 
     print "Writing to %s" % filename 
     else: 
     print "%s already exists" % filename 
+0

यह जानकर अच्छा लगा कि यह आपके लिए काम करता है। लेकिन किसी भी विचार का वर्णन क्यों किया गया है? –

+0

वापसी मान टोकनयुक्त IMAP सर्वर प्रतिक्रिया हैं। – MattH

+0

संभावित रूप से उच्च-स्तरीय इमेप पुस्तकालयों को विभिन्न इमेप कार्यान्वयन के बीच foibles से निपटने की आवश्यकता है, या असंगत होना चाहिए। – MattH

7

IMAPClient पैकेज के साथ काम करने के लिए एक निष्पक्ष थोड़ा आसान है। विवरण से:

उपयोग में आसान, पायथनिक और पूर्ण IMAP क्लाइंट लाइब्रेरी।

+0

है, मैं इसका समर्थन करता हूं। IMAPClient उपयोग करने और ऑब्जेक्ट उन्मुख करने के लिए बहुत है। Imaplib की तुलना में उपयोग करना बहुत आसान है और इसमें कोई बड़ी समस्या नहीं है। – zoobert

0

यह जानकारी की उपयोगी बिट्स निकालने के लिए मेरे समाधान था। प्रभावी IMAP प्रोटोकॉल का उपयोग कर ई-मेल संदेश के साथ काम करने के लिए

import datetime 
import email 
import imaplib 
import mailbox 


EMAIL_ACCOUNT = "[email protected]" 
PASSWORD = "your password" 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login(EMAIL_ACCOUNT, PASSWORD) 
mail.list() 
mail.select('inbox') 
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN) 
i = len(data[0].split()) 

for x in range(i): 
    latest_email_uid = data[0].split()[x] 
    result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)') 
    # result, email_data = conn.store(num,'-FLAGS','\\Seen') 
    # this might work to set flag to seen, if it doesn't already 
    raw_email = email_data[0][1] 
    raw_email_string = raw_email.decode('utf-8') 
    email_message = email.message_from_string(raw_email_string) 

    # Header Details 
    date_tuple = email.utils.parsedate_tz(email_message['Date']) 
    if date_tuple: 
     local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple)) 
     local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S"))) 
    email_from = str(email.header.make_header(email.header.decode_header(email_message['From']))) 
    email_to = str(email.header.make_header(email.header.decode_header(email_message['To']))) 
    subject = str(email.header.make_header(email.header.decode_header(email_message['Subject']))) 

    # Body details 
    for part in email_message.walk(): 
     if part.get_content_type() == "text/plain": 
      body = part.get_payload(decode=True) 
      file_name = "email_" + str(x) + ".txt" 
      output_file = open(file_name, 'w') 
      output_file.write("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\nBody: \n\n%s" %(email_from, email_to,local_message_date, subject, body.decode('utf-8'))) 
      output_file.close() 
     else: 
      continue 
0

imap-tools पुस्तकालय: यह अब तक विश्वसनीय हो गया है।

  • पत्र विशेषताएं (यूआईडी सहित)
  • निर्देशिका में पत्र के साथ काम (प्रतिलिपि, हटाने, झंडा, चाल, देखा)
  • निर्देशिका (सूची, सेट के साथ काम करते हैं,, मिल बनाने के साथ पारदर्शी काम करते हैं, मौजूद है , नाम बदलने, हटाने, स्थिति)
  • कोई बाहरी निर्भरता
संबंधित मुद्दे