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对指定目录下文件进行批量重命名的方法
Apr 18 Python
Python将图片转换为字符画的方法
Jun 16 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
python实现文本界面网络聊天室
Dec 12 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 Python
python实现ftp文件传输功能
Mar 20 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
python 画条形图(柱状图)实例
Apr 24 Python
python基于tkinter实现gif录屏功能
May 19 Python
详解python网络进程
Jun 15 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
探讨如何把session存入数据库
2013/06/07 PHP
php实现的xml操作类
2016/01/15 PHP
php blowfish加密解密算法
2016/07/02 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
xheditor与validate插件冲突的解决方案
2010/04/15 Javascript
原生js 秒表实现代码
2012/07/24 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
python编写Logistic逻辑回归
2020/12/30 Python
Python实现学校管理系统
2018/01/11 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
什么是Python中的匿名函数
2020/06/02 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
奥地利网上书店:Weltbild
2017/07/14 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
如何手工释放资源
2013/12/15 面试题
文秘专业自荐信
2013/10/14 职场文书
村干部培训班主持词
2014/03/28 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
努力学习保证书
2015/02/26 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
新闻简讯格式及范文
2015/07/22 职场文书