python+POP3实现批量下载邮件附件


Posted in Python onJune 19, 2018

最近新开学,接到了给老板的本科课程当助教的工作,百十来号人一学期下来得有四五次作业发进邮箱里,需要我来统计打分,想想挨个点进去下载附件的过程就头大,于是萌生了写个脚本来统计作业的想法。

其实python里收发邮件都有很方便的包,合理使用就好,可以解决绝大多数的邮件收发任务。但是这个脚本写下来还是花了不少时间,其中最大的一部分时间是花在了python的编码问题上,python2和python3的编码预设有些许的不一样,在python3中又取消了unicode这个方法,这就导致很多在python2中写的例程都没法在3中运行。

经过修改以后下面的脚本可以从邮箱中获取指定日期范围内的邮件附件,并存如指定目录中。

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
import poplib 
import email 
import datetime 
import time 
import os 
import xlrd 
import xlwt 
from email.parser import Parser 
from email.header import decode_header 
from email.utils import parseaddr 
 
 
 
# 输入邮件地址, 口令和POP3服务器地址: 
email = 'xxxxxxxx@qq.com' 
password = 'xxxxxxxxxxx' 
pop3_server = 'pop.qq.com' 
 
 
 
def decode_str(s):#字符编码转换 
  value, charset = decode_header(s)[0] 
  if charset: 
    value = value.decode(charset) 
  return value 
 
 
def get_att(msg): 
  import email 
  attachment_files = [] 
   
  for part in msg.walk(): 
    file_name = part.get_filename()#获取附件名称类型 
    contType = part.get_content_type() 
     
    if file_name:  
      h = email.header.Header(file_name) 
      dh = email.header.decode_header(h)#对附件名称进行解码 
      filename = dh[0][0] 
      if dh[0][1]: 
        filename = decode_str(str(filename,dh[0][1]))#将附件名称可读化 
        print(filename) 
        #filename = filename.encode("utf-8") 
      data = part.get_payload(decode=True)#下载附件 
      att_file = open('E:\\L\\zy\\307\\' + filename, 'wb')#在指定目录下创建文件,注意二进制文件需要用wb模式打开 
      attachment_files.append(filename) 
      att_file.write(data)#保存附件 
      att_file.close() 
  return attachment_files 
 
     
       
# 连接到POP3服务器,有些邮箱服务器需要ssl加密,对于不需要加密的服务器可以使用poplib.POP3() 
server = poplib.POP3_SSL(pop3_server) 
server.set_debuglevel(1) 
# 打印POP3服务器的欢迎文字: 
print(server.getwelcome().decode('utf-8')) 
# 身份认证: 
server.user(email) 
server.pass_(password) 
# 返回邮件数量和占用空间: 
print('Messages: %s. Size: %s' % server.stat()) 
# list()返回所有邮件的编号: 
resp, mails, octets = server.list() 
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...] 
print(mails) 
index = len(mails) 
 
 
 
for i in range(index,0,-1): 
  #倒序遍历邮件 
  resp, lines, octets = server.retr(i) 
  # lines存储了邮件的原始文本的每一行, 
  #邮件的原始文本: 
  msg_content = b'\r\n'.join(lines).decode('utf-8') 
  #解析邮件: 
  msg = Parser().parsestr(msg_content) 
  #获取邮件时间 
  date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') #格式化收件时间 
  date2 = time.strftime("%Y%m%d", date1)#邮件时间格式转换 
  if (date2<'20180306')|(date2>'20180314'): 
     
    continue 
  f_list = get_att(msg)#获取附件 
   
     
   
  #print_info(msg) 
 
server.quit()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单实现python爬虫功能
Dec 31 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
PyQt5 多窗口连接实例
Jun 19 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
如何基于python实现单目三维重建详解
Jun 25 Python
python实现批量解析邮件并下载附件
Jun 19 #Python
Python3使用SMTP发送带附件邮件
Jun 16 #Python
Python3使用turtle绘制超立方体图形示例
Jun 19 #Python
python3使用SMTP发送HTML格式邮件
Jun 19 #Python
python3.X 抓取火车票信息【修正版】
Jun 19 #Python
python3使用SMTP发送简单文本邮件
Jun 19 #Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 #Python
You might like
php empty函数 使用说明
2009/08/10 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
微信小程序全局变量功能与用法详解
2019/01/22 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python三级菜单的实例
2017/09/13 Python
python购物车程序简单代码
2018/04/18 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python实现Restful API的例子
2019/08/31 Python
python列表推导式操作解析
2019/11/26 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
计算机求职信
2013/12/01 职场文书
优秀广告词大全
2014/03/19 职场文书
竞赛口号大全
2014/06/16 职场文书
运动会加油稿20字
2014/11/15 职场文书
公司车辆维修管理制度
2015/08/05 职场文书