python脚本实现每周邮件按时发送

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>&nbsp;&nbsp;&nbsp;&nbsp;本报告旨在概述过去一周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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值