领导总催着要报表?每次都要打开邮箱、上传附件、填写收件人?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("✅ 邮件发送成功!领导应该收到了。")看懂了吗?
全程不需要你手动点一下鼠标!
重点! 不能用你的QQ邮箱登录密码,要用授权码。
邮件 = MIMEMultipart()邮件['From'] = 发件人邮件['To'] = 收件人邮件['Subject'] = '本周成绩汇总报表'正文 = 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=全校成绩汇总.xlsx')邮件.attach(附件)服务器 = smtplib.SMTP_SSL('smtp.qq.com', 465)服务器.login(发件人, 密码)服务器.send_message(邮件)服务器.quit()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("测试邮件已发送,快去看看收件箱!")如果成功收到,说明邮箱配置正确!
把上面第一段代码里的附件路径改成你刚刚生成的报表,收件人改成领导邮箱,发送!
把之前学的批量处理和邮件发送结合起来,实现一键生成+发送:
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('✅ 邮件发送成功!领导应该收到了。')你可以用Python的 schedule 库设置定时任务,比如每周五下午5点自动运行上面的脚本。
#bashpip install scheduleimport 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正文 = 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')✅ 核心技能
✅ 办公应用场景
✅ 效率对比
# 除了附件,在正文里插入一张图片(用HTML格式)# 邮件['Cc'] = '其他领导@公司.com'# 邮件['Bcc'] = '密送人@公司.com'# 合并第17天的样式代码和第21天的发送代码明天学终极自动化:搭建你的个人办公机器人!
真正的“办公自动化大师”,从明天开始!
回复「Py-Day」获取今日挑战题解及完整代码。
评论区作业:晒出你成功发送邮件的截图,或者分享你遇到的坑!👇