如何编写快捷批量压缩并邮件发送脚本(完整指南)
目录导读
- 为什么需要批量压缩与邮件脚本?
- 前期准备:环境与工具安装
- 核心代码分步解析
- 实战案例:一键压缩文件夹并自动发送邮件
- 常见问题解答(FAQ)
- 安全与性能优化建议
为什么需要批量压缩与邮件脚本?
在日常办公或开发工作中,我们经常需要将多个文件(如报告、日志、图片)打包压缩后发送给同事或客户,手动操作不仅耗时,且容易遗漏,通过编写一个批量压缩并邮件发送的脚本,你可以:

- 节省时间:一次运行即可完成压缩与发送,无需反复手动操作。
- 减少错误:自动校验文件是否存在、压缩是否成功,避免漏发。
- 灵活定制:支持按日期、文件名规则筛选文件,或添加附件加密。
关键词覆盖:批量压缩、邮件脚本、自动化、文件处理、Python脚本、Shell脚本。
前期准备:环境与工具安装
1 选择脚本语言
- Python(推荐):跨平台、库丰富,适合复杂逻辑。
- Bash(Linux/Mac):适合简单任务,但跨平台性弱。
- PowerShell(Windows):原生支持Windows系统。
本教程以Python为例,因它兼容性最强且社区资源丰富。
2 安装必要库
pip install pyzipper # 用于压缩并加密(可选) pip install yagmail # 简化SMTP邮件发送(需先注册邮箱授权码) pip install schedule # (进阶)实现定时任务
注意:如果使用Gmail,需开启“应用专用密码”;企业邮箱需确认SMTP服务器地址。
3 创建项目文件夹
/auto_email_script/
├── to_send/ # 存放待压缩的文件
├── compressed/ # 压缩后的临时存储
└── main.py # 主脚本
核心代码分步解析
1 批量压缩函数
import os
import zipfile
from datetime import datetime
def compress_files(source_dir, output_dir, pattern="*.txt"):
"""压缩指定目录下符合模式的文件,返回压缩包路径列表"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 获取文件列表
files = [f for f in os.listdir(source_dir) if f.endswith(pattern)]
if not files:
print("未找到匹配文件")
return []
# 按日期生成压缩包名
date_str = datetime.now().strftime("%Y%m%d_%H%M%S")
zip_path = os.path.join(output_dir, f"batch_{date_str}.zip")
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zf:
for file in files:
full_path = os.path.join(source_dir, file)
zf.write(full_path, arcname=file) # arcname去掉路径仅保留文件名
return [zip_path]
亮点:
- 支持通配符模式(如
*.csv) - 自动生成唯一文件名避免覆盖
2 邮件发送函数(yagmail简化版)
import yagmail
def send_email_with_attachments(sender, receiver, subject, body, attachments, smtp_config):
"""发送带附件的邮件"""
yag = yagmail.SMTP(
user=sender,
password=smtp_config['password'],
host=smtp_config['host'],
port=smtp_config['port']
)
yag.send(
to=receiver,
subject=subject,
contents=body,
attachments=attachments
)
print(f"邮件已发送至 {receiver}")
安全提示:密码建议通过环境变量读取,而非硬编码。
3 主程序整合
if __name__ == "__main__":
# 配置区域
SOURCE_DIR = "./to_send"
OUTPUT_DIR = "./compressed"
SENDER = "you@example.com"
RECEIVER = "colleague@example.com"
SUBJECT = "今日报表 - 自动发送"
BODY = "请查收附件,此为自动生成的批量压缩文件。"
# SMTP配置(以QQ邮箱为例)
SMTP_CONFIG = {
'host': 'smtp.qq.com',
'port': 465,
'password': os.getenv('EMAIL_PASSWORD') # 从环境变量读取
}
# 执行压缩
zip_files = compress_files(SOURCE_DIR, OUTPUT_DIR)
if zip_files:
send_email_with_attachments(SENDER, RECEIVER, SUBJECT, BODY, zip_files, SMTP_CONFIG)
实战案例:一键压缩文件夹并自动发送邮件
1 完整脚本(可直接运行)
import os
import zipfile
import yagmail
from datetime import datetime
def compress_and_mail(source=".", pattern="*",
sender="me@gmail.com", receiver="boss@company.com",
subject="自动报告", body="详见附件"):
# 步骤1:压缩
zip_name = f"report_{datetime.now().strftime('%Y%m%d')}.zip"
with zipfile.ZipFile(zip_name, 'w') as zf:
for file in os.listdir(source):
if file.endswith(pattern) or pattern == "*":
zf.write(file)
# 步骤2:发送
yag = yagmail.SMTP(sender, os.getenv('APP_PASSWORD'))
yag.send(to=receiver, subject=subject, contents=body, attachments=zip_name)
# 步骤3:清理(可选)
os.remove(zip_name)
print("成功发送!")
if __name__ == "__main__":
compress_and_mail(source="./data", pattern=".xlsx")
2 发送结果示例
成功压缩3个Excel文件为 report_20250115.zip
邮件已发送至 boss@company.com
常见问题解答(FAQ)
Q1:如何批量压缩不同子文件夹下的文件?
A:遍历子目录,对每个子文件夹生成独立的压缩包,或使用递归模式。
Q2:压缩包太大导致邮件发送失败怎么办?
A:设置大小限制(如50MB),超过则分割为多个zip或改用云盘链接。
Q3:如何定时运行该脚本?
A:使用schedule库或操作系统任务计划(Windows任务计划程序/Linux cron)。
Q4:是否需要考虑中文文件名乱码?
A:在zipfile模块中,确保使用arcname参数时显式声明编码,例如arcname=file.encode('utf-8').decode('gbk')。
Q5:如何增强安全性(如加密压缩)?
A:使用pyzipper库替代标准zipfile,设置密码:
import pyzipper
with pyzipper.AESZipFile('encrypted.zip', 'w', compression=pyzipper.ZIP_DEFLATED) as zf:
zf.setpassword(b"your_password")
安全与性能优化建议
- 不要硬编码密码:使用环境变量或配置文件(如
.env)存储邮箱密码。 - 处理异常:添加
try-except捕获网络错误或文件读取失败。 - 日志记录:将操作写入日志文件,便于排查问题。
- 压缩策略优化:对于大文件,可启用多线程压缩(如
zipfile不支持,考虑pigz工具)。 - 遵守邮件发送频率限制:部分SMTP服务商有每日发送上限,分批发送或使用专业邮件API(如SendGrid)。
通过以上步骤,你已经掌握了如何编写一个从文件筛选、批量压缩到自动邮件发送的完整脚本,无论是日常报表分发,还是自动化运维任务,这套方案都能显著提升效率,立即动手修改脚本中的路径和邮箱配置,体验一键自动化的便利吧!
建议下一步:将脚本集成到CI/CD管道,或结合文件监控(如watchdog库)实现实时触发。