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使用xlwt模块操作Excel的方法详解
Mar 27 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
python把转列表为集合的方法
Jun 28 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python 实现目录复制的三种小结
Dec 04 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
python如何获取网络数据
Apr 11 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的一个登录的类 [推荐]
2007/03/16 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
20招让你的Python飞起来!
2016/09/27 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
python实现黑客字幕雨效果
2018/06/21 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python编写猜数字小游戏
2019/10/06 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
如何判断计算机可能已经中马
2013/03/22 面试题
通信生自我鉴定
2014/01/18 职场文书
安全教育演讲稿
2014/05/09 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
会计工作总结范文2014
2014/12/23 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis