当前位置:首页>python>Day21:让Python当你的“邮件秘书”!一键发送带附件的日报/周报

Day21:让Python当你的“邮件秘书”!一键发送带附件的日报/周报

  • 2026-09-08 14:35:30
Day21:让Python当你的“邮件秘书”!一键发送带附件的日报/周报

领导总催着要报表?每次都要打开邮箱、上传附件、填写收件人?Python帮你自动发送,连正文都写好!

一、先看这个真实场景

刘主任每周五下午都要做这件事:

  1. 把本周的“各班级成绩汇总.xlsx”文件整理好
  2. 打开公司邮箱,点“写邮件”
  3. 输入领导邮箱 zhuren@xx.com
  4. 写标题“第15周成绩汇总报表”
  5. 写正文“领导好,本周成绩汇总请查收。”
  6. 上传附件
  7. 点击发送

每周一次,从不间断

有时候忙忘了,领导还会来催:“小刘,报表呢?”

二、Python的“邮件秘书”魔法

今天教你用Python自动发送邮件,以后每周五下班前,让代码替你干活:

import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBasefrom email import encoders# 设置你的邮箱信息发件人 = '你的邮箱@qq.com'密码 = '你的授权码'# 不是登录密码,是邮箱授权码!收件人 = '领导邮箱@公司.com'# 创建邮件对象邮件 = MIMEMultipart()邮件['From'] = 发件人邮件['To'] = 收件人邮件['Subject'] = '本周成绩汇总报表'# 添加正文正文 = MIMEText('领导好,本周各班级成绩汇总请查收附件。', 'plain', 'utf-8')邮件.attach(正文)# 添加附件附件路径 = r'C:\Users\你的名字\Desktop\全校成绩汇总_20250221.xlsx'附件 = MIMEBase('application', 'octet-stream')with open(附件路径, 'rb') as f:    附件.set_payload(f.read())encoders.encode_base64(附件)附件.add_header('Content-Disposition', f'attachment; filename=全校成绩汇总.xlsx')邮件.attach(附件)# 发送邮件服务器 = smtplib.SMTP_SSL('smtp.qq.com', 465)  # 用QQ邮箱服务器.login(发件人, 密码)服务器.send_message(邮件)服务器.quit()print("✅ 邮件发送成功!领导应该收到了。")

看懂了吗?

  • 用 smtplib 连接邮箱服务器
  • 用 email 库构造邮件内容和附件
  • 最后登录、发送、退出

全程不需要你手动点一下鼠标!

三、分解“魔法”:每步在干什么?

3.1 第一步:获取邮箱授权码

重点! 不能用你的QQ邮箱登录密码,要用授权码。

  • QQ邮箱:设置 → 账户 → POP3/IMAP/SMTP服务 → 开启 → 生成授权码
  • 163邮箱:设置 → POP3/SMTP/IMAP → 开启 → 授权码
  • 公司邮箱可能用其他方式,问IT部门

3.2 第二步:构造邮件对象

邮件 = MIMEMultipart()邮件['From'] = 发件人邮件['To'] = 收件人邮件['Subject'] = '本周成绩汇总报表'
  • MIMEMultipart():可以同时包含正文和附件
  • 像字典一样设置发件人、收件人、标题

3.3 第三步:添加正文

正文 = MIMEText('领导好,本周各班级成绩汇总请查收附件。', 'plain', 'utf-8')邮件.attach(正文)
  • MIMEText:创建纯文本正文
  • 也可以改成 'html' 发HTML格式的邮件(可以加粗、换行等)

3.4 第四步:添加附件

附件 = MIMEBase('application', 'octet-stream')with open(附件路径, 'rb') as f:    附件.set_payload(f.read())encoders.encode_base64(附件)附件.add_header('Content-Disposition', f'attachment; filename=全校成绩汇总.xlsx')邮件.attach(附件)
  • 读取文件二进制内容
  • 用 encoders.encode_base64 编码
  • 设置附件的文件名(可以跟原文件不同)

