大家好!在本篇博客中,我将向大家介绍如何使用Python编程语言登录到Outlook邮箱,并下载邮件附件以及保存邮件的正文内容。我们将使用imaplib库来实现这个功能。
一.安装python
首先,我们需要安装Python,如果你还没有安装,可以去Python官方网站下载并按照指南进行安装。
二.填写你的Outlook邮箱账号和密码
接下来,你需要填写你的Outlook邮箱账号和密码,将它们分别赋值给username和password变量。
三.连接到邮件服务器
(这里以outlook邮箱为例)
然后,我们使用imaplib.IMAP4_SSL()方法连接到Outlook的邮件服务器。接着,我们使用mail.login()登录到你的邮箱账号。
四.搜索邮件并解析为message对象
我们可以选择要处理的邮箱文件夹,这里我们选择了收件箱,使用mail.select("INBOX")来选择。
接下来,我们使用mail.search()方法搜索邮件,并将结果存储在`email_ids`变量中。
然后,我们使用循环遍历每封邮件。对于每封邮件,我们使用mail.fetch()方法获取邮件内容,并将原始邮件数据解析为Message对象。
我们使用代码中的解析方法获取邮件的主题、发件人和日期,并将它们打印出来。
五.寻找附件并将附件内容保存到本地
我们使用msg.walk()方法遍历邮件的每个部分,如果部分的主要内容类型不是multipart并且具有"Content-Disposition",则表示该部分是一个附件。我们提取附件的文件名,并使用os.path.join()构建附件的保存路径。然后,我们使用二进制写入模式打开文件,并将附件内容写入文件中。
六.解码邮件正文内容并保存到本地
在保存附件后,我们检查邮件是否是多部分的,如果是,我们使用`msg.get_payload()`方法遍历每个部分并找到类型为"text/plain"的部分。然后,我们解码邮件正文内容,并将其保存到一个以邮件主题命名的txt文件中。
最后,我们关闭与邮件服务器的连接。
我这里的代码中假设存在两个文件夹:"attachments"和"text_files",用于保存附件和邮件正文的txt文件。如果这些文件夹不存在,代码会先创建它们。
大家可以根据需要进行修改,比如更改文件夹的名称或保存路径,以适应自己的实际情况。
下面是详细代码:
import email.header
import imaplib
import email
import os
import re
# 邮箱登录凭据
username = "这里填写你自己的邮箱账号"
password = "这里换成你自己的密码"
# 连接到邮件服务器
mail = imaplib.IMAP4_SSL("outlook.office365.com")#去查询自己邮箱的服务器
mail.login(username, password) # 登录邮箱
# 选择邮箱文件夹
mail.select("INBOX")
# 搜索邮件
status, data = mail.search(None, "ALL")
email_ids = data[0].split()
# 遍历每封邮件
for email_id in email_ids:
# 获取邮件内容
status, data = mail.fetch(email_id, '(RFC822)')
raw_email = data[0][1]
msg = email.message_from_bytes(raw_email) # 将原始的邮件数据解析为Message对象
# 解析邮件内容
subject = msg["Subject"]
sender = msg["From"]
date = msg["Date"]
# 打印邮件信息
print("Subject:", subject)
print("From:", sender)
print("Date:", date)
# 遍历附件
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:
# 解码文件名
decoded_filename = email.header.decode_header(filename)[0][0]
if isinstance(decoded_filename, bytes):
# 如果解码后的文件名是字节类型,则使用默认字符集进行解码
decoded_filename = decoded_filename.decode()
# 构建文件路径
filepath = os.path.join('attachments', decoded_filename)
if not os.path.isdir('attachments'):
os.mkdir('attachments')
with open(filepath, "wb") as f:
# 打开文件以二进制写入模式
f.write(part.get_payload(decode=True))
# 保存邮件正文内容到txt文件
if msg.is_multipart():
for part in msg.get_payload():
if part.get_content_type() == "text/plain":
content = part.get_payload(decode=True)
decoded_content = content.decode()
# 处理邮件主题,替换特殊字符
valid_subject = re.sub(r"[^\w\-_. ]", "", subject)
# 构建txt文件路径
txt_filepath = os.path.join('text_files', f"{valid_subject}.txt")
if not os.path.isdir('text_files'):
os.mkdir('text_files')
with open(txt_filepath, "w", encoding="utf-8") as f:
f.write(decoded_content)
# 关闭连接
mail.close()
mail.logout()
不足之处:实际上这个程序缺陷还是蛮大的,有的时候抓取不到内容,还有就是如果真正使用的话,还需要进行封装和打包,此外,涉及到邮箱和密码操作,不同家的邮箱登录设置不一样,例如谷歌邮箱连登录都是问题,密码还要进行一个隔离操作来确保用户隐私的安全,肯定不能就这样出现在源码中。总之,由于个人水平的有限,虽然能够实现主要功能,但是还有很长一段路要走,大家仅供参考哈(比心)❤️