python中使用poplib模組接收郵件

weixin_34402408發表於2019-01-04

轉載

#!/usr/bin/env python3
# -*- encoding=utf-8 -*-
import sys
import locale
import poplib
from email.parser import Parser
import email
from email.header import decode_header
from email.utils import parseaddr
import string

#輸出當前環境預設的編碼方式
__g_codeset = sys.getdefaultencoding()
print __g_codeset


#設定系統的編碼方式
reload(sys)
sys.setdefaultencoding( "utf-8" )
#確定執行環境的encoding
__g_codeset = sys.getdefaultencoding()
print __g_codeset


# 伺服器及使用者資訊
host = 'pop.qq.com'
username = '**73***@qq.com'
password = 'dds****o****b**f'
conn = poplib.POP3_SSL(host)
# 設定除錯模式,可以看到與伺服器的互動資訊
# #### debug sentence #####
conn.set_debuglevel(1)

# 列印歡迎資訊
print(conn.getwelcome())
# 身份認證
conn.user(username)
conn.pass_(password)

print '********'
#獲取伺服器上信件資訊,返回一個列表,第一項是一共有多少封郵件,第二項是共有多少位元組 
mail_total,total_size = conn.stat()

print('message: %s.Size:%s'%(mail_total,total_size))

resp, mails, octets = conn.list()

print resp, mails, octets



mail = conn.retr(len(mails))[1]
print 'lines:',len(mail)

msg = Parser().parsestr('\r\n'.join(mail))
print msg


#編碼處理
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  %s'%(header,value,name)
            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 '不是文字'
            

print_info(msg,0)

#退出
conn.quit()


相關文章