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 list 合并连接字符串的方法
Mar 09 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
python函数中将变量名转换成字符串实例
May 11 Python
python入门教程之基本算术运算符
Nov 13 Python
python 模拟登陆163邮箱
Dec 15 Python
Python Pandas常用函数方法总结
Jun 15 Python
python开发制作好看的时钟效果
May 02 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
第七节 类的静态成员 [7]
2006/10/09 PHP
PHP安全编程之加密功能
2006/10/09 PHP
PHP个人网站架设连环讲(一)
2006/10/09 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
利用jquery实现实时更新歌词的方法
2017/01/06 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
关于vue-resource报错450的解决方案
2017/07/24 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
python ip正则式
2009/05/07 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
python打开音乐文件的实例方法
2020/07/21 Python
Python爬虫与反爬虫大战
2020/07/30 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python SOCKET编程基础入门
2021/02/27 Python
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
What is EJB
2016/07/22 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
简单租房协议书
2014/10/21 职场文书
刮痧观后感
2015/06/05 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android