Python实现下载邮件附件及保存正文

本文详细介绍了如何使用Python的imaplib库登录Outlook邮箱,搜索邮件,下载附件,保存邮件正文,并提供了相应的代码示例。注意,实际应用中需考虑安全性和邮箱差异问题。
摘要由CSDN通过智能技术生成


大家好!在本篇博客中,我将向大家介绍如何使用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()

不足之处:实际上这个程序缺陷还是蛮大的,有的时候抓取不到内容,还有就是如果真正使用的话,还需要进行封装和打包,此外,涉及到邮箱和密码操作,不同家的邮箱登录设置不一样,例如谷歌邮箱连登录都是问题,密码还要进行一个隔离操作来确保用户隐私的安全,肯定不能就这样出现在源码中。总之,由于个人水平的有限,虽然能够实现主要功能,但是还有很长一段路要走,大家仅供参考哈(比心)❤️

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值