You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否直接向Python脚本发送邮件并提取内容展示?技术可行性咨询

可以让Python脚本直接接收邮件并提取指定内容吗?

当然可行,Python有多种工具能帮你实现这个需求——核心是让脚本连接到你的邮件服务器(通过IMAP或POP3协议),拉取邮件后解析内容、提取你需要的信息。下面是两种常用的实现方案:

方案1:用Python内置的imaplib(推荐)

imaplib是Python标准库的一部分,支持IMAP协议(比POP3更灵活,能在服务器上保留邮件原状态)。步骤如下:

  1. 开启邮箱的IMAP服务:比如QQ/163/Gmail这类邮箱,需要在设置里手动开启IMAP,并获取授权码(代替登录密码使用,避免泄露账号密码)。
  2. 连接服务器并拉取邮件:用imaplib建立SSL连接,登录后选择收件箱,搜索目标邮件(可按未读、主题、发件人筛选)。
  3. 解析邮件内容:配合email模块解析邮件的主题、发件人、正文,再提取指定内容(比如用正则匹配关键词)。

示例代码:

import imaplib
import email
from email.header import decode_header
import re

# 替换成你的邮箱信息
EMAIL = "your_email@example.com"
AUTH_CODE = "your_email_auth_code"  # 邮箱授权码
IMAP_SERVER = "imap.example.com"  # 对应邮箱的IMAP服务器,比如QQ是imap.qq.com

# 建立SSL连接
imap_conn = imaplib.IMAP4_SSL(IMAP_SERVER)
imap_conn.login(EMAIL, AUTH_CODE)

# 选择收件箱
imap_conn.select("INBOX")

# 搜索未读邮件(可修改搜索条件,比如'SUBJECT "测试邮件"'筛选主题包含指定内容的邮件)
status, mail_ids = imap_conn.search(None, "UNSEEN")
mail_id_list = mail_ids[0].split()

for mail_id in mail_id_list:
    # 获取邮件原始数据
    status, msg_data = imap_conn.fetch(mail_id, "(RFC822)")
    msg = email.message_from_bytes(msg_data[0][1])
    
    # 解析主题
    subject, encoding = decode_header(msg["Subject"])[0]
    if isinstance(subject, bytes):
        subject = subject.decode(encoding or "utf-8")
    
    # 解析发件人
    sender, encoding = decode_header(msg.get("From"))[0]
    if isinstance(sender, bytes):
        sender = sender.decode(encoding or "utf-8")
    
    print(f"\n===== 邮件主题: {subject} =====")
    print(f"发件人: {sender}")
    
    # 提取邮件正文
    email_body = ""
    if msg.is_multipart():
        # 处理多部分邮件(包含文本、附件等)
        for part in msg.walk():
            content_type = part.get_content_type()
            # 跳过附件和HTML内容(如果只需要纯文本)
            if "attachment" not in str(part.get("Content-Disposition")) and content_type == "text/plain":
                email_body = part.get_payload(decode=True).decode(part.get_content_charset() or "utf-8")
                break
    else:
        # 单部分邮件直接提取
        email_body = msg.get_payload(decode=True).decode(msg.get_content_charset() or "utf-8")
    
    print("邮件正文:\n", email_body)
    
    # 提取指定内容示例:比如提取正文里"订单编号: "后面的内容
    order_match = re.search(r"订单编号:\s*(.*)", email_body)
    if order_match:
        print(f"提取到的订单编号: {order_match.group(1)}")

# 关闭连接
imap_conn.close()
imap_conn.logout()

方案2:用第三方库pyzmail(更简洁)

pyzmail封装了邮件解析的细节,代码更简洁,适合快速开发。先安装库:

pip install pyzmail36

示例代码:

import imaplib
from pyzmail import PyzMessage
import re

EMAIL = "your_email@example.com"
AUTH_CODE = "your_email_auth_code"
IMAP_SERVER = "imap.example.com"

imap_conn = imaplib.IMAP4_SSL(IMAP_SERVER)
imap_conn.login(EMAIL, AUTH_CODE)
imap_conn.select("INBOX")

status, mail_ids = imap_conn.search(None, "UNSEEN")
mail_id_list = mail_ids[0].split()

for mail_id in mail_id_list:
    status, msg_data = imap_conn.fetch(mail_id, "(RFC822)")
    msg = PyzMessage.factory(msg_data[0][1])
    
    print(f"\n===== 邮件主题: {msg.get_subject()} =====")
    print(f"发件人: {msg.get_address('from')}")
    
    # 提取纯文本正文
    if msg.text_part:
        email_body = msg.text_part.get_payload().decode(msg.text_part.charset)
        print("邮件正文:\n", email_body)
        
        # 提取指定内容示例
        phone_match = re.search(r"联系电话:\s*(.*)", email_body)
        if phone_match:
            print(f"提取到的联系电话: {phone_match.group(1)}")

imap_conn.close()
imap_conn.logout()

注意事项

  • 务必使用邮箱授权码而非登录密码,主流邮箱都要求用授权码连接IMAP/POP3服务,避免账号安全风险。
  • 不同邮箱的IMAP服务器地址不同,比如:
    • QQ邮箱: imap.qq.com(端口993)
    • 163邮箱: imap.163.com(端口993)
    • Gmail: imap.gmail.com(端口993,需开启App Password或允许低安全应用访问)

内容的提问来源于stack exchange,提问作者2wen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:25:20