网站首页 > 教程文章 正文
要实现自动下载邮箱中未读发票邮件附件并以指定标题部分命名的功能,可以按照以下步骤操作:
步骤 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),可在代码中添加文件类型检查。
此脚本将自动下载未读邮件的附件,并根据标题中的指定部分命名文件,有效管理发票存档。
猜你喜欢
- 2025-04-11 手把手教你开发智能备份神器,小白也能30分钟搞定!
- 2025-04-11 画像笔记23- 作业流程调度(2)(作业流程图怎么画)
- 2025-04-11 Python接口自动化之常见用例读取方法介绍
- 2025-04-11 AI办公自动化:批量合并多个Excel表格的数据并汇总
- 2025-04-11 pc端微信用户图片DAT格式解码为图片
- 2025-04-11 Python自动化脚本应用与示例(pythonui自动化脚本)
- 2025-04-11 21-02-Python-文件操作下(python文件操作方法)
- 2025-04-11 Python定时任务,三步实现自动化(python定时任务,三步实现自动化效果)
- 2025-04-11 照片整理很繁琐?3个python脚本帮你快速整理照片
- 2025-04-11 Python语言的12个基础知识点小结(python 语言基础)
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)