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进阶教程之词典、字典、dict
Aug 29 Python
python实现抖音视频批量下载
Jun 20 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Python中extend和append的区别讲解
Jan 24 Python
详解python中递归函数
Apr 16 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
python实现本地批量ping多个IP的方法示例
Aug 07 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
python如何支持并发方法详解
Jul 25 Python
利用Python多线程实现图片下载器
Mar 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
论坛头像随机变换代码
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
php socket通信简单实现
2016/11/18 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
ext实现完整的登录代码
2008/08/08 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python调用百度语音REST API
2018/08/30 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
标准自荐信范文
2014/01/29 职场文书
体育教师个人工作总结
2015/02/09 职场文书
张丽莉观后感
2015/06/16 职场文书
Python正则表达式中flags参数的实例详解
2022/04/01 Python
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python