news 2026/9/8 21:42:29

python 收发信的功能。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python 收发信的功能。

邮箱客户端实现 该Python代码实现了一个2925.com邮箱客户端类,主要功能包括: 发送邮件: 支持纯文本和HTML格式邮件 使用SMTP_SSL协议通过465端口发送 包含发件人、收件人和主题设置 接收邮件: 通过IMAP4_SSL协议从993端口获取 提供两种获取方式:UID命令(更可靠)和序号获取(备用) 解析邮件主题、发件人、日期和正文内容 支持限制获取邮件数量 其他特性: 邮件正文预览功能(截取前200字符) 完善的错误处理和日志输出 支持中文字符解码 该客户端类封装了完整的

importsmtplibimportimaplibimportemailfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartfromemail.headerimportdecode_headerimportosclassEmailClient2925:def__init__(self,email_address,password):""" 初始化2925.com邮箱客户端 参数: email_address: 邮箱地址 password: 邮箱密码 """self.email_address=email_address self.password=password# 2925.com服务器配置self.smtp_server="smtp.2925.com"self.smtp_port=465# SSL端口 465self.imap_server="imap.2925.com"self.imap_port=993defsend_email(self,to_email,subject,body,is_html=False):""" 发送邮件 参数: to_email: 收件人邮箱 subject: 邮件主题 body: 邮件正文 is_html: 是否为HTML格式 """try:# 创建邮件msg=MIMEMultipart()msg['From']=self.email_address msg['To']=to_email msg['Subject']=subject# 添加邮件正文ifis_html:msg.attach(MIMEText(body,'html'))else:msg.attach(MIMEText(body,'plain'))# 连接SMTP服务器并发送print(f"正在连接到SMTP服务器:{self.smtp_server}:{self.smtp_port}")# 使用SSL连接server=smtplib.SMTP_SSL(self.smtp_server,self.smtp_port)server.login(self.email_address,self.password)server.send_message(msg)server.quit()print(f"邮件发送成功!收件人:{to_email}")returnTrueexceptExceptionase:print(f"发送邮件失败:{str(e)}")returnFalsedefreceive_emails(self,limit=10):""" 接收邮件 - 改进版本,使用UID命令避免SEARCH命令问题 参数: limit: 最多获取的邮件数量 """emails=[]try:print(f"正在连接到IMAP服务器:{self.imap_server}:{self.imap_port}")# 连接到IMAP服务器mail=imaplib.IMAP4_SSL(self.imap_server,self.imap_port)mail.login(self.email_address,self.password)# 选择收件箱status,select_info=mail.select('INBOX')ifstatus!='OK':print(f"选择收件箱失败:{select_info}")return[]# 获取邮件总数total_msgs=int(select_info[0].decode())print(f"收件箱中共有{total_msgs}封邮件")iftotal_msgs==0:print("收件箱为空")mail.logout()return[]# 方法1: 使用UID命令获取邮件(更可靠)print("尝试使用UID命令获取邮件...")# 先获取所有邮件的UIDstatus,uid_data=mail.uid('SEARCH',None,'ALL')ifstatus!='OK'ornotuid_data[0]:print("UID SEARCH失败,尝试方法2...")# 方法2: 直接按序号获取邮件returnself._receive_by_sequence(mail,total_msgs,limit)# 获取UID列表uids=uid_data[0].split()print(f"找到{len(uids)}封邮件的UID")# 反转列表,获取最新的邮件uids=uids[::-1]# 限制获取数量uids=uids[:limit]fori,uidinenumerate(uids):try:# 使用UID获取邮件status,msg_data=mail.uid('FETCH',uid,'(RFC822)')ifstatus=='OK'andmsg_data[0]isnotNone:# 解析邮件ifisinstance(msg_data[0],tuple):raw_email=msg_data[0][1]else:raw_email=msg_data[0]msg=email.message_from_bytes(raw_email)# 解码主题subject="无主题"ifmsg["Subject"]:subject_info=decode_header(msg["Subject"])[0]subject_text=subject_info[0]encoding=subject_info[1]ifisinstance(subject_text,bytes):subject=subject_text.decode(encodingifencodingelse'utf-8',errors='ignore')else:subject=str(subject_text)# 获取发件人from_=msg.get("From","未知发件人")# 获取日期date_=msg.get("Date","未知日期")# 获取邮件正文body=self._extract_email_body(msg)emails.append({'id':i+1,'uid':uid.decode(),'subject':subject,'from':from_,'date':date_,'body':body,'body_preview':body[:200]+"..."iflen(body)>200elsebody})print(f"邮件{i+1}:")print(f" UID:{uid.decode()}")print(f" 主题:{subject}")print(f" 发件人:{from_}")print(f" 日期:{date_}")print(f" 预览:{body[:100]}...")print("-"*50)else:print(f"获取邮件UID{uid}失败")exceptExceptionase:print(f"处理邮件UID{uid}时出错:{str(e)}")continue# 关闭连接mail.close()mail.logout()exceptimaplib.IMAP4.errorase:print(f"IMAP协议错误:{str(e)}")# 如果UID命令也失败,尝试最基本的FETCH方法returnself._try_basic_fetch()exceptExceptionase:print(f"接收邮件失败:{str(e)}")returnemailsdef_receive_by_sequence(self,mail,total_msgs,limit):"""方法2: 按序号直接获取邮件"""emails=[]# 计算起始和结束位置start=max(1,total_msgs-limit+1)forseq_numinrange(total_msgs,start-1,-1):try:status,msg_data=mail.fetch(str(seq_num).encode(),'(RFC822)')ifstatus=='OK'andmsg_data[0]isnotNone:ifisinstance(msg_data[0],tuple):raw_email=msg_data[0][1]else:raw_email=msg_data[0]msg=email.message_from_bytes(raw_email)# 解码主题subject="无主题"ifmsg["Subject"]:subject_info=decode_header(msg["Subject"])[0]subject_text=subject_info[0]encoding=subject_info[1]ifisinstance(subject_text,bytes):subject=subject_text.decode(encodingifencodingelse'utf-8',errors='ignore')else:subject=str(subject_text)# 获取邮件正文body=self._extract_email_body(msg)emails.append({'id':total_msgs-seq_num+1,'seq':seq_num,'subject':subject,'from':msg.get("From","未知发件人"),'date':msg.get("Date","未知日期"),'body_preview':body[:200]+"..."iflen(body)>200elsebody})print(f"邮件{total_msgs-seq_num+1}(序号:{seq_num}):{subject}")exceptExceptionase:print(f"处理邮件序号{seq_num}时出错:{str(e)}")continuemail.logout()returnemailsdef_extract_email_body(self,msg):"""提取邮件正文内容"""body=""ifmsg.is_multipart():forpartinmsg.walk():content_type=part.get_content_type()content_disposition=str(part.get("Content-Disposition"))# 跳过附件if"attachment"incontent_disposition:continueifcontent_typein["text/plain","text/html"]:try:body_bytes=part.get_payload(decode=True)ifbody_bytes:charset=part.get_content_charset()or'utf-8'try:body=body_bytes.decode(charset,errors='ignore')except:body=body_bytes.decode('utf-8',errors='ignore')else:body=part.get_payload()except:body=part.get_payload()# 优先使用纯文本正文ifcontent_type=="text/plain"andbody.strip():breakelse:try:body_bytes=msg.get_payload(decode=True)ifbody_bytes:charset=msg.get_content_charset()or'utf-8'try:body=body_bytes.decode(charset,errors='ignore')except:body=body_bytes.decode('utf-8',errors='ignore')else:body=msg.get_payload()except:body=msg.get_payload()returnbodydef_try_basic_fetch(self):"""方法3: 尝试最基本的连接和获取"""try:print("尝试最基本的邮件获取方法...")mail=imaplib.IMAP4_SSL(self.imap_server,self.imap_port)mail.login(self.email_address,self.password)# 直接尝试获取第一封邮件mail.select('INBOX')status,msg_data=mail.fetch('1','(RFC822)')ifstatus=='OK':print("成功获取到第一封邮件!")# 这里可以添加解析代码else:print("连最基本的FETCH也失败了")mail.logout()exceptExceptionase:print(f"基本方法也失败:{str(e)}")return[]defcheck_connection(self):"""测试服务器连接"""print("正在测试SMTP连接...")try:server=smtplib.SMTP_SSL(self.smtp_server,self.smtp_port)server.login(self.email_address,self.password)server.quit()print("SMTP连接成功!")exceptExceptionase:print(f"SMTP连接失败:{str(e)}")print("\n正在测试IMAP连接...")try:mail=imaplib.IMAP4_SSL(self.imap_server,self.imap_port)mail.login(self.email_address,self.password)# 测试是否能选择收件箱status,info=mail.select('INBOX')ifstatus=='OK':print(f"IMAP连接成功!收件箱邮件数:{info[0].decode()}")else:print(f"IMAP登录成功,但选择收件箱失败:{info}")mail.logout()exceptExceptionase:print(f"IMAP连接失败:{str(e)}")deftestSend1():list_=["第一个","第二个","第三个","第四个",]print("\n发送测试邮件...")foriinrange(200):client.send_email(to_email="laocooon@qq.com",# 替换为实际收件人subject=list_[i%len(list_)]+",测试邮件",body="这是一封来自2925.com的测试邮件。")# 使用示例if__name__=="__main__":# 您的邮箱信息EMAIL_ADDRESS="xxxxxx"EMAIL_PASSWORD="xxxxx"# 创建邮箱客户端client=EmailClient2925(EMAIL_ADDRESS,EMAIL_PASSWORD)# 测试连接client.check_connection()# 发送邮件示例# testSend1()print("\n发送测试邮件...")client.send_email(to_email="xxxx@xxx.xx",# 替换为实际收件人subject="测试邮件",body="这是一封来自xxx.com的测试邮件。")# 接收邮件示例print("\n接收最新邮件...")emails=client.receive_emails(limit=10)ifemails:print(emails)print(f"共收到{len(emails)}封邮件")else:print("没有收到邮件")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 11:12:08

【大模型合规必修课】:Open-AutoGLM如何7步完成个人信息保护法适配

第一章:Open-AutoGLM个人信息保护法适配概述随着《个人信息保护法》(PIPL)的正式实施,AI模型在数据处理、用户隐私保护等方面面临更严格的合规要求。Open-AutoGLM作为开源的自动化生成语言模型系统,需全面适配PIPL相关…

作者头像 李华
网站建设 2026/9/8 0:35:04

【DEIM创新改进】全网独家创新、特征融合改进篇 | SCI 一区 2025 | 通道拼接融合已过时!用 DPCF 给 DEIM 目标检测SOTA模型 加了“放大镜”,助力目标检测有效涨点

一、本文介绍 🔥提升小目标检测精度?用 DPCF 重新定义 DEIM 的 通道拼接操作! 本文介绍将 DPCF 模块用于 DEIM 的 Neck特征融合改进,可以显著提升多尺度特征融合质量,尤其是在小目标、低对比度、红外等场景中,增强检测精度和鲁棒性,同时保持较低计算开销,是一种高效…

作者头像 李华
网站建设 2026/9/8 19:31:32

Open-AutoGLM环境搭建踩坑实录,99%新手都会遇到的致命错误

第一章:Open-AutoGLM环境搭建踩坑实录,99%新手都会遇到的致命错误在部署 Open-AutoGLM 时,许多开发者看似只是执行几条安装命令,实则暗藏多个极易被忽略的陷阱。最常见问题出现在 Python 环境版本不兼容与依赖包冲突上&#xff0c…

作者头像 李华
网站建设 2026/9/9 1:08:20

Open-AutoGLM高负载优化秘籍(仅限资深工程师掌握的3种缓存策略)

第一章:Open-AutoGLM 长时运行性能下降优化在长时间运行过程中,Open-AutoGLM 模型常出现推理延迟上升、内存占用持续增长以及吞吐量下降等问题。这些问题主要源于缓存累积、显存碎片化以及未及时释放的中间计算图节点。为保障系统稳定性与响应效率&#…

作者头像 李华
网站建设 2026/9/8 16:11:48

Langchain-Chatchat在法务合同模板查询中的精准定位

Langchain-Chatchat在法务合同模板查询中的精准定位 在大型企业法务部门,每天面对成百上千份合同模板——采购协议、劳动合同、保密条款、服务框架协议……尽管这些文档构成了业务合规的基石,但真正要用时却常常“翻箱倒柜”。更棘手的是,新入…

作者头像 李华
网站建设 2026/9/8 22:02:40

Open-AutoGLM隐私合规适配方案(PIPL全场景应对大揭秘)

第一章:Open-AutoGLM隐私合规适配方案概述在数据安全与隐私保护日益受到重视的背景下,Open-AutoGLM 项目引入了一套完整的隐私合规适配方案,旨在确保模型训练、推理及部署全流程符合 GDPR、CCPA 等国际主流隐私法规要求。该方案从数据采集、存…

作者头像 李华