郵件下載demo

import poplib
import os
from email.parser import Parser
from email.parser import BytesParser
from email.header import decode_header
from email.utils import parseaddr

#解析消息頭中的字符串
def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

#將郵件附件或內(nèi)容保存至文件
#即郵件中的附件數(shù)據(jù)寫入附件文件
def savefile(filename, data, path):
    try:
        filepath = path + filename
        print('Save as: ' + filepath)
        f = open(filepath, 'wb')
        f.write(data)
    except:
        print(filepath + ' open failed')
    finally:
        f.close()

#獲取郵件的字符編碼,首先在message中尋找編碼,如果沒有,就在header的Content-Type中尋找
def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos+8:].strip()
    return charset

#然后調(diào)用message的walk循環(huán)處理郵件中的每一個子對象(包括文本、html、附件一次或多次)
#郵件頭屬性中的filename存在則該子對象是附件,對附件名稱進行編碼并將附件下載到指定目錄
#由于網(wǎng)絡(luò)上傳輸?shù)泥]件都是編碼以后的格式,需要在get_payload的時候指定decode=True來轉(zhuǎn)換成可輸出的編碼
#如果郵件是text或者h(yuǎn)tml格式,打印格式并輸出轉(zhuǎn)碼以后的子對象內(nèi)容
def print_info(msg,i):
    subject = ""
    print("+++++++++++++第%d封郵件+++++++++++++++"%i)
    for header in ['From', 'To', 'Subject']:
        value = msg.get(header, '')
        if value:
            if header == 'Subject':
                subject = value = decode_str(value)
            else:
                hdr, addr = parseaddr(value)
                name = decode_str(addr)
                value = name + ' < ' + addr + ' > '
        print(header + ':' + value)

    for part in msg.walk():
        filename = part.get_filename()
        content_type = part.get_content_type()
        charset = guess_charset(part)
        if filename:
            filename = decode_str(filename)
            ext = os.path.splitext(filename)
            if ext != None:
                filename = subject + str(i) +ext[-1]
            else:
                filename = subject + str(i)
            data = part.get_payload(decode = True)
            if filename != None or filename != '':
                print('存在附件附件名: ' + filename)
                savefile(filename, data, mypath)
        #下載正文
        # else:
        #     email_content_type = ''
        #     content = ''
        #     if content_type == 'text/plain':
        #         email_content_type = 'text'
        #     elif content_type == 'text/html':
        #         email_content_type = 'html'
        #     if charset:
        #         content = part.get_payload(decode=True).decode(charset)
        #     print(email_content_type + ' ' + content)

server = poplib.POP3_SSL('pop.163.com')
server.user('13911118361')
server.pass_('dbzq000686')
# server = poplib.POP3('pop.nesc.cn')
# server.user('dbzqecm')
# server.pass_('dbzq000686')
mypath = 'E:/mail'
# stat()返回郵件數(shù)量和占用空間:
print('郵件總數(shù): %s. 大小: %s' % server.stat())
resp, mails, objects = server.list()
#print(mails)
for i in range(len(mails)):
    k=i+1
    #取出某一個郵件的全部信息
    resp, lines, octets = server.retr(k)
    #郵件取出的信息是bytes,轉(zhuǎn)換成Parser支持的str
    lists = []
    for e in lines:
        try:
            lists.append(e.decode())
        except:
            print(e)
    msg_content = '\r\n'.join(lists)
    msg = Parser().parsestr(msg_content)
    print_info(msg,(k))
    #server.dele(index)
#提交操作信息并退出
server.quit()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容