python之poplib模塊下載並解析郵件


# -*- 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:我就是標題
----------------------------------------
見到我,表示郵件發送成功
'''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM