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 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
Python创建xml的方法
Mar 10 Python
python创建一个最简单http webserver服务器的方法
May 08 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
Selenium定位元素操作示例
Aug 10 Python
Django的性能优化实现解析
Jul 30 Python
Python 类属性与实例属性,类对象与实例对象用法分析
Sep 20 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python实现按日期归档文件
Jan 30 Python
python周期任务调度工具Schedule使用详解
Nov 23 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程序--记数器
2006/10/09 PHP
php minixml详解
2008/07/19 PHP
PHP6 mysql连接方式说明
2009/02/09 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
对比分析json及XML
2014/11/28 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
Python实现基本线性数据结构
2016/08/22 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python ubplot使用方法解析
2020/01/10 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
TripAdvisor台湾:全球最大旅游网站
2018/08/26 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
司机辞职报告范文
2014/01/20 职场文书
学校三节实施方案
2014/06/09 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
银行给客户的感谢信
2015/01/23 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
彻底理解golang中什么是nil
2021/04/29 Golang
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript