如何编写快捷批量压缩并邮件脚本

wen 实用脚本 1

如何编写快捷批量压缩并邮件发送脚本(完整指南)

目录导读

  1. 为什么需要批量压缩与邮件脚本?
  2. 前期准备:环境与工具安装
  3. 核心代码分步解析
  4. 实战案例:一键压缩文件夹并自动发送邮件
  5. 常见问题解答(FAQ)
  6. 安全与性能优化建议

为什么需要批量压缩与邮件脚本?

在日常办公或开发工作中,我们经常需要将多个文件(如报告、日志、图片)打包压缩后发送给同事或客户,手动操作不仅耗时,且容易遗漏,通过编写一个批量压缩并邮件发送的脚本,你可以:

如何编写快捷批量压缩并邮件脚本

  • 节省时间:一次运行即可完成压缩与发送,无需反复手动操作。
  • 减少错误:自动校验文件是否存在、压缩是否成功,避免漏发。
  • 灵活定制:支持按日期、文件名规则筛选文件,或添加附件加密。

关键词覆盖:批量压缩、邮件脚本、自动化、文件处理、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")

安全与性能优化建议

  1. 不要硬编码密码:使用环境变量或配置文件(如.env)存储邮箱密码。
  2. 处理异常:添加try-except捕获网络错误或文件读取失败。
  3. 日志记录:将操作写入日志文件,便于排查问题。
  4. 压缩策略优化:对于大文件,可启用多线程压缩(如zipfile不支持,考虑pigz工具)。
  5. 遵守邮件发送频率限制:部分SMTP服务商有每日发送上限,分批发送或使用专业邮件API(如SendGrid)。

通过以上步骤,你已经掌握了如何编写一个从文件筛选、批量压缩到自动邮件发送的完整脚本,无论是日常报表分发,还是自动化运维任务,这套方案都能显著提升效率,立即动手修改脚本中的路径和邮箱配置,体验一键自动化的便利吧!

建议下一步:将脚本集成到CI/CD管道,或结合文件监控(如watchdog库)实现实时触发。

抱歉,评论功能暂时关闭!