文章目录
python脚本实现每周邮件按时发送
每周进行工作总结等,生成一份统计Table内嵌入邮件中,并每周按时群发给部门所有人员。
本文介绍如何生成内嵌表格,以及后续部门人员异动,如何及时更新和维护信息,如何实现每周按时发送
如图所示:
1. 生成邮件内容并发送
引入需要的依赖,未安装相关依赖手动pip install即可
# email 用于构建邮件内容
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# datetime 用于日期处理
import datetime
# openpyxl pathlib用于读取脚本同级/任意位置的excel文件,文件中维护部门人员信息
from openpyxl import load_workbook
import pathlib
# mysql 连接工具,邮件中的工作内容数据统计来自于数据库,查询并生成
import pymysql
步骤1:连接数据库
def query(db_host, db_port, db_user, db_passwd, db_db, sql, args):
conn = pymysql.connect(host=db_host, port=db_port, user=db_user, passwd=db_passwd, db=db_db)
cur = conn.cursor()
cur.execute(sql,args)
results = cur.fetchall()
rtnResults = results
# for row in results:
# print(row)
conn.commit()
cur.close()
conn.close()
return rtnResults
步骤2:读取excel文件中的部门人员信息
# 读取外挂文件中的收件人信息
def find_recivers():
cur_path = pathlib.Path(__file__).absolute()
excel_path = cur_path.parent/"recivers_private.xlsx"
wb = load_workbook(excel_path)
sheet = wb["Sheet1"]
# 获取表单中所有的数据 -- 转化为列表
recivers = list(sheet.values)
reciver_list = []
for reciver in recivers:
reciver_list.append(reciver[0])
return reciver_list
步骤3:拼接HTML格式内容
标题部分:
introHtml = \
"""
<H3>各位领导同事:</H3>
<H4> 本报告旨在概述过去一周JIRA(BSPXM、BSPCP)的质量状况,为领导决策、团队改进提供数据支撑。以下是上周({from_data}-{to_data})情况:</H4>
""".format(from_data=lastWeekStartDayStr,to_data=lastWeekEndDayStr)
表格设计:
# 表头格式
over_view_html = \
"""
<div class="table">
<div class="row-dark-title">
<div class="cell cell-width60p">模块</div>
<div class="cell cell-width60p">1周内新增数量</div>
<div class="cell cell-width60p">1周内解决数量</div>
<div class="cell cell-width60p">当前待解决数量</div>
<div class="cell cell-width60p">即将超期问题数量</div>
<div class="cell cell-width60p">已超期问题数量</div>
<div class="cell cell-width60p">2周内未解决问题数量</div>
<div class="cell cell-width60p">4周内未解决问题数量</div>
<div class="cell cell-width90p">1周内新增问题-期望0~2周内解决数量</div>
<div class="cell cell-width90p">1周内新增问题-期望0~4周内解决数量</div>
</div>
<!--正文内容-->
{df_html}
</div>
"""
其中的{df_html}为要拼接的数据部分,即表格内容
正文内容的拼接方式如下:
i = 0
trHtml = ''
for over_view_item in over_view_list_1_1:
# 斑马线样式
if i % 2 == 0:
trHtml += '<div class="row-light">'
else:
trHtml += '<div class="row-dark">'
# 模块
trHtml += '<div class="cell cell-width60p">'
trHtml += over_view_item[0]
trHtml += over_view_item[1]
trHtml += '</div>'
# 本周新增数量
trHtml += '<div class="cell cell-width60p">'
trHtml += str(over_view_item[2])
trHtml += '</div>'
...省略...
拼接:
# 拼接描述信息title
tt = '<br><div style="margin-top:18px;"><H3>总体情况:</H3></div>'
over_view_html = tt + over_view_html.format(df_html=trHtml)
其他部分也如此构建HTML格式代码即可,最后进行总封装:
# 拼接最后的结果 模块 项目 低级缺陷 严重缺陷 工作统计 链接信息
html_msg = "<html>" + head + "<body>" + introHtml + over_view_html + \
bspcp_xq_overview_html+ bspcp_qx_overview_html + \
bspxm_xq_overview_html + bspxm_qx_overview_html + \
bsp_djqx_overview_html + bsp_yzcd_overview_html + gztj_overview_html + \
link_html + \
"</body>" + "</html>"
步骤4:发送邮件
_user = '你的邮箱地址'
_pwd = '不是登录密码!而是SMTP密码,可自行百度如何开启并获取该密码'
# 收件人,find_recivers是我自定义的方法,结果是一个列表['aaa@aaa.com.cn','bbb@aaa.com.cn']
_toList = find_recivers()
# 抄送人
_toCcList = []
_toAddrs = _toList + _toCcList
# 标准代码,不需要改动
msg = MIMEMultipart()
mailSubject = '政府统计产品线内部JIRA' + lastWeekStartDayStr + '-' + lastWeekEndDayStr + '周报'
msg["Subject"] = mailSubject
msg["From"] = _user
msg["To"] = ",".join(_toList)
msg["Cc"] = ",".join(_toCcList)
part = MIMEText(html_msg, 'html', 'utf-8')
msg.attach(part)
s = smtplib.SMTP_SSL("smtp.jiuqi.com.cn", 465)
s.login(_user, _pwd)
s.sendmail(_user, _toAddrs, msg.as_string())
s.close()
print('发送成功')
至此完成了脚本的编写,执行脚本即可发送。
2. 设置时间按时发送
那么如何实现每周的按时发送
实现方式是,再写一个脚本一直运行,每周执行一次上面的脚本即可
python脚本
import subprocess
import sys
import schedule
import time
def run_scripts():
# 内部周报脚本
script1 = "./jira_private.py"
# 外部周报脚本
script2 = "./jira_public.py"
process1 = subprocess.Popen([sys.executable, script1])
process2 = subprocess.Popen([sys.executable, script2])
process1.wait()
process2.wait()
print("内部、外部JIRA周报脚本执行完毕")
# 每周一 6:30 执行
schedule.every().monday.at("06:30").do(run_scripts)
print("调度已启动,等待执行...")
while True:
schedule.run_pending()
time.sleep(3600) # 每小时检查一次
可执行文件run.sh
如果要放到Linux系统中做成一个可执行脚本文件:run.sh,那么可以编写以下代码:
#!/bin/bash
# 定义Python脚本的路径,如果不在同一目录下,需要指定完整路径
python_script="./jira_pipline.py"
# 检查Python命令是否存在
if ! command -v python3 &> /dev/null; then
echo "Python 3 is not installed. Please install it to proceed."
exit 1
fi
# 使用Python 3运行指定的脚本
python3 "$python_script"
tail -f /etc/hosts