邮件下载demo

2016-12-20  本文已影响29人  lmem
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

#将邮件附件或内容保存至文件
#即邮件中的附件数据写入附件文件
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

#然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次)
#邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录
#由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码
#如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容
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()返回邮件数量和占用空间:
print('邮件总数: %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,转换成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()
上一篇 下一篇

猜你喜欢

热点阅读