文章目录

  • 背景需求
  • 一、imap、pop3是什么?
    • 1. POP3
    • 2. imap
    • 3. 技术选型
  • 二、代码示例
    • 1.imap
    • 2.pop3简单示例
  • 总结

背景需求

每小时定时拉取指定邮箱的未读邮件内容:

内容包括:邮件主题,发送人,收件人,抄送人,邮件时间,邮件正文内容,对应的附件文件列表


经过调研,可使用pop3和imap实现

一、imap、pop3是什么?

1. POP3

POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

2. imap

IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
同时,IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。此外,IMAP 更好地支持了从多个不同设备中随时访问新邮件。

3. 技术选型

生产环境使用imap实现,因为涉及到标记已读未读

二、代码示例

1.imap

几乎每一行都有注释,看注释应该就懂

import email
from email.utils import parseaddr
import imaplib
from email.header import decode_header
import os
import time
import urllib.request# 邮箱用户名
email_user = ''# 进入邮箱->设置->账户->开启imap 会生成一个授权码
password = ''#QQ的imap接收邮件服务器。我用的qq,其他邮箱自查一下
imap_server = 'imap.qq.com'# 当前目录,用于存放附件文件路径
save_path = os.getcwd()+"/data"def email_process(email_user, password, imap_server):# 这里的服务器根据需要选择server = imaplib.IMAP4_SSL(imap_server)# 登录imap,使用纯文本密码标识客户。 password 将被转码server.login(email_user, password)# 选择邮箱文件夹,没有则创建,此段用来测试,可忽略""" destmailbox = 'CaiZiXi'rsp, msgs = server.select(destmailbox)print(rsp)if (rsp == 'NO'):server.create(destmailbox)print('IMAP: create mail box ' + destmailbox) """# 邮箱中的文件夹,默认为'INBOX'(收件箱),不需要改rsp, inbox = server.select("INBOX")# 搜索匹配的邮件,第一个参数是字符集,None默认就是ASCII编码,第二个参数是查询条件# 这里的ALL就是查找全部,UNSEEN 为标识未读 SEEN 为已读# 生成环境用的是未读UNSEEN,读取完毕设置该邮件为已读,这样下次读取不会重复读取type, data = server.search(None, "ALL")# 邮件列表,使用空格分割得到邮件索引msgList = data[0].split()# 附件文件名称,根据实际需要设置attachment_files = []#遍历所有邮件for i in range(0, len(msgList)):# 改变邮箱中消息的旗标处理,设置为已读,可放在下载完附近或读取内容使用#server.store(msgList[i], '+FLAGS', '\\SEEN')# server.copy(msgList[i], "CSDN") 测试copy邮件用type, datas = server.fetch(msgList[i], '(RFC822)')# 使用utf-8 解码text = datas[0][1].decode('utf8')# 转化为email.message对象msg = email.message_from_string(text)From = parseaddr(msg.get('from'))[1]  # 发件人To = parseaddr(msg.get('To'))[1]  # 收件人Cc = parseaddr(msg.get_all('Cc'))[1]  # 抄送人Subject = decode_str(parseaddr(msg.get('Subject'))[1])  # 主题# 获取邮件时间,格式化收件时间date1 = time.strptime(msg.get("Date")[0:24], '%a, %d %b %Y %H:%M:%S')# 邮件时间格式转换date2 = time.strftime("%Y-%m-%d", date1)print(f'发件人:{From};收件人:{To};抄送人:{Cc};主题:{Subject};收件日期:{date1}')#这里接收附件和正文内容for part in msg.walk():file_name = part.get_filename()if file_name:file_name = decode_str(file_name)data = part.get_payload(decode=True)#保存附件文件att_file = open(os.path.join(save_path, file_name), 'wb')attachment_files.append(file_name)att_file.write(data)att_file.close()print(f"附件 {file_name} 下载完成")elif not part.is_multipart():#打印会有两个内容,一个纯文本,一个html文本print(part.get_payload(decode=True).decode('utf-8'))"""字符编码转换"""
def decode_str(s):value, charset = decode_header(s)[0]if charset:value = value.decode(charset)return valueif __name__ == '__main__':print("start")email_process(email_user, password, imap_server)print("end")

