您好,欢迎访问一九零五行业门户网

python如何读取邮件数据以及下载附件的实例详解

这篇文章主要介绍了详解python读取邮件数据并下载附件的实例的相关资料,这里提供实现实例,帮助大家学习理解这部分内容,需要的朋友可以参考下
详解python实现读取邮件数据并下载附件的实例
实现结果图:
实现代码:
#!/usr/bin/python2.7 # _*_ coding: utf-8 _*_ """ @author: markliu """ import poplib import email from email.parser import parser 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 guess_charset(msg): # 先从msg对象获取编码: charset = msg.get_charset() if charset is none: # 如果获取不到,再从content-type字段获取: content_type = msg.get('content-type', '').lower() pos = content_type.find('charset=') if pos >= 0: charset = content_type[pos + 8:].strip() return charset def get_email_headers(msg): # 邮件的from, to, subject存在于根对象上: headers = {} for header in ['from', 'to', 'subject', 'date']: value = msg.get(header, '') if value: if header == 'date': headers['date'] = value if header == 'subject': # 需要解码subject字符串: subject = decode_str(value) headers['subject'] = subject else: # 需要解码email地址: hdr, addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name, addr) if header == 'from': from_address = value headers['from'] = from_address else: to_address = value headers['to'] = to_address content_type = msg.get_content_type() print 'head content_type: ', content_type return headers # indent用于缩进显示: def get_email_cntent(message, base_save_path): j = 0 content = '' attachment_files = [] for part in message.walk(): j = j + 1 file_name = part.get_filename() contenttype = part.get_content_type() # 保存附件 if file_name: # attachment # decode filename h = email.header.header(file_name) dh = email.header.decode_header(h) filename = dh[0][0] if dh[0][1]: # 如果包含编码的格式,则按照该格式解码 filename = unicode(filename, dh[0][1]) filename = filename.encode("utf-8") data = part.get_payload(decode=true) att_file = open(base_save_path + filename, 'wb') attachment_files.append(filename) att_file.write(data) att_file.close() elif contenttype == 'text/plain' or contenttype == 'text/html': # 保存正文 data = part.get_payload(decode=true) charset = guess_charset(part) if charset: charset = charset.strip().split(';')[0] print 'charset:', charset data = data.decode(charset) content = data return content, attachment_files if __name__ == '__main__': # 输入邮件地址, 口令和pop3服务器地址: emailaddress = 'xxxxxx@163.com' # 注意使用开通pop,smtp等的授权码 password = 'xxxxxx' pop3_server = 'pop.163.com' # 连接到pop3服务器: server = poplib.pop3(pop3_server) # 可以打开或关闭调试信息: # server.set_debuglevel(1) # pop3服务器的欢迎文字: print server.getwelcome() # 身份认证: server.user(emailaddress) server.pass_(password) # stat()返回邮件数量和占用空间: messagescount, messagessize = server.stat() print 'messagescount:', messagescount print 'messagessize:', messagessize # list()返回所有邮件的编号: resp, mails, octets = server.list() print '------ resp ------' print resp # +ok 46 964346 响应的状态 邮件数量 邮件占用的空间大小 print '------ mails ------' print mails # 所有邮件的编号及大小的编号list,['1 2211', '2 29908', ...] print '------ octets ------' print octets # 获取最新一封邮件, 注意索引号从1开始: length = len(mails) for i in range(length): resp, lines, octets = server.retr(i + 1) # lines存储了邮件的原始文本的每一行, # 可以获得整个邮件的原始文本: msg_content = '\n'.join(lines) # 把邮件内容解析为message对象: msg = parser().parsestr(msg_content) # 但是这个message对象本身可能是一个mimemultipart对象,即包含嵌套的其他mimebase对象, # 嵌套可能还不止一层。所以我们要递归地打印出message对象的层次结构: print '---------- 解析之后 ----------' base_save_path = '/media/markliu/entertainment/email_attachments/' msg_headers = get_email_headers(msg) content, attachment_files = get_email_cntent(msg, base_save_path) print 'subject:', msg_headers['subject'] print 'from_address:', msg_headers['from'] print 'to_address:', msg_headers['to'] print 'date:', msg_headers['date'] print 'content:', content print 'attachment_files: ', attachment_files # 关闭连接: server.quit()
以上就是python如何读取邮件数据以及下载附件的实例详解的详细内容。
其它类似信息

推荐信息