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爬虫的基本写法
Jan 08 Python
Python实现PS图像抽象画风效果的方法
Jan 23 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
Django+Xadmin构建项目的方法步骤
Mar 06 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
python 计算一个字符串中所有数字的和实例
Jun 11 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
Python爬虫requests库多种用法实例
May 28 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Python使用pyecharts控件绘制图表
Jun 05 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操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
JS判定是否原生方法
2013/07/22 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
node+multer实现图片上传的示例代码
2020/02/18 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python中尾递归用法实例详解
2015/04/28 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python实现读取命令行参数的方法
2015/05/22 Python
Python实现控制台进度条功能
2016/01/04 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Python自动化操作实现图例绘制
2020/07/09 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
建筑实习自我鉴定
2013/10/18 职场文书
毕业生实习鉴定
2013/12/11 职场文书
大二自我鉴定
2014/01/31 职场文书
简历自我评价模板
2015/03/11 职场文书
行政处罚告知书
2015/07/01 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript