在 Python 中监测并接收邮件通常使用 imaplib
库,它实现了 IMAP4rev1 协议(Internet Message Access Protocol version 4 revision 1)。以下是使用 imaplib
监测并接收邮件的一般步骤:
imaplib
连接到你的邮箱的 IMAP 服务器。UID SEARCH
或 SEARCH
)查找符合条件的邮件。UID FETCH
或 FETCH
命令获取邮件内容。email
库解析邮件内容,提取主题、发件人、正文、附件等信息。代码示例:
以下是一个简单的示例代码,演示如何连接到 Gmail 的 IMAP 服务器,搜索未读邮件,并打印邮件的主题和发件人:
import imaplib
import email
from email.header import decode_header
def check_email(username, password, imap_server="imap.gmail.com"):
"""
监测并接收邮件
Args:
username: 邮箱用户名
password: 邮箱密码 (或授权码)
imap_server: IMAP 服务器地址 (默认为 Gmail)
"""
# 1. 连接到 IMAP 服务器
try:
mail = imaplib.IMAP4_SSL(imap_server)
except Exception as e:
print(f"连接到 IMAP 服务器失败: {e}")
return
# 2. 登录邮箱账户
try:
mail.login(username, password)
except Exception as e:
print(f"登录失败: {e}")
mail.close()
return
# 3. 选择邮箱文件夹 (例如:收件箱)
mail.select("inbox")
# 4. 搜索未读邮件 (可以根据需要修改搜索条件)
status, data = mail.search(None, "UNSEEN") # 搜索未读邮件
if status != "OK":
print("搜索邮件失败")
mail.close()
mail.logout()
return
mail_ids = data[0].split()
# 5. 获取并解析邮件
for mail_id in mail_ids:
status, data = mail.fetch(mail_id, "(RFC822)")
if status != "OK":
print(f"获取邮件 {mail_id} 失败")
continue
raw_email = data[0][1]
msg = email.message_from_bytes(raw_email)
# 6. 解析邮件内容
# 解码邮件主题
subject, encoding = decode_header(msg["Subject"])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding or "utf-8")
# 获取发件人
from_ = msg.get("From")
print(f"主题: {subject}")
print(f"发件人: {from_}")
# 7. 处理邮件 (例如:下载附件、标记已读等)
# 这里可以添加你自己的邮件处理逻辑
# 示例:将邮件标记为已读
# mail.store(mail_id, "+FLAGS", "\\Seen")
# 8. 关闭连接
mail.close()
mail.logout()
# 使用示例
username = "[email protected]" # 替换为你的邮箱
password = "your_password" # 替换为你的邮箱密码或授权码
check_email(username, password)
使用说明和注意事项:
[email protected]
和 your_password
替换为你的邮箱地址和密码(或授权码)。UNSEEN
搜索未读邮件。你可以根据需要修改搜索条件,例如:
"ALL"
:所有邮件"SEEN"
:已读邮件"ANSWERED"
:已回复邮件"FROM [email protected]"
:来自特定发件人的邮件"SUBJECT '邮件主题'"
:包含特定主题的邮件"SINCE 01-Jan-2023"
:指定日期之后的邮件"UNSEEN FROM [email protected]"
time.sleep()
)定期执行检查。更高级的方法可以使用 IMAP 的 IDLE
命令,它可以让服务器在新邮件到达时通知客户端,而无需客户端不断轮询。进阶:下载附件
如果你需要下载附件,可以在解析邮件内容后添加如下代码:
# ... (解析邮件主题和发件人的代码) ...
# 下载附件
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
if filename:
filepath = os.path.join('./attachments', filename) # 将附件保存在当前目录的 attachments 文件夹下
os.makedirs(os.path.dirname(filepath), exist_ok=True) # 如果文件夹不存在,创建文件夹
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f"附件已保存: {filepath}")
# ... (处理邮件的代码) ...
这段代码会遍历邮件的每个部分,找到 Content-Disposition
不为空的部分(通常是附件),并将其保存到本地的 attachments
文件夹中。
如果是163邮箱呢
使用网易163邮箱检测收件,你需要使用 imaplib
库连接到163邮箱的 IMAP 服务器。以下是针对163邮箱修改后的代码示例,以及详细的配置说明:
import imaplib
import email
from email.header import decode_header
import os
def check_163_email(username, password):
"""
使用 IMAP 检测并接收网易163邮箱的邮件
Args:
username: 163邮箱用户名 (例如:[email protected])
password: 163邮箱密码 (或授权码)
"""
# 1. 连接到 IMAP 服务器
imap_server = "imap.163.com"
imap_port = 993 # 使用 SSL 加密端口
try:
mail = imaplib.IMAP4_SSL(imap_server, imap_port)
except Exception as e:
print(f"连接到 IMAP 服务器失败: {e}")
return
# 2. 登录邮箱账户
try:
mail.login(username, password)
except Exception as e:
print(f"登录失败: {e}")
mail.close()
return
# 3. 选择邮箱文件夹 (收件箱)
mail.select("inbox")
# 4. 搜索未读邮件
status, data = mail.search(None, "UNSEEN")
if status != "OK":
print("搜索邮件失败")
mail.close()
mail.logout()
return
mail_ids = data[0].split()
# 5. 获取并解析邮件
for mail_id in mail_ids:
status, data = mail.fetch(mail_id, "(RFC822)")
if status != "OK":
print(f"获取邮件 {mail_id} 失败")
continue
raw_email = data[0][1]
msg = email.message_from_bytes(raw_email)
# 6. 解析邮件内容
subject, encoding = decode_header(msg["Subject"])[0]
if isinstance(subject, bytes):
subject = subject.decode(encoding or "utf-8")
from_ = msg.get("From")
print(f"主题: {subject}")
print(f"发件人: {from_}")
# 7. 下载附件
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename = part.get_filename()
if filename:
# 对文件名进行解码
filename, encoding = decode_header(filename)[0]
if isinstance(filename, bytes):
filename = filename.decode(encoding or "utf-8")
filepath = os.path.join('./attachments', filename)
os.makedirs(os.path.dirname(filepath), exist_ok=True)
with open(filepath, 'wb') as f:
f.write(part.get_payload(decode=True))
print(f"附件已保存: {filepath}")
# 8. 处理邮件 (例如:标记已读)
# mail.store(mail_id, "+FLAGS", "\\Seen")
# 9. 关闭连接
mail.close()
mail.logout()
# 使用示例
username = "[email protected]" # 替换为你的163邮箱用户名
password = "your_password_or_auth_code" # 替换为你的163邮箱密码或授权码
check_163_email(username, password)
配置说明:
imap_server
和 imap_port
:
imap_server
: 设置为 "imap.163.com"
,这是网易163邮箱的 IMAP 服务器地址。imap_port
: 设置为 993
,这是 IMAP 使用 SSL 加密连接的标准端口。username
: 你的163邮箱的完整地址,例如 [email protected]
。
password
:
附件下载: 代码中添加了解码附件文件名的部分,以处理中文文件名乱码问题。
重要提示:
常见问题排查:
按照以上步骤和说明配置代码,你应该能够成功使用 Python 检测并接收你的163邮箱的邮件。记住,使用授权码登录更安全,并且根据你的实际需求修改代码中的邮件处理逻辑。