详解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开发编码规范
Sep 08 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Python通过属性手段实现只允许调用一次的示例讲解
Apr 21 Python
python批量替换多文件字符串问题详解
Apr 22 Python
NumPy 数组使用大全
Apr 25 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
判断Python中的Nonetype类型
May 25 Python
python之基数排序的实现
Jul 26 Python
Python中的tkinter库简单案例详解
Jan 22 Python
Python实现批量自动整理文件
Mar 16 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
真正的ZIP文件操作类(php)
2007/07/21 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
关于vue-router的那些事儿
2018/05/23 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
python运行其他程序的实现方法
2017/07/14 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
替换python字典中的key值方法
2018/07/06 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
心得体会怎么写
2013/12/30 职场文书
幼儿教师工作感言
2014/02/14 职场文书
人事科岗位职责范本
2014/03/02 职场文书
销售经理竞聘书
2014/03/31 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
党员志愿者活动方案
2014/08/28 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
收入证明申请书
2015/06/12 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
写好Python代码的几条重要技巧
2021/05/21 Python
Nginx内网单机反向代理的实现
2021/11/07 Servers