从零到一的自动化工作流实战指南
目录导读
- 为什么需要自动发送周报脚本? —— 效率痛点与场景分析
- 核心准备工作 —— 你需要知道的基础工具与知识
- 手把手写一个Python自动周报脚本 —— 完整代码拆解
- 进阶技巧:让周报更“智能” —— 数据抓取、模板化与定时调度
- 常见问题与问答 —— 解决你的实际困惑
- SEO优化与安全提醒 —— 如何让你的教程被更多人看到
为什么需要自动发送周报脚本?
痛点场景
你每周五下午都在重复同一件事:打开Excel、复制数据、撰写邮件、添加附件、点击发送,如果团队有10个人,这个动作你就要重复10次,手动操作不仅容易出错(比如忘记附上周报表或发错收件人),还占用宝贵的30分钟。

问答环节
问:写脚本自动发周报需要会多少编程知识?
答:仅需Python基础(变量、函数、循环),以及会用schedule、smtplib和email库,即使你是零基础,跟着本文操作1小时也能跑通。
问:我的周报数据来自多个数据源(Jira、Excel、数据库),能自动化吗?
答:完全可以,脚本核心是“数据采集→模板渲染→发送”,数据源可以是API、本地文件或数据库查询,我们一一演示。
核心准备工作
工具清单
- Python 3.8+:安装方法:python官网下载或包管理器(如brew install python3)
- IDE:推荐VS Code,或者直接用记事本+命令行
- 关键库安装(在终端执行):
pip install schedule smtplib email pandas openpyxl
文件结构建议
weekly_report_project/
├── report_template.html # 邮件HTML模板
├── send_report.py # 主脚本
├── config.ini # 邮箱配置(不提交到Git)
└── data/ # 存放周报数据源
问答环节
问:为什么不用Excel宏或Outlook规则?
答:Excel宏只能处理本地表格,无法自动从数据库或API拉数据;Outlook规则不能动态生成邮件内容,Python脚本的扩展性最优(可接入Slack、钉钉等)。
问:我的邮箱需要特殊设置吗?
答:需要开启SMTP服务,企业邮箱(如QQ、163、Gmail)大多支持,需在邮箱设置中生成“授权码”而非登录密码,具体路径:设置→账户→POP3/SMTP服务→开启。
手把手写一个Python自动周报脚本
Step 1:邮件发送核心函数
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import configparser
# 读取配置(避免明文写密码)
config = configparser.ConfigParser()
config.read('config.ini')
sender = config['email']['sender']
password = config['email']['password']
smtp_server = config['email']['smtp_server']
smtp_port = config['email']['smtp_port']
def send_email(to_list, subject, body_html, attachment_path=None):
msg = MIMEMultipart('alternative')
msg['From'] = sender
msg['To'] = ', '.join(to_list)
msg['Subject'] = subject
# 添加HTML正文
part_html = MIMEText(body_html, 'html', 'utf-8')
msg.attach(part_html)
# 添加附件
if attachment_path:
with open(attachment_path, 'rb') as f:
part_attach = MIMEBase('application', 'octet-stream')
part_attach.set_payload(f.read())
encoders.encode_base64(part_attach)
part_attach.add_header('Content-Disposition', f'attachment; filename="{attachment_path.split("/")[-1]}"')
msg.attach(part_attach)
# 发送
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(sender, password)
server.sendmail(sender, to_list, msg.as_string())
server.quit()
Step 2:生成周报HTML内容(含模板)
创建一个report_template.html文件,用占位符{name}、{week}、{content}:
<!DOCTYPE html>
<html>
<body>
<h2>周报 - {week}</h2>
<p>您好,{name}:</p>
<p>本周核心工作:</p>
<pre>{content}</pre>
<hr>
<p>自动生成,无需回复。</p>
</body>
</html>
在脚本中用str.replace渲染:
def generate_html(recipient_name, week_num, data):
with open('report_template.html', 'r', encoding='utf-8') as f:
template = f.read()
return template.replace('{name}', recipient_name)\
.replace('{week}', week_num)\
.replace('{content}', data)
Step 3:组合主逻辑
import datetime
today = datetime.date.today()
week_num = today.isocalendar()[1] # 当前周数
# 示例:从Excel读取本周数据
import pandas as pd
df = pd.read_excel('data/weekly_data.xlsx')
this_week_data = df[df['week'] == week_num]
# 假设要发给3个人
recipients = ['zhang@company.com', 'li@company.com']
for email in recipients:
user_data = this_week_data[this_week_data['email'] == email]
content = user_data.to_string(index=False) if not user_data.empty else "本周无新增任务"
html = generate_html('张工', week_num, content)
send_email([email], f'周报-第{week_num}周', html, 'data/附件.docx')
问答环节
问:多个收件人内容不同怎么办?
答:用循环遍历收件人列表,每次从数据库或Excel中根据“收件人邮箱”过滤该行数据,动态渲染,上述代码已展示此逻辑。
问:附件如何处理?
答:支持任意文件类型,只需在send_email调用时传入路径参数,注意附件大小限制(企业邮箱通常20MB)。
进阶技巧:让周报更“智能”
数据自动聚合
从Jira API拉取本周工单:
import requests
jira_url = f'https://your-company/rest/agile/1.0/board/{board_id}/sprint?state=active'
response = requests.get(jira_url, auth=(user, api_token))
sprint_issues = response.json()['issues'] # 处理后写入模板
定时调度
安装schedule库后,设定每周五下午3点执行:
import schedule
def job():
main() # 你的发送函数
schedule.every().friday.at("15:00").do(job)
while True:
schedule.run_pending()
time.sleep(60)
建议:部署到云服务器或树莓派,避免本地关机。
安全增强
- 邮箱授权码加密存储(用
cryptography库) - 日志记录每次发送结果(
logging模块) - 异常重试机制(捕获
smtplib.SMTPException后重试3次)
问答环节
问:如何避免被公司邮箱系统判定为垃圾邮件?
答:① 使用企业邮箱真实域名发送;② 添加DKIM签名(配置在邮箱后台);③ 正文不要只放链接,要有合理文本结构;④ 一次发送人数不超过20人,分批发送。
问:需要处理周末加班的情况吗?
答:可以在脚本中判断today.weekday() >= 5(周六日跳过),或者通过参数指定“强制发送日期”。
常见问题与问答(FAQ)
Q1:脚本运行后报错“smtplib.SMTPAuthenticationError”怎么办?
A:检查三点:① 邮箱是否开启SMTP服务;② 密码是否填写的是”授权码”而非登录密码;③ 发送服务器地址是否写错(例如QQ邮箱是smtp.qq.com,端口587或465)。
Q2:能直接在Windows任务计划程序中调用脚本吗?
A:可以,创建一个.bat为python C:\path\to\send_report.py,然后在任务计划程序中设置触发器,但建议用schedule库更灵活。
Q3:不想写HTML模板,能用Markdown转HTML吗?
A:可以,用markdown2库:pip install markdown2,然后html_body = markdown2.markdown(md_content)。
Q4:脚本如何处理节假日(如春节放假)?
A:导入chinese_calendar库判断是否为工作日:from chinese_calendar import is_workday,if is_workday(today): 才执行发送。
SEO优化与安全提醒
让本文被更多人看到
- 关键词布局出现核心词“如何写一个脚本自动发送周报”,正文自然包含“Python周报脚本”、“自动发送邮件”、“定时调度”、“数据自动化”
- 长尾词覆盖:“企业微信周报自动化”、“Python发送带附件邮件”、“周报模板生成脚本”
- 内部链接:可关联“Python smtplib教程”、“Pandas读取Excel入门”
- 结构化数据:使用H1、H2标题层级,列表、问答格式(Google偏好FAQ样式)
安全最后提醒
永远不要在脚本中硬编码邮箱密码!使用配置文件(如.env)并加入.gitignore,如果脚本涉及公司敏感数据,务必在发送前进行数据脱敏处理。
从手动发送周报到脚本一键完成,你节省的不仅是每周30分钟,更是对重复工作的彻底告别。自动化不是为了让机器取代人,而是让人有时间去做机器做不了的事,打开你的编辑器,写下第一行import smtplib吧。