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将xml和xsl转换为html的方法
Mar 10 Python
Python变量和字符串详解
Apr 29 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
Python函数装饰器实现方法详解
Dec 22 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
浅谈Python3中print函数的换行
Aug 05 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模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
Python3标准库总结
2019/02/19 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
python numpy中cumsum的用法详解
2019/10/17 Python
django从后台返回html代码的实例
2020/03/11 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
幼儿教师培训感言
2014/03/08 职场文书
继承公证书
2014/04/09 职场文书
一分钟演讲稿
2014/04/30 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
综合实践活动报告
2015/02/05 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
python实现简单区块链结构
2021/04/25 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers