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判断字符串是否纯数字的方法
Nov 19 Python
Python实现把json格式转换成文本或sql文件
Jul 10 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
python中Switch/Case实现的示例代码
Nov 09 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
Python 查找字符在字符串中的位置实例
May 02 Python
python 进程的几种创建方式详解
Aug 29 Python
python+mysql实现个人论文管理系统
Oct 25 Python
python3下pygame如何实现显示中文
Jan 11 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
vue 左滑删除功能的示例代码
2019/01/28 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
简单上手Python中装饰器的使用
2015/07/12 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python在文本开头插入一行的实例
2018/05/02 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
Python之列表实现栈的工作功能
2019/01/28 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
2016继续教育研修日志
2015/11/13 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
银行求职信范文
2019/05/13 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js