使用IMAP服务获取163邮箱的未读邮件

使用IMAP服务获取163邮箱的未读邮件

整体的逻辑思路如下:

  1. 开启163邮箱的IMAP服务,拿到授权码用于登录IMAP服务
  2. 登录IMAP服务,获取邮箱的未读邮件列表
  3. 遍历未读邮件列表,获取邮件内容
# 导入必要的库
import os
import imaplib
import ssl
import email
from email.header import decode_header
from email.utils import parseaddr

1. 开启163邮箱的IMAP服务,拿到授权码用于登录IMAP服务

163邮箱设置IMAP服务,需要到邮箱设置页面,选择“邮箱设置”->“POP3/IMAP”->“开启IMAP服务”,然后点击“保存”,即可开启IMAP服务。

2. 登录IMAP服务,获取邮箱的未读邮件列表

# 创建一个默认的SSL上下文对象,用于服务器认证
# 参数设置为None,表示使用默认值,后续将通过代码明确指定SSL/TLS版本范围
ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=None, capath=None, cadata=None)
# 指定SSL/TLS的最小版本为TLS 1.2,以确保连接使用的协议不低于此版本
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2# 指定SSL/TLS的最大版本为TLS 1.3,以确保连接不会使用超出此版本的协议
# TLS 1.3是最新的TLS版本,提供了更强的安全性和加密方法
ssl_context.maximum_version = ssl.TLSVersion.TLSv1_3
def login163(user=None, pwd=None, host="imap.163.com" ):# 尝试建立SSL加密的IMAP连接并登录# 异常处理增强try:imap_client = imaplib.IMAP4_SSL(host, ssl_context=ssl_context)  # 确保使用TLS 1.2imap_client.login(user, pwd)except imaplib.IMAP4.error as e:print(f"登录失败: {e}")return# 发送ID命令给服务器,提供客户端信息imaplib.Commands["ID"] = ('AUTH',)args = ("name", user, "contact", user, "version", "1.0.0", "vendor", "myclient")imap_client._simple_command("ID", str(args).replace(",", "").replace("'", "\""))return imap_client

3. 遍历未读邮件列表,获取邮件内容

def fetch_and_mark_emails_as_read(imap_client,mailbox="INBOX"):"""从指定的邮箱中获取未读邮件,并将这些邮件标记为已读。:param imap_client: IMAP客户端对象,用于与邮件服务器交互:param mailbox: string, 指定的邮箱,默认为"INBOX"(收件箱)"""# 选择邮箱,默认为收件箱imap_client.select(mailbox)# 搜索未读邮件typ, dat = imap_client.search(None, "UNSEEN")# 解码邮件编号字符串str_numbers = dat[0].decode('utf-8')# 将编号字符串分割成列表numbers_str_list = str_numbers.split()# 遍历未读邮件for msg in numbers_str_list:try:# 获取邮件内容_, data = imap_client.fetch(msg, '(RFC822)')raw_email = data[0][1]email_message = email.message_from_bytes(raw_email)# 解码邮件主题subject = decode_email_header(email_message['Subject'])# 解码发件人信息from_info = decode_header(email_message['From'])name_parts = []for part, charset in from_info:if isinstance(part, bytes):if charset:decoded_part = part.decode(charset)else:decoded_part = part.decode('utf-8', errors='replace')else:decoded_part = partname_parts.append(decoded_part)full_name = ''.join(name_parts).strip() from_person,_=parseaddr(full_name)# 提取邮件正文all_text_body = extract_text_body(email_message)#------------------------------#你对得到的邮件的处理代码#------------------------------# 标记邮件为已读imap_client.store(msg, '+FLAGS', '\\Seen')except imaplib.IMAP4.error as e:print(f"处理邮件或标记已读失败: {e}")

邮件主题解码函数:

def decode_email_header(header):"""解码电子邮件头信息。电子邮件头信息可能包含多种编码,这个函数旨在解析头信息并返回解码后的字符串。如果头信息是ASCII码,则直接返回;如果是非ASCII码,会根据编码类型进行解码。参数:header (str): 需要解码的电子邮件头信息。返回:str: 解码后的字符串。如果解码过程中包含多种编码,会返回一个元组,包含解码后的字符串和对应的编码类型。"""# 解码头信息,返回一个包含解码结果和编码类型的元组# 列表decoded_header = decode_header(header)[0]# print(decoded_header)# 判断解码结果是否为元组,如果是,说明存在多种编码,需要进一步解码if isinstance(decoded_header, tuple):# 对元组中的字符串进行解码,并返回解码后的结果part, charset = decoded_headerif isinstance(part, bytes):  # 检查是否为字节串if charset:  # 如果有字符集,按指定字符集解码decoded_part = part.decode(charset)else:  # 没有指定字符集时尝试UTF-8解码,或选择其他策略decoded_part = part.decode('utf-8', errors='replace')else:  # 如果已经是字符串,直接使用decoded_part = partreturn decoded_partelse:# 如果解码结果不是元组,直接返回解码后的字符串return None

