如何写一个脚本自动发送周报

wen 实用脚本 3

从零到一的自动化工作流实战指南

目录导读

  1. 为什么需要自动发送周报脚本? —— 效率痛点与场景分析
  2. 核心准备工作 —— 你需要知道的基础工具与知识
  3. 手把手写一个Python自动周报脚本 —— 完整代码拆解
  4. 进阶技巧:让周报更“智能” —— 数据抓取、模板化与定时调度
  5. 常见问题与问答 —— 解决你的实际困惑
  6. SEO优化与安全提醒 —— 如何让你的教程被更多人看到

为什么需要自动发送周报脚本?

痛点场景

你每周五下午都在重复同一件事:打开Excel、复制数据、撰写邮件、添加附件、点击发送,如果团队有10个人,这个动作你就要重复10次,手动操作不仅容易出错(比如忘记附上周报表或发错收件人),还占用宝贵的30分钟。

如何写一个脚本自动发送周报

问答环节

问:写脚本自动发周报需要会多少编程知识?
答:仅需Python基础(变量、函数、循环),以及会用schedulesmtplibemail库,即使你是零基础,跟着本文操作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:可以,创建一个.batpython 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_workdayif is_workday(today): 才执行发送。


SEO优化与安全提醒

让本文被更多人看到

  • 关键词布局出现核心词“如何写一个脚本自动发送周报”,正文自然包含“Python周报脚本”、“自动发送邮件”、“定时调度”、“数据自动化”
  • 长尾词覆盖:“企业微信周报自动化”、“Python发送带附件邮件”、“周报模板生成脚本”
  • 内部链接:可关联“Python smtplib教程”、“Pandas读取Excel入门”
  • 结构化数据:使用H1、H2标题层级,列表、问答格式(Google偏好FAQ样式)

安全最后提醒

永远不要在脚本中硬编码邮箱密码!使用配置文件(如.env)并加入.gitignore,如果脚本涉及公司敏感数据,务必在发送前进行数据脱敏处理。


从手动发送周报到脚本一键完成,你节省的不仅是每周30分钟,更是对重复工作的彻底告别。自动化不是为了让机器取代人,而是让人有时间去做机器做不了的事,打开你的编辑器,写下第一行import smtplib吧。

上一篇用脚本控制任务栏自动隐藏

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!