python中,要实现与邮箱连接,读取邮箱内容

一,流程点:

1,注册邮箱(QQ邮箱, 163邮箱等)

2,在邮箱后台,进行授权,(开启POP3/SMTP服务”并生成授权码,具体授权操作根据不同的邮箱操作不同)

3,通过授权码加入代码中连接邮箱获取邮件内容

操作前期需要:了解所需库,python中连接邮箱常用的库,实现代码操作:

  • zmail 库:是一个专门为处理电子邮件设计的Python库,它让收发邮件变得非常简单。
  • imaplib email  库 : imaplib 是Python的标准库,用于使用IMAP协议与邮件服务器通信。email 库则用于解析复杂的邮件内容。这种方式更底层,灵活性更高,但代码也更复杂。
特点
方法特点 zmail (推荐) imaplib (标准库)
易用性 高,API简洁直观 较低,需要处理IMAP协议细节和邮件解析
功能 基础邮件操作(收、发、解析) 更底层的操作,灵活性高
授权码 需要 需要
适用场景 快速开发,关注邮件内容本身 需要复杂邮件处理或自定义流程

二,具体步骤:

1,邮箱注册我就省略了,

具体邮箱的授权,根据邮箱的不同操作不同。

这里以QQ邮箱为例

2,首先访问  https://mail.qq.com/  qq邮箱官网进行登录

3,登录进入邮箱后在右上角个人头像中 找到"账号与安全"

4,在安全设置中找到POP3服务的开启

5,开启验证需要验证身份(qq绑定手机验证,等),完成验证便能开启服务

6,将开启后的授权码复制,记录下来

7,后续就是将以开启的服务的授权码,加入我们的邮箱读取代码中

实例1 :

⚙️ 使用 zmail 库

zmail实例代码

这里要提前安装zmail 库,  既:   pip install zmail

import zmail

# 1. 配置邮箱信息
server = zmail.server('your_email@example.com', 'your_authorization_code') # 替换为你的邮箱和授权码

# 2. 获取最新一封邮件
latest_mail = server.get_latest()

# 3. 打印邮件信息
if latest_mail:
    print("邮件主题:", latest_mail.get('Subject', '无主题'))
    print("发件人:", latest_mail.get('From', '未知发件人'))
    print("发送时间:", latest_mail.get('Date', '时间未知'))
    print("-" * 50)
    
    # 打印文本内容 (邮件内容可能在 'content_text' 或 'content_html' 中)
    text_content = latest_mail.get('content_text', [])
    if text_content:
        print("邮件正文:")
        for line in text_content:
            print(line)
    else:
        print("此邮件无纯文本正文,可能为HTML或附件。")
        
    # 检查附件
    if latest_mail.get('attachments'):
        print("\n此邮件包含附件。")
    else:
        print("\n此邮件无附件。")
else:
    print("未找到邮件或获取失败。")

zmail 常用方法

除了 get_latest(),zmail 还有其他有用的方法1

  • server.get_mail(邮件ID):获取指定ID的邮件。

  • server.get_mails(start_index, end_index):获取一个范围内的邮件,如 server.get_mails(1, 5) 获取前5封。

  • server.stat():返回邮箱的状态,包含邮件数量和总大小。

实例2:

⚙️ 使用 imaplib 和 email 库

imaplib 是Python的标准库,用于使用IMAP协议与邮件服务器通信。email 库则用于解析复杂的邮件内容。这种方式更底层,灵活性更高,但代码也更复杂。

import imaplib
import email
from email.header import decode_header
from email.parser import BytesParser

# 1. 连接并登录到IMAP服务器
imap_server = "imap.example.com"  # 请替换为你邮箱的IMAP服务器地址
port = 993
username = "your_email@example.com"
password = "your_authorization_code"  # 同样是授权码!

# 建立SSL加密连接
mail = imaplib.IMAP4_SSL(imap_server, port)
mail.login(username, password)

# 2. 选择邮箱文件夹(默认为收件箱 'INBOX')
mail.select("INBOX")

# 3. 搜索所有邮件并按时间倒序排列(获取最新的一封)
# 注意:IMAP的搜索返回的是邮件ID列表,这些ID是字符串类型。
status, messages = mail.search(None, "ALL")
if status != 'OK':
    print("搜索邮件失败")
    exit(1)

# 将获取到的邮件ID列表转换为数组,并取最后一个(最新的)
email_ids = messages[0].split()
if not email_ids:
    print("收件箱为空")
    exit(1)
latest_email_id = email_ids[-1]  # 取最后一个,即最新的邮件ID

# 4. 获取邮件数据 (RFC822协议表示获取整封邮件)
status, msg_data = mail.fetch(latest_email_id, "(RFC822)")
if status != 'OK':
    print(f"获取邮件ID {latest_email_id} 失败")
    exit(1)

# 5. 解析邮件原始数据
# msg_data 是一个包含元组的列表,其中索引为1的元素包含了邮件内容字节流
raw_email = msg_data[0][1]
msg = email.message_from_bytes(raw_email)

# 6. 提取邮件信息
subject, encoding = decode_header(msg["Subject"])[0]
if isinstance(subject, bytes) and encoding:
    subject = subject.decode(encoding)
elif isinstance(subject, bytes):
    subject = subject.decode('utf-8', errors='ignore') # 尝试UTF-8解码

from_ = msg.get("From")
date_ = msg.get("Date")

print(f"主题: {subject}")
print(f"发件人: {from_}")
print(f"日期: {date_}")
print("-" * 50)

# 7. 提取邮件正文
def get_email_body(message):
    """递归遍历邮件parts,提取纯文本正文"""
    if message.is_multipart():
        for part in message.walk():
            content_type = part.get_content_type()
            content_disposition = str(part.get("Content-Disposition"))
            # 跳过附件
            if "attachment" not in content_disposition:
                # 寻找text/plain部分
                if content_type == "text/plain":
                    payload = part.get_payload(decode=True)
                    charset = part.get_content_charset('utf-8') # 默认使用utf-8
                    if payload:
                        return payload.decode(charset, errors='ignore')
    else:
        # 如果不是multipart,直接解码
        payload = message.get_payload(decode=True)
        charset = message.get_content_charset('utf-8')
        if payload:
            return payload.decode(charset, errors='ignore')
    return "无法解析正文内容"

email_body = get_email_body(msg)
print("邮件正文:")
print(email_body)

# 8. 关闭连接
mail.close()
mail.logout()

使用代码读取邮箱最新邮件内容

本文介绍了如何使用Python代码连接邮箱并读取最新邮件内容。我们将重点介绍两种主流方法:便捷的第三方库zmail和更底层的标准库imaplib+email组合。

方法对比

特性 zmail (推荐) imaplib + email
易用性 高,API简洁直观 较低,需要处理协议细节
开发效率 快速上手,代码量少 需要更多代码和处理逻辑
功能控制 基础邮件操作 更底层的灵活控制
学习曲线 平缓 相对陡峭
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