详解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中的深拷贝和浅拷贝详解
Jun 03 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
python批量查询、汉字去重处理CSV文件
May 31 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 动态生成私有变量访问器
2009/12/06 Javascript
深入分析JQuery和JavaScript的异同
2014/10/23 Javascript
使用js实现数据格式化
2014/12/03 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
python 网络编程常用代码段
2016/08/28 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
《火烧云》教学反思
2014/04/12 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle