备份邮件python代码

本文介绍了如何使用Python的imaplib和email库从IMAP服务器中检索邮件,提取主题、发件人信息,并将邮件内容保存为.eml文件。作者详细展示了登录、搜索邮件、解析邮件头信息及文件命名过程。
摘要由CSDN通过智能技术生成
import imaplib
import email
from email.header import decode_header
import chardet
import string
import os

# 邮箱配置
username = "xxxxxx@yyy.com"
password = "授权码或者密码"
imap_server = "imap.xxxxxx.com"  # 邮箱的IMAP服务器地址

# 连接到IMAP服务器
mail = imaplib.IMAP4_SSL(imap_server)
mail.login(username, password)
mail.select("inbox")  # 选择收件箱

# 搜索邮件
result, data = mail.search(None, "ALL")  # 获取所有邮件的ID
if result == "OK":
    for num in data[0].split():
        result, data = mail.fetch(num, "(RFC822)")
        if result == "OK":
            raw_email = data[0][1]
            msg = email.message_from_bytes(raw_email)

            # 获取邮件主题
            subject = decode_header(msg["Subject"])[0][0]
            if isinstance(subject, bytes):
                try:
                    subject = subject.decode('utf-8')
                except UnicodeDecodeError:
                    # 如果解码失败,尝试使用 chardet 检测的编码
                    charset = chardet.detect(subject)['encoding']
                    if charset:
                        subject = subject.decode(charset)
                    else:
                        subject = subject.decode('gbk')  # 或者使用其他备选编码方式

            # 移除邮件主题中的特殊字符,例如回车符和换行符
            subject = subject.replace("\r", "").replace("\n", "")

            # 获取发件人
            from_ = decode_header(msg.get("From"))[0][0]
            if isinstance(from_, bytes):
                try:
                    from_ = from_.decode('utf-8')
                except UnicodeDecodeError:
                    # 如果解码失败,尝试使用 chardet 检测的编码
                    charset = chardet.detect(from_)['encoding']
                    if charset:
                        from_ = from_.decode(charset)
                    else:
                        from_ = from_.decode('gbk')  # 或者使用其他备选编码方式

            # 移除发件人中的特殊字符,例如回车符和换行符
            from_ = from_.replace("\r", "").replace("\n", "")

            # 移除文件名中的特殊字符,例如 <> 以及任何非法的文件名字符
            valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
            filename = ''.join(c for c in subject if c in valid_chars)

            # 添加文件扩展名
            filename += ".eml"

            with open(filename, "wb") as f:
                f.write(raw_email)
            print(f"已备份邮件: {subject} 来自 {from_}")

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值