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 18 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python 类的继承实例详解
Mar 25 Python
python django 实现验证码的功能实例代码
May 18 Python
Python使用numpy实现BP神经网络
Mar 10 Python
Python 处理图片像素点的实例
Jan 08 Python
python2使用bs4爬取腾讯社招过程解析
Aug 14 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
Python基于network模块制作电影人物关系图
Jun 19 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python字典与json转换的方法总结
Dec 28 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笔记之:文章中图片处理的使用
2013/04/26 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
python验证码识别的实例详解
2016/09/09 Python
Python  Django 母版和继承解析
2019/08/09 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
公司中秋节活动方案
2014/02/12 职场文书
个人合伙协议书范本
2014/10/14 职场文书
英语辞职信范文
2015/02/28 职场文书
2019同学聚会主持词
2019/05/06 职场文书
你真的会用Mysql的explain吗
2022/03/31 MySQL