3.5 第五步:发送

服务器 = smtplib.SMTP_SSL('smtp.qq.com', 465)服务器.login(发件人, 密码)服务器.send_message(邮件)服务器.quit()
  • 不同邮箱的 SMTP 服务器不同:
  • QQ邮箱:smtp.qq.com 端口465(SSL)或587(TLS)
  • 163邮箱:smtp.163.com 端口465
  • 126邮箱:smtp.126.com
  • 公司邮箱(如exchange)可能需要另外配置

四、自己动手试试!

4.1 第一步:先给自己发一封测试邮件

import smtplibfrom email.mime.text import MIMEText发件人 = '你的邮箱@qq.com'密码 = '你的授权码'收件人 = 发件人  # 先发给自己测试邮件 = MIMEText('这是一封测试邮件,来自Python。', 'plain', 'utf-8')邮件['From'] = 发件人邮件['To'] = 收件人邮件['Subject'] = 'Python测试邮件'服务器 = smtplib.SMTP_SSL('smtp.qq.com', 465)服务器.login(发件人, 密码)服务器.send_message(邮件)服务器.quit()print("测试邮件已发送,快去看看收件箱!")

如果成功收到,说明邮箱配置正确!

4.2 第二步:把上一期的报表作为附件发送

把上面第一段代码里的附件路径改成你刚刚生成的报表,收件人改成领导邮箱,发送!

五、办公实战1:自动生成并发送周报

把之前学的批量处理和邮件发送结合起来,实现一键生成+发送:

import pandas as pdimport osimport smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBasefrom email import encodersfrom datetime import datetime# 1. 批量处理数据(沿用第20天的代码)文件夹 = '各班级成绩'所有文件 = [f for f in os.listdir(文件夹) if f.endswith('.xlsx')]数据列表 = []for 文件名 in 所有文件:    df = pd.read_excel(os.path.join(文件夹, 文件名))    df['来源班级'] = 文件名.replace('.xlsx', '')    数据列表.append(df)全校数据 = pd.concat(数据列表, ignore_index=True)# 计算总分、平均分全校数据['总分'] = 全校数据[['语文', '数学', '英语']].sum(axis=1)全校数据['平均分'] = (全校数据['总分'] / 3).round(1)# 按班级统计班级统计 = 全校数据.groupby('来源班级').agg({'语文': 'mean','数学': 'mean','英语': 'mean','总分': 'mean','姓名': 'count'}).round(1).rename(columns={'姓名': '人数'})# 2. 保存为带日期的Excel文件今天日期 = datetime.now().strftime('%Y%m%d')文件名 = f'全校成绩汇总_{今天日期}.xlsx'with pd.ExcelWriter(文件名) as writer:    全校数据.to_excel(writer, sheet_name='详细数据', index=False)    班级统计.to_excel(writer, sheet_name='班级统计')print(f'✅ 报表已生成:{文件名}')# 3. 发送邮件发件人 = '你的邮箱@qq.com'密码 = '你的授权码'收件人 = '领导邮箱@公司.com'邮件 = MIMEMultipart()邮件['From'] = 发件人邮件['To'] = 收件人邮件['Subject'] = f'全校成绩汇总周报_{今天日期}'正文内容 = f'''领导好:本周各班级成绩汇总已完成,请查收附件。主要数据:- 共处理 {len(所有文件)} 个班级- 全校平均分:{全校数据['平均分'].mean():.1f}- 最高分班级:{班级统计['总分平均'].idxmax()}({班级统计['总分平均'].max():.1f}分)祝工作顺利!'''正文 = MIMEText(正文内容, 'plain', 'utf-8')邮件.attach(正文)# 添加附件附件 = MIMEBase('application', 'octet-stream')with open(文件名, 'rb') as f:    附件.set_payload(f.read())encoders.encode_base64(附件)附件.add_header('Content-Disposition', f'attachment; filename={文件名}')邮件.attach(附件)# 发送服务器 = smtplib.SMTP_SSL('smtp.qq.com', 465)服务器.login(发件人, 密码)服务器.send_message(邮件)服务器.quit()print('✅ 邮件发送成功!领导应该收到了。')

