能否直接向Python脚本发送邮件并提取内容展示?技术可行性咨询
可以让Python脚本直接接收邮件并提取指定内容吗?
当然可行,Python有多种工具能帮你实现这个需求——核心是让脚本连接到你的邮件服务器(通过IMAP或POP3协议),拉取邮件后解析内容、提取你需要的信息。下面是两种常用的实现方案:
方案1:用Python内置的imaplib(推荐)
imaplib是Python标准库的一部分,支持IMAP协议(比POP3更灵活,能在服务器上保留邮件原状态)。步骤如下:
- 开启邮箱的IMAP服务:比如QQ/163/Gmail这类邮箱,需要在设置里手动开启IMAP,并获取授权码(代替登录密码使用,避免泄露账号密码)。
- 连接服务器并拉取邮件:用
imaplib建立SSL连接,登录后选择收件箱,搜索目标邮件(可按未读、主题、发件人筛选)。 - 解析邮件内容:配合
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或允许低安全应用访问)
- QQ邮箱:
内容的提问来源于stack exchange,提问作者2wen
相关产品推荐
相关产品推荐

