云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

自动下载邮箱里未阅读的发票,并用邮件标题里指定的几个字命名

jxf315 2025-04-11 00:03:43 教程文章 32 ℃

要实现自动下载邮箱中未读发票邮件附件并以指定标题部分命名的功能,可以按照以下步骤操作:


步骤 1:安装所需库

确保已安装必要的Python库:

bash

pip install imapclient


步骤 2:编写Python脚本

python

import imaplib

import email

import os

import re

from email.header import decode_header

from datetime import datetime


# 配置信息

EMAIL = 'your_email@example.com' # 替换为你的邮箱

PASSWORD = 'your_password' # 替换为你的密码或应用专用密码

IMAP_SERVER = 'imap.example.com' # IMAP服务器地址,如imap.qq.com、imap.gmail.com

SAVE_DIR = './invoices' # 附件保存目录


# 连接到IMAP服务器

mail = imaplib.IMAP4_SSL(IMAP_SERVER)

mail.login(EMAIL, PASSWORD)

mail.select('INBOX') # 选择收件箱


# 搜索未读邮件

status, messages = mail.search(None, 'UNSEEN')

if status != 'OK':

print("无法搜索邮件")

exit()


mail_ids = messages[0].split()


for mail_id in mail_ids:

try:

# 获取邮件内容

status, data = mail.fetch(mail_id, '(RFC822)')

if status != 'OK':

continue


raw_email = data[0][1]

msg = email.message_from_bytes(raw_email)


# 解析邮件标题

subject, encoding = decode_header(msg['Subject'])[0]

if isinstance(subject, bytes):

subject = subject.decode(encoding or 'utf-8')


# 从标题提取文件名部分(示例:提取“订单号XXX”)

# 根据实际情况调整正则表达式,例如r'发票(\d+)'匹配“发票123”

match = re.search(r'订单号(\w+)', subject)

filename_part = match.group(1) if match else datetime.now().strftime("%Y%m%d%H%M%S")

# 清理非法字符

filename_part = re.sub(r'[\\/*?:"<>|]', '', filename_part)


# 遍历邮件部分查找附件

for part in msg.walk():

content_disposition = part.get("Content-Disposition", "")

if "attachment" in content_disposition:

# 获取原始附件名并解码

filename = part.get_filename()

if filename:

filename, encoding = decode_header(filename)[0]

if isinstance(filename, bytes):

filename = filename.decode(encoding or 'utf-8', errors='replace')

# 生成新文件名

ext = os.path.splitext(filename)[1]

new_filename = f"{filename_part}{ext}"

save_path = os.path.join(SAVE_DIR, new_filename)


# 避免重复文件名

counter = 1

while os.path.exists(save_path):

new_filename = f"{filename_part}_{counter}{ext}"

save_path = os.path.join(SAVE_DIR, new_filename)

counter += 1


# 保存附件

os.makedirs(SAVE_DIR, exist_ok=True)

with open(save_path, 'wb') as f:

f.write(part.get_payload(decode=True))

print(f"附件已保存:{save_path}")


# 标记邮件为已读

mail.store(mail_id, '+FLAGS', '\Seen')

except Exception as e:

print(f"处理邮件 {mail_id} 时出错:{str(e)}")


# 关闭连接

mail.close()

mail.logout()


步骤 3:配置和运行

1. **替换配置信息**:修改脚本中的`EMAIL`、`PASSWORD`、`IMAP_SERVER`和`SAVE_DIR`。

2. **标题匹配规则**:根据发票邮件的实际标题格式调整正则表达式。例如,若标题为“发票-订单号ABC123”,使用正则`r'订单号(\w+)'`提取“ABC123”。

3. **运行环境**:确保Python环境安装所需库,并具有网络访问权限。

4. **自动运行**:使用任务计划程序(Windows)或cron(Linux)定时执行脚本。


注意事项

- **安全性**:避免在脚本中明文存储密码,建议使用环境变量或加密配置。

- **异常处理**:脚本包含基本错误处理,可根据需要扩展日志记录。

- **附件类型**:确保仅处理目标附件(如PDF、Excel),可在代码中添加文件类型检查。


此脚本将自动下载未读邮件的附件,并根据标题中的指定部分命名文件,有效管理发票存档。

Tags:

最近发表
标签列表