建议对着官方网站来理解 https://docs.python.org/zh-cn/3.7/library/imaplib.html?highlight=imaplib#imap4-example
里面有最简单的示例

2.pop3简单示例

代码如下(示例):

# 导入库——qq邮箱测试,其他邮箱略有差异
import poplib
import email
import datetime
import time
import traceback
import sys
import telnetlib
import zipfile
import os
import shutil
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr# 输入邮件地址, 口令和POP3服务器地址:
email_user = ''# 此处密码是授权码,用于登录第三方邮件客户端
password = ''pop3_server = 'pop.qq.com'# 授权码登录邮箱
def email_login(email_user, password, pop3_server):# 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSLtelnetlib.Telnet('pop.qq.com', 995)server = poplib.POP3_SSL(pop3_server, 995, timeout=50)# server=poplib.POP3(pop3_server,110,timeout=10)# 可以打开或关闭调试信息#server.set_debuglevel(1)# 身份认证:server.user(email_user)server.pass_(password)# 返回邮件数量和占用空间:print('Messages: %s. Size: %s' % server.stat())# list()返回所有邮件的编号:resp, mails, octets = server.list()return mails, serverdef decode_str(str_in):"""字符编码转换"""value, charset = decode_header(str_in)[0]if charset:value = value.decode(charset)return valuedef save_att_file(msg, save_path):"""附件下载函数"""for part in msg.walk():file_name = part.get_filename()# contentType = part.get_content_type()attachment_files =[]if file_name:file_name = decode_str(file_name)data =  part.get_payload(decode=True)# print("emailcontent:\r\n"+data.decode('unicode_escape'))att_file = open(os.path.join(save_path,file_name), 'wb')attachment_files.append(file_name)att_file.write(data)att_file.close()print(f"附件 {file_name} 下载完成")def main(inday):# 遍历所有邮件for i in range(4,len(mails)+1):resp,lines,octets = server.retr(i)msg_content=b'\r\n'.join(lines).decode('unicode_escape')# 解析邮件:msg = Parser().parsestr(msg_content)#print(msg)From = parseaddr(msg.get('from'))[1]#发件人To = parseaddr(msg.get('To'))[1]#收件人Cc = parseaddr(msg.get_all('Cc'))[1]#抄送人Subject = decode_str(parseaddr(msg.get('Subject'))[1])#主题# 获取邮件时间,格式化收件时间date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S')# 邮件时间格式转换date2 = time.strftime("%Y-%m-%d %H:%M:%S",date1)""" if date2 <= "2022-09-18":continueprint(Subject)print(date2)break """print(f'发件人:{From};收件人:{To};抄送人:{Cc};主题:{Subject};收件日期:{date2}')# 主题和日期验证所需邮件if ("iam" in Subject)&(date2 == inday):save_att_file(msg, save_path)# 今天日期
today = datetime.date.today()
inday = today.strftime('%Y-%m-%d')# 昨天日期
yesterday = (today - datetime.timedelta(days=1)).strftime('%Y-%m-%d')#当前目录
save_path = os.getcwd()# 登录获取邮件列表
mails,server = email_login(email_user,password,pop3_server)# 下载主程序
main(inday)

总结

日常工作中用到的PHP居多,python少用,有啥不对的可以讨论

