详解python实现读取邮件数据并下载附件的实例


Posted in Python onAugust 03, 2017

详解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读取邮件并下载邮件附件的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
python实现目录树生成示例
Mar 28 Python
Python 绘图和可视化详细介绍
Feb 11 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
python字典改变value值方法总结
Jun 21 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
Python列表切片常用操作实例解析
Dec 16 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
django配置app中的静态文件步骤
Mar 27 Python
彻底解决Python包下载慢问题
Nov 15 Python
flask项目集成swagger的方法
Dec 09 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 #Python
Python 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 #Python
python中MethodType方法介绍与使用示例
Aug 03 #Python
初学python的操作难点总结(新手必看篇)
Aug 03 #Python
python 禁止函数修改列表的实现方法
Aug 03 #Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 #Python
详解Python import方法引入模块的实例
Aug 02 #Python
You might like
PHP编写的图片验证码类文件分享
2016/06/06 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
python打开文件并获取文件相关属性的方法
2015/04/23 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
详解python中*号的用法
2019/10/21 Python
PyTorch中permute的用法详解
2019/12/30 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
内容编辑个人求职信
2013/12/10 职场文书
办公室文书岗位职责
2013/12/16 职场文书
五好党支部事迹材料
2014/02/06 职场文书
《日月潭》教学反思
2014/02/28 职场文书
护士求职信范文
2014/05/24 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
初二物理教学反思
2016/02/19 职场文书
学习nginx基础知识
2021/09/04 Servers
Nginx实现负载均衡的项目实践
2022/03/18 Servers