正文获取部分

def extract_text_body(email_message):"""从电子邮件消息中提取纯文本正文。参数:email_message: 一个电子邮件消息对象,可以是使用Python email库构建的或从文件中读取的。返回:一个字符串,包含电子邮件的纯文本正文。如果没有找到纯文本正文或邮件为空,则返回空字符串。"""# 初始化一个字符串,用于存储提取的文本正文all_text_body = ""# 遍历电子邮件的每一个部分for part in email_message.walk():# 获取当前部分的Content-Typectype = part.get_content_type()# 获取当前部分的Content-Dispositioncdispo = str(part.get('Content-Disposition'))# 检查当前部分是否为纯文本且不是附件if ctype == 'text/plain' and 'attachment' not in cdispo:# 获取当前部分的payload(实际内容),并解码body = part.get_payload(decode=True)# 获取当前部分的内容字符集charset = part.get_content_charset()# 将解码后的文本添加到存储所有文本正文的字符串中all_text_body += body.decode(charset, errors='replace')# 找到纯文本正文后立即终止循环,以提高效率break  # 如果找到文本部分,即停止搜索,提高效率# 返回收集到的所有文本正文return all_text_body

测试代码

def imap_mail_get(client):retry_limit = 3for i in range(retry_limit):try:if client is None:client = login163(username, password)#password为IMAP授权码# 对两个邮箱进行操作for mailbox in ["INBOX", "Sent"]:fetch_and_mark_emails_as_read(client, mailbox=mailbox)return client except Exception as e:pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三大工作流引擎技术Activiti、Flowable、Camunda选型指南

