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程序与系统shell交互的方式
Apr 09 Python
python使用pymysql实现操作mysql
Sep 13 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
python和flask中返回JSON数据的方法
Mar 26 Python
对python读取CT医学图像的实例详解
Jan 24 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
用python发送微信消息
Dec 21 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
十天学会php(2)
2006/10/09 PHP
php getsiteurl()函数
2009/09/05 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
python中的yield使用方法
2014/02/11 Python
Python中的多重装饰器
2015/04/11 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
音乐器材管理制度
2014/01/31 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
学生安全责任书模板
2014/07/25 职场文书
婚庆公司计划书
2014/09/15 职场文书
个人工作能力自我评价
2015/03/05 职场文书
外贸英文求职信范文
2015/03/19 职场文书
自我推荐信怎么写
2015/03/24 职场文书
欢送会主持词
2015/07/01 职场文书
校园安全主题班会
2015/08/12 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android