詳解python實(shí)現(xiàn)讀取郵件數(shù)據(jù)并下載附件的實(shí)例
實(shí)現(xiàn)結(jié)果圖:

實(shí)現(xiàn)代碼:
#!/usr/bin/python2.7# _*_ coding: utf-8 _*_"""@Author: MarkLiu"""import poplibimport emailfrom email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddrdef decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return valuedef guess_charset(msg): # 先從msg對(duì)象獲取編碼: charset = msg.get_charset() if charset is None: # 如果獲取不到,再?gòu)腃ontent-Type字段獲取: content_type = msg.get('Content-Type', '').lower() pos = content_type.find('charset=') if pos >= 0: charset = content_type[pos + 8:].strip() return charsetdef get_email_headers(msg): # 郵件的From, To, Subject存在于根對(duì)象上: headers = {} for header in ['From', 'To', 'Subject', 'Date']: value = msg.get(header, '') if value: if header == 'Date': headers['date'] = value if header == 'Subject': # 需要解碼Subject字符串: subject = decode_str(value) headers['subject'] = subject else: # 需要解碼Email地址: hdr, addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name, addr) if header == 'From': from_address = value headers['from'] = from_address else: to_address = value headers['to'] = to_address content_type = msg.get_content_type() print 'head content_type: ', content_type return headers# indent用于縮進(jìn)顯示:def get_email_cntent(message, base_save_path): j = 0 content = '' attachment_files = [] for part in message.walk(): j = j + 1 file_name = part.get_filename() contentType = part.get_content_type() # 保存附件 if file_name: # Attachment # Decode filename h = email.Header.Header(file_name) dh = email.Header.decode_header(h) filename = dh[0][0] if dh[0][1]: # 如果包含編碼的格式,則按照該格式解碼 filename = unicode(filename, dh[0][1]) filename = filename.encode("utf-8") data = part.get_payload(decode=True) att_file = open(base_save_path + filename, 'wb') attachment_files.append(filename) att_file.write(data) att_file.close() elif contentType == 'text/plain' or contentType == 'text/html': # 保存正文 data = part.get_payload(decode=True) charset = guess_charset(part) if charset: charset = charset.strip().split(';')[0] print 'charset:', charset data = data.decode(charset) content = data return content, attachment_filesif __name__ == '__main__': # 輸入郵件地址, 口令和POP3服務(wù)器地址: emailaddress = 'xxxxxx@163.com' # 注意使用開通POP,SMTP等的授權(quán)碼 password = 'xxxxxx' pop3_server = 'pop.163.com' # 連接到POP3服務(wù)器: server = poplib.POP3(pop3_server) # 可以打開或關(guān)閉調(diào)試信息: # server.set_debuglevel(1) # POP3服務(wù)器的歡迎文字: print server.getwelcome() # 身份認(rèn)證: server.user(emailaddress) server.pass_(password) # stat()返回郵件數(shù)量和占用空間: messagesCount, messagesSize = server.stat() print 'messagesCount:', messagesCount print 'messagesSize:', messagesSize # list()返回所有郵件的編號(hào): resp, mails, octets = server.list() print '------ resp ------' print resp # +OK 46 964346 響應(yīng)的狀態(tài) 郵件數(shù)量 郵件占用的空間大小 print '------ mails ------' print mails # 所有郵件的編號(hào)及大小的編號(hào)list,['1 2211', '2 29908', ...] print '------ octets ------' print octets # 獲取最新一封郵件, 注意索引號(hào)從1開始: length = len(mails) for i in range(length): resp, lines, octets = server.retr(i + 1) # lines存儲(chǔ)了郵件的原始文本的每一行, # 可以獲得整個(gè)郵件的原始文本: msg_content = '/n'.join(lines) # 把郵件內(nèi)容解析為Message對(duì)象: msg = Parser().parsestr(msg_content) # 但是這個(gè)Message對(duì)象本身可能是一個(gè)MIMEMultipart對(duì)象,即包含嵌套的其他MIMEBase對(duì)象, # 嵌套可能還不止一層。所以我們要遞歸地打印出Message對(duì)象的層次結(jié)構(gòu): print '---------- 解析之后 ----------' base_save_path = '/media/markliu/Entertainment/email_attachments/' msg_headers = get_email_headers(msg) content, attachment_files = get_email_cntent(msg, base_save_path) print 'subject:', msg_headers['subject'] print 'from_address:', msg_headers['from'] print 'to_address:', msg_headers['to'] print 'date:', msg_headers['date'] print 'content:', content print 'attachment_files: ', attachment_files # 關(guān)閉連接: server.quit()以上就是python讀取郵件并下載郵件附件的實(shí)例,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選