文章目录 前言1 流程引擎发展历程2 流程引擎主要概念BPM (Business Process Management)BPMN (Business Process Model and Notation)CMMN (Case Management Model and Notation)DMN (Decision Model and Notation)事件(Event)顺序流(Sequenc…

从静电到浪涌,全面防护:雷卯多电压等级电源保护设计方案汇总

在当今数字化、电气化日益加速的时代,电子设备和电力系统面临着前所未有的挑战,其中静电放电(ESD)、浪涌以及雷击等瞬态事件成为了威胁设备稳定性和寿命的关键因素。从精密的消费电子产品到工业级控制系统,从智能家居到新能源汽车&#xff0c…

区块链技术的核心要素:共识机制、加密技术与分布式账本

区块链听起来像个非常高大上的技术,其实它的核心原理并不难理解。今天我们要聊的就是区块链的三个核心要素:共识机制、加密技术和分布式账本。想象一下区块链是一个巨大的数字笔记本,我们要弄清楚大家如何共同写这个笔记本,又如何…

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二:说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多,重要的Exif信息:拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义,如果放到网上还是建议抹去这些信息。…

Bad owner or permissions on C:\\Users\\username/.ssh/config > 过程试图写入的管道不存在。

使用windows连接远程服务器出现Bad owner or permissions 错误 问题: 需要修复文件权限 SSH 配置文件应具有受限权限以防止未经授权的访问 确保只有用户对该.ssh/config文件具有读取权限 解决方案: 在windows下打开命令行,通过以下命令打开文…

C++编程(四)this指针 常函数 常对象 静态成员

文章目录 一、this指针(一)概念(二)显式使用this指针的场景1. 当形参和成员变量名一致时2. 返回对象自身的时候必须要使用this指针3. 在类中销毁一个对象 二、常函数和常对象(一)常函数1. 概念2. 语法格式 …

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征

import cv2# 加载图像 image cv2.imread(4.png)# 使用 Canny 边缘检测算法提取边缘特征 edges cv2.Canny(image, 100, 200)# 显示边缘特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代码解析: 导入 OpenCV 库: import cv2加…

【MFC】socket通信代码解析

目录 一、在MFC中使用Winsock进行socket编程 1.1 包含必要的头文件 1.2 初始化Winsock 1.3创建socket 1.4 绑定socket 1.5 监听连接(对于服务器) 1.6 建立连接(对于客户端) 1.7 发送和接收数据 1.8. 关闭socket 1.9 错误处理 1.10 MFC集成 二、MFC中Socke…

PT100(RTD)是什么?2线,3线,4线原理

RTDs - or Resistance Temperature Detectors- (电阻式温度探测器),是温度型传感器,包含一个电阻,这个阻值可以随温度的变化而变化。在工业的进程中和实验室里已经使用了很多年,以精确,可靠和稳定的特性。 2线制 2线制…

解决Ucharts在小程序上的层级过高问题

<qiun-wx-ucharts canvas2d"{{true}}" type"pie" opts"{{rectificationRateOpts}}" chartData"{{rectificationRateData}}" /> 开启2d渲染即可解决&#xff08;在小程序开发工具上看着层级还是高&#xff0c;但是在手机上是正常…

C语言| 数组元素的删除

同数组元素的插入差不多。 数组元素的插入&#xff0c;是先移动要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;长度1。 C语言| 数组的插入-CSDN博客 数组元素的删除&#xff0c;是先删除元素&#xff0c;再把后面的元素往前移动一位&#xff0c;而本程序…

深入理解Spring中的核心注解:@Controller、@Component、@Service、@Repository、@Configuration及其扩展

在现代Java开发中&#xff0c;Spring框架以其强大的依赖注入&#xff08;DI&#xff09;和面向切面编程&#xff08;AOP&#xff09;功能深受开发者喜爱。Spring提供了一系列注解来简化配置和管理Bean。本文将详细探讨Spring中的核心注解&#xff0c;包括Controller、Component…

【智能算法应用】麻雀搜索算法在物流配送中心选址的应用(无待选配送中心)

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 模型假设 待定物流配送中心的库存总能满足需求点的需求不考虑从工厂到待定物流配送中心的运输成本不考虑选定区域内待确定…

Vue 解决报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制台报了一个错误 , Uncaught SyntaxError: Unexpected identifier ‘Promise’&#xff0c;网上查到的方法是 缺少符号&#xff0c;语法写法错误&#xff0c;但这些都没有解决我的问题&am…

RTDETR更换优化器——Lion

RTDETR更换Lion优化器 论文&#xff1a;https://arxiv.org/abs/2302.06675 代码&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介&#xff1a; Lion优化器是一种基于梯度的优化算法&#xff0c;旨在提高梯度下降法在深度学习中的优化效果…

MyBatis~配置解析, 属性(properties)、设置(settings)

注意, 对应的名称一定要相同, 比如username就要对应username, 而且如果同时使用外部配置文件和property, 优先级是外部配置文件优先级更高 设置&#xff08;settings&#xff09; 这是 MyBatis 中极为重要的调整设置&#xff0c;它们会改变 MyBatis 的运行时行为。 下表描述了…

prompt:我是晚餐盲盒,只要你问出“今晚吃什么”我就将为你生成美妙的食物推荐。

使用方法&#xff1a;在ChatGP粘贴下面提示词模型&#xff0c;点击输出。然后再问“晚餐有什么好吃的&#xff1f;”&#xff0c;AI输出丰种食物供你选择。抽到什么吃什么&#xff0c;极大的解决选择困难的问题。 客户需要生成1000条俏皮灵动&#xff0c;趣味盎然&#xff0c;比…

基于机器学习的网页摘要生成算法的研究与实现

摘要&#xff1a;随着互联网的迅猛发展&#xff0c;网页信息量呈爆炸式增长&#xff0c;用户往往难以在海量信息中快速获取所需内容。因此&#xff0c;开发一种能够自动生成网页摘要的算法&#xff0c;对于提高信息检索效率具有重要意义。本文将对基于机器学习的网页摘要生成算…

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍插件pytest-order&#xff0c;用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支&#xff0c;但是pytest-ordering已经不再维护了&#xff0c;建议大家直接使用pytest-order。 官方文…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展&#xff0c;越来越多的企业开始寻求在国际市场上扩展业务&#xff0c;这一趋势被称为企业出海。然而&#xff0c;企业在海外扩张面临诸多隐患与安全挑战&#xff0c;其中因为地域的不同&#xff0c;在安全性方面与国内相比会变得薄弱&#xff0c;从而导致被黑…