Python自动化:发送带附件的邮件

2026-08-23 06:00:49 235阅读 0评论

告别手动群发:Python自动化发送带附件邮件的实战指南

每到周五下午或者月底,打工人最头疼的莫过于整理数据报表并挨个发送给相关人员。如果收件人少还好,一旦涉及多个部门、多份附件,手动拖拽上传简直让人崩溃。其实,这种机械重复的工作早就该交给代码了。今天咱们就来聊聊,如何用Python写个脚本,把带附件的邮件自动发出去,让你准时下班。

避开新手最常见的坑:授权码

在敲代码前,得先解决一个很多人卡壳的问题:邮箱密码

现在的邮箱为了安全,早就不能直接用网页登录密码来跑代码了。你需要去邮箱设置里找到“POP3/SMTP服务”,开启它,并生成一个专属授权码。这个授权码才是你代码里真正要用的“密码”。记下来,等会儿代码里要用。

拆解核心代码:把邮件“组装”起来

发邮件本质上就是组装一个包裹。Python内置的 smtplibemail 库就是咱们的打包工具。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

# 1. 配置基础信息
sender = 'your_email@example.com'
password = 'your_auth_code'  # 这里填刚才拿到的授权码
receiver = 'target@example.com'
smtp_server = 'smtp.example.com' # 替换为你邮箱的SMTP服务器地址

# 2. 构建邮件主体
msg = MIMEMultipart()
msg['From'] = Header("数据小助手", 'utf-8')
msg['To'] = Header("业务部", 'utf-8')
msg['Subject'] = Header("本周业务数据报表", 'utf-8')

# 添加正文内容
text_part = MIMEText("请查收本周最新数据报表,如有疑问随时沟通。", 'plain', 'utf-8')
msg.attach(text_part)

这段代码搭起了邮件的骨架。正文部分用了 MIMEText,而带附件的邮件必须用 MIMEMultipart 来把正文和附件“绑”在一起。

关键一步:优雅地塞入附件

很多人自己摸索时,附件发出去后,收件人看到的文件名全是一堆乱码。这是因为中文文件名编码没处理好。咱们直接用 MIMEApplication 配合 Header 来解决这个痛点。

# 3. 添加附件(解决中文乱码)
file_path = '本周业务数据.xlsx'

with open(file_path, 'rb') as f:
    # 读取文件内容
    attach = MIMEApplication(f.read())
    # 关键:对中文文件名进行编码,防止乱码
    attach.add_header('Content-Disposition', 'attachment', 
                      filename=('utf-8', '', file_path))
    msg.attach(attach)

注意这里的 filename=('utf-8', '', file_path),这是一个非常实用的小技巧,直接告诉邮件客户端用UTF-8解码文件名,彻底告别乱码。如果有多个附件,写个 for 循环遍历文件路径列表,把 attach 挨个 msg.attach() 进去就行。

发送邮件:最后的一公里

包裹打包好了,接下来就是找快递员送出去。

# 4. 连接服务器并发送
try:
    # 连接SMTP服务器,如果是SSL端口(如465),用SMTP_SSL
    server = smtplib.SMTP_SSL(smtp_server, 465)
    server.login(sender, password)
    server.sendmail(sender, receiver, msg.as_string())
    server.quit()
    print("邮件发送成功,准备下班!")
except Exception as e:
    print(f"发送失败,赶紧检查一下:{e}")

这里提醒一句,连接服务器时注意看你的邮箱文档,465端口通常对应 SMTP_SSL,而25或587端口对应普通的 SMTP。用错方法会直接报错连不上。

让自动化更进一步

把这套代码跑通后,你可以把它封装成一个函数。想让它真正“自动”起来,可以结合 schedule 库设定每天下午5点执行,或者利用系统的定时任务(Windows的任务计划程序 / Linux的Cron)定期触发。

代码的意义不在于炫技,而在于把我们从繁琐的机械劳动中解放出来。当你看着脚本在后台默默把报表准时发到领导邮箱,而你正悠闲地喝着咖啡时,就会明白这几十行代码的价值所在。周末愉快,把时间留给生活吧。

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
验证码
评论列表 (暂无评论,235人围观)

还没有评论,来说两句吧...

目录[+]