六、办公实战2:定时自动发送(不用每天手动跑)

你可以用Python的 schedule 库设置定时任务,比如每周五下午5点自动运行上面的脚本。

6.1 安装schedule

#bashpip install schedule

6.2 编写定时脚本

import scheduleimport timefrom datetime import datetimedef 发送周报任务():print(f'{datetime.now()} 开始执行周报发送...')# 这里放上面发送邮件的完整代码(可以封装成函数)print(f'{datetime.now()} 周报发送完成!')# 每周五下午5点执行schedule.every().friday.at("17:00").do(发送周报任务)print('定时任务已启动,等待执行...')while True:    schedule.run_pending()    time.sleep(60)  # 每分钟检查一次

这样脚本就会一直运行,到点自动发邮件。你可以把它部署在办公室的电脑上(不要关)。

注意:如果你不想一直开着电脑,可以用Windows的任务计划程序,定时执行你的Python脚本。

七、进阶技巧:美化邮件正文(HTML格式)

纯文本太单调?可以改成HTML,加粗、颜色、表格:

html正文 = f'''<html><body>    <h2>全校成绩汇总周报</h2>    <p>领导好:</p>    <p>本周各班级成绩汇总已完成,请查收附件。</p>    <h3>主要数据:</h3>    <ul>        <li><b>处理班级数:</b> {len(所有文件)}</li>        <li><b>全校平均分:</b> {全校数据['平均分'].mean():.1f}</li>        <li><b>最高分班级:</b> {班级统计['总分平均'].idxmax()}({班级统计['总分平均'].max():.1f}分)</li>    </ul>    <hr>    <p>祝工作顺利!</p></body></html>'''正文 = MIMEText(html正文, 'html', 'utf-8')

八、常见问题

8.1 发送失败,报错“535 Error”

  • 授权码错误 → 重新生成授权码
  • 有些邮箱需要开启SMTP服务 → 去设置里开启

8.2 收件人收不到邮件

  • 检查垃圾箱
  • 可能是邮箱服务器限制,试试换一个邮箱(如163)

8.3 附件过大

  • 一般邮件附件限制25MB,超过的话需要压缩或分卷

九、重点总结:今天你学会了什么?

✅ 核心技能

    1. smtplib - 连接邮箱服务器
    2. email 库 - 构造邮件(正文、附件)
    3. 授权码 - 代替密码登录
    4. 定时任务 - schedule 或 Windows计划任务

    ✅ 办公应用场景

    1. 自动发送周报/月报 - 一键生成+发送
    2. 数据监控报警 - 发现异常自动发邮件提醒
    3. 定时备份通知 - 备份完成发邮件告知

    ✅ 效率对比

    任务
    手动操作
    Python代码
    每周五发邮件
    打开邮箱→写邮件→上传附件→发送
    全自动
    忘记发邮件
    被领导催
    永不忘记
    同时发多人
    抄送一个个填
    一次设置

    十、今日挑战:动手做!

    任务1:给自己发一封带图片的邮件

    # 除了附件,在正文里插入一张图片(用HTML格式)

    任务2:添加抄送和密送

    # 邮件['Cc'] = '其他领导@公司.com'# 邮件['Bcc'] = '密送人@公司.com'

    任务3:把之前第17天美化过的Excel报表作为附件发送

    # 合并第17天的样式代码和第21天的发送代码

    十一、明日预告

    明天学终极自动化:搭建你的个人办公机器人!

    • 如何用Python监控文件夹,有新文件自动处理?
    • 如何把多个脚本组合成一个完整系统?
    • 如何用GUI界面让不懂代码的同事也能用?

    真正的“办公自动化大师”,从明天开始!


    回复「Py-Day」获取今日挑战题解及完整代码。

    评论区作业:晒出你成功发送邮件的截图,或者分享你遇到的坑!👇

    最新文章

    随机文章