# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之poplib模塊下載並解析郵件 #https://github.com/michaelliao/learn-python/blob/master/email/fetchmail_pop3.py import poplib,email from email.parser import Parser from email.header import decode_header from email.utils import parseaddr #編碼處理 def guess_charset(msg): charset = msg.get_charset()#從msg對象獲取編碼 if charset is None: content_type = msg.get('Content-Type', '').lower()#如果獲取不到,再從content—type字段獲取 if 'charset' in content_type: charset=content_type.split('charset=')[1].strip() return charset return charset #數據解碼 def decode_str(s): value, charset = decode_header(s)[0]#數據,數據編碼方式,from email.header import decode_header if charset: value = value.decode(charset) return value #print_ingo函數: def print_info(msg, indent=0):#indent用於縮進顯示 if indent == 0: for header in ['From', 'To', 'Subject']:#郵件的from、to、subject存在於根對象上 value = msg.get(header, '') if value: if header=='Subject': value = decode_str(value)#需要解碼subject字符串 else: #解碼mail地址 hdr, addr = parseaddr(value) name = decode_str(hdr) value = '%s' % (addr) print '%s:%s'%(header,value) print '--'*20 if (msg.is_multipart()): #如果郵件對象是一個is_multipart,get_payload()返回一個list,包含所有子對象 parts = msg.get_payload()#循環獲得列表項 for n, part in enumerate(parts): #print('%spart %s' % (' ' * indent, n)) #print('%s------------' % (' ' * indent)) #遞歸打印沒一個子對象 print_info(part, indent + 1) else: #郵件對象不是一個is_multipart,就根據content_type判斷 content_type = msg.get_content_type()#數據類型 if content_type=='text/plain' or content_type=='text/html':#純文本 html文本 #純文本或html內容 content = msg.get_payload(decode=True)#獲得文本對象的字符串而非對象本身 charset = guess_charset(msg)#要檢測文本編碼 if charset:content = content.decode(charset) content='%s' % (content) print content#獲取郵件文本內容,如果只有文本,打印顯示的結果和郵件中看的效果一模一樣 else: print '不是文本' #鏈接到pop3服務器 server=poplib.POP3('pop.163.com') #打印pop3服務器的歡迎對象 #server.getwelcome() #身份認證 email='xxxx@163.com' password='xxxx' server.user(email)#輸入郵件地址 server.pass_(password)#輸入口令 #print('Messages: %s. Size: %s' % server.stat())#Messages: 3. Size: 36090 #請求消息列表,返回所有郵件的編號;可以查看返回的列表類似['1 82923', '2 2184', ...] resp, mails, octets = server.list() #獲取最新一封郵件 #Poplib模塊的retr()函數使用來下載郵件的。它每次剛好下載一封郵件,我們必須傳遞給他想要下載的郵件的數字。 #print mails#['1 2721', '2 2784', '3 2986', '4 28987', '5 10056', '6 753', '7 763'] #注意索引號從1開始,那么最新的一封郵件就是索引最大的那個數值 lenString=len(mails) resp, mailContent, octets = server.retr(lenString)#mailContent:郵件內容 #解析郵件:只需要一行代碼就可以把郵件內容解析為Message對象 msg = Parser().parsestr('\r\n'.join(mailContent)) #打印郵件內容,調用print_info函數: print_info(msg) #server.dele(len(mails))#慎重:將直接從服務器刪除郵件: #關閉連接: server.quit() ''' From:dengyg200891@163.com ---------------------------------------- To:drgs156@163.com ---------------------------------------- Subject:我就是標題 ---------------------------------------- 見到我,表示郵件發送成功 '''
