我的知识记录

Python批量打包发送文件夹:zip后自动发送邮件附件

用Python把文件夹压缩成zip,再通过smtplib自动作为邮件附件发送,一键完成打包+发送,完整可运行代码。

场景痛点

每周要把项目文件夹打包成zip,然后作为附件发给客户或领导。手动压缩、打开邮箱、上传附件、填写收件人,一套流程下来十几分钟。用Python脚本把这两步串起来:自动压缩文件夹,自动发邮件带附件,跑一下就完事。

用到的库

zipfile    # 标准库,打包
pathlib    # 标准库
smtplib    # 标准库,发邮件
email      # 标准库,构造邮件

完整代码

import smtplib
import zipfile
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders


def zip_folder(folder_path: str, output_zip: str) -> str:
"""把整个文件夹打包成zip"""
src = Path(folder_path).resolve()
out = Path(output_zip)
out.parent.mkdir(parents=True, exist_ok=True)

with zipfile.ZipFile(out, 'w', zipfile.ZIP_DEFLATED) as zf:
for file in src.rglob('*'):
if file.is_file():
# arcname保留文件夹名作为顶层目录
arcname = Path(src.name) / file.relative_to(src)
zf.write(file, arcname=str(arcname))
print(f"打包完成: {out}")
return str(out)


def send_email_with_attachment(
smtp_host: str,
smtp_port: int,
sender: str,
password: str,
recipients: list,
subject: str,
body: str,
attachment_path: str
):
"""发送带附件的邮件"""
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = ', '.join(recipients)
msg['Subject'] = subject

# 邮件正文
msg.attach(MIMEText(body, 'plain', 'utf-8'))

# 添加附件
p = Path(attachment_path)
part = MIMEBase('application', 'octet-stream')
part.set_payload(p.read_bytes())
encoders.encode_base64(part)
# filename用UTF-8编码,避免中文文件名乱码
part.add_header('Content-Disposition', f'attachment; filename="{p.name}"')
msg.attach(part)

# 连接SMTP服务器发送
with smtplib.SMTP_SSL(smtp_host, smtp_port) as server:
server.login(sender, password)
server.sendmail(sender, recipients, msg.as_string())
print("邮件发送成功")


if __name__ == "__main__":
# 第一步:打包文件夹
zip_file = zip_folder(
folder_path="./本周报表",
output_zip="./output/本周报表.zip"
)

# 第二步:发送邮件
send_email_with_attachment(
smtp_host="smtp.qq.com",
smtp_port=465,
sender="your@qq.com",
password="邮箱授权码",
recipients=["boss@example.com"],
subject="本周报表",
body="领导好,附件是本周报表打包,请查收。",
attachment_path=zip_file
)

代码讲解

  • zip_folder:遍历文件夹所有文件,用arcname = src.name / relative_path保证压缩包里以文件夹名作为顶层目录,解压后不会散落一堆文件。
  • MIMEMultipart:多部分邮件容器,可以同时放正文和附件。
  • MIMEBase + encoders.encode_base64:把附件二进制内容用Base64编码,这是邮件传输附件的标准格式。
  • smtplib.SMTP_SSL:用SSL加密连接SMTP服务器。QQ邮箱用smtp.qq.com:465,163邮箱用smtp.163.com:465,企业微信邮箱对应各自地址。
  • 邮箱密码用的是授权码不是登录密码,在邮箱设置里开启SMTP服务后生成。

运行结果

脚本先把本周报表/文件夹压缩成output/本周报表.zip,然后连接SMTP服务器把zip作为附件发给收件人。收件人收到邮件后下载附件解压即可看到完整文件夹内容。

注意事项

  • 附件大小有上限:QQ邮箱一般50MB,企业邮箱视配置而定。zip太大建议改用网盘链接。
  • 授权码不要硬编码在脚本里,用环境变量或配置文件读取,避免提交到Git泄露。
  • 邮箱设置里必须先开启SMTP服务,否则登录会被拒绝。QQ邮箱在"设置-账号-POP3/SMTP服务"里开启。
  • 压缩包如果包含大量小文件,DEFLATE压缩速度较慢,这是正常现象。

Python批量打包发送文件夹:zip后自动发送邮件附件

标签:

更新时间:2026-09-14 21:14:51

上一篇:Python使用163邮箱SMTP发送邮件 完整配置

下一篇:Python 按扩展名归类文件到文件夹:一键整理杂乱下载目录