Python3 imap pop3、邮箱自动下载附件,分析邮件内容相关推荐

  1. Python3 发送QQ邮箱(含附件)

    Python3 发送QQ邮箱(含附件) 准备工作: 1.用到的python包:smtplib和email 2.获取qq邮箱授权码:在qq邮箱的设置里面的账户下面,开启POP3/SMTP服务和IMAP/ ...

  2. python3通过qq邮箱发送邮件以及附件

    本文实例为大家分享了python3通过qq邮箱发送邮件以及附件的具体代码,供大家参考,具体内容如下 开启qq邮箱的smtp服务 代码: 在学习过程中有什么不懂得可以加我的 python学习qun,85 ...

  3. python3爬虫系列21之selenium自动化登录163邮箱并读取未读邮件内容

    python3爬虫系列21之selenium自动化登录163邮箱并读取未读邮件内容 1.前言 前面在 python3爬虫系列20之反爬需要登录的网站三种处理方式中介绍的第三种方法,使用自动化测试工具s ...

  4. Python自动从邮箱批量下载附件未读信息并按发件人名分类存放

    最近接到学生会的工作:收集报名表,作为一个总想着偷懒摸鱼的我,当然是想用代码来自动化解决问题啦,最近正好在学python,便试着用python写个程序从邮箱下载附件并自动分类储存,下面便是源代码了.注 ...

  5. Python3.x+迅雷x 自动下载高分电影,嘿嘿!你懂的

    话说以前玩Python的时候爬过挺多网站的,都是在公司干的(Python不属于公司的业务范围,纯属自己折腾着好玩), 我那个负责运维的同事天天跑过来说:你又在爬啥啊,你去看看新闻,某某爬东西又被抓了! ...

  6. 央行公开市场操作(正逆回购、MLF)数据自动下载及分析

    在做外汇掉期交易的时候,除了需要关注中美息差的走势,也需要了解市场流动性的松紧程度.央行的公开市场操作是市场流动性拼图里面非常重要的一块.实际工作中,有些资讯系统(例如Bloomberg)可以调出央行 ...

  7. Java+Selenium实现QQ邮箱自动登录、发邮件与退出

    初学selenium,用最近所学知识写了QQ邮箱自动登录.发送邮件.退出,算是对自己学习的知识的巩固吧.如果哪里有不足之处,就请各位告诉我,指导我一下,非常感谢. 登录页面 在网页登录QQ邮箱的时候, ...

  8. python自动定时读取outlook邮件内容

    第一次实习,什么也不会,公司让写一个自动定时读取邮件的代码,只好自己去网上搜,踩了很多坑,现在终于弄好了,在这里记录一下,也希望能给需要的人一点帮助. 首先就是登陆邮箱并读取邮件,outlook的话一 ...

  9. ESP8266/ESP32自动下载电路分析

    要让ESP8266/ESP32进入下载模式,需要在上电时拉低GPIO0,下载完成后又需要拉高GPIO0然后重新上电来正常运行. 一般在GPIO0上设置个按键来实现,但是每次都需要手动操作比较麻烦,其实 ...

最新文章

  1. android获取元素路径,Appium元素定位(name、classname、相对路径、绝对路径\、list)...
  2. 基于运放AD8606的信号缓冲小板
  3. 403错误代码导致网站样式全部乱了
  4. 装修行业难互联网化?利润不合理并非本质,体制才是
  5. AZURE 日志分析自动告警
  6. 常用的Java快捷键有哪些
  7. Read the Docs 文档管理
  8. Linux学习总结(四十四)lnmp之php-fpm相关配置
  9. spring security系列一:架构概述
  10. [转]使用Microsoft Web Application Stress Tool对web进行压力测试
  11. 数据库SQL语句之外键
  12. JAVAME 还有钱途么?
  13. 代购集运系统平台一键上传淘宝商品至韩国coupang经验分享
  14. Android开发Tips(5)
  15. sql 查询-从浆糊到清晰的过程
  16. 华为od业务主管面试问题-我的回答
  17. 高斯投影正反算C语言程序代码,一个老师给的高斯投影正反算c++源码.doc
  18. 【表单设计】优秀表单设计案例
  19. windows系统中nginx图片服务器,windows nginx 图片服务器
  20. 数字藏品APP系统开发|数字藏品系统

热门文章

  1. rhce考试试题以及答案_RHCE认证考试模拟题及答案.docx
  2. 《面向基于人工智能的学习健康系统,使用心电图进行人群水平的死亡率预测》阅读笔记
  3. 热璞数据库HotDB开放下载先知————安装部署(二)
  4. 如何 DIY 一个自己的 NAS
  5. 解耦表征与分类器:DECOUPLING REPRESENTATION AND CLASSIFIER FOR LONG-TAILED RECOGNITION(ICLR2020)
  6. Window系统打包QT程序
  7. python中的for循环和while循环
  8. 参考任哲的《嵌入式实时操作系统μC_OS-II原理及应用》,对UCOS的任务调度做了下整理。
  9. matlab课程设计大学物理,MATLAB版大学物理
  10. Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)