初识python 之 smtplib 发送(dolphinscheduler任务监测)邮件
需求
监测dolphinscheduler调度系统,任务执行异常情况。如有异常,则发送邮件通知。
处理思路
因DS本身自带的邮件发送功能,不能正常发送邮件。
故而,通过查询DS源数据表,获取当前任务执行情况。将获取结果,使用python发送邮件。
通过shell脚本获取执行情况,并将结果保存到本地。
执行代码


- mysql -hip -P3306 -u用户 -p密码 -e"
- use dolphinscheduler;
- select a.name,
- a.state,
- a.submit_time,
- a.start_time,
- a.end_time,
- CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
- from t_ds_task_instance a,
- (
- select name,
- max(submit_time) submit_time
- from t_ds_task_instance
- group by name
- ) b
- where a.name=b.name
- and a.submit_time=b.submit_time
- and substr(a.start_time,1,10)='${deal_day}'
- and a.state not in(0,1,7)
- union all
- select a.name,
- a.state,
- a.submit_time,
- a.start_time,
- '-' end_time,
- CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
- from t_ds_task_instance a,
- (
- select name,
- max(submit_time) submit_time
- from t_ds_task_instance
- group by name
- ) b
- where a.name=b.name
- and a.submit_time=b.submit_time
- and substr(a.submit_time,1,10)='${deal_day}'
- and a.state in(1,10,11)
- and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
- " > rwjk.txt
登陆mysql数据库,并执行SQL,导出结果
python处理导出结果,并发送邮件


- # !/user/bin/env python
- # -*- coding: utf-8 -*-
- import smtplib
- from email.mime.text import MIMEText
- from email.header import Header
- def send_mail():
- # 第三方 SMTP 服务
- mail_host = "" # 设置服务器
- mail_user = "" # 用户名
- mail_pass = "" # 口令
- sender = '' # 发送邮件用户
- receivers = ['收件人1',
- '收件人2',
- '收件人3'
- ]
- msg_text = '邮件正文发送内容'
- mail_msg_list=['<p>你好,DS调度异常任务如下:</p>',
- '<table border="1" cellpadding="0" cellspacing="0" width="1000" style="border-collapse: collapse; style="text-align:center"">',
- '<tbody>',
- '<tr><th>任务</th><th>状态</th><th>提交时间</th><th>开始时间</th><th>结束时间</th><th>执行时长(s)</th></tr>'
- ]
- with open('/zhjs/work01/lizhenhua/rwjk/rwjk.txt', 'r') as f:
- s = f.readlines()
- for k,v in enumerate(s):
- s[k]=v.replace('\n','').split('\t') # 替换掉换行符、并转换为列表
- for i in range(len(s)):
- mail_msg_list.append('<tr>')
- for j in range(len(s[i])):
- if i>=1:
- s[i][1] = s[i][1].replace('0','提交成功')
- s[i][1] = s[i][1].replace('1', '正在运行')
- s[i][1] = s[i][1].replace('2', '准备暂停')
- s[i][1] = s[i][1].replace('3', '暂停')
- s[i][1] = s[i][1].replace('4', '准备停止')
- s[i][1] = s[i][1].replace('5', '停止')
- s[i][1] = s[i][1].replace('6', '失败')
- s[i][1] = s[i][1].replace('7', '成功')
- s[i][1] = s[i][1].replace('8', '需要容错')
- s[i][1] = s[i][1].replace('9', 'kill')
- s[i][1] = s[i][1].replace('10', '等待线程')
- s[i][1] = s[i][1].replace('11', '等待依赖完成')
- mail_msg_list.append('<td>{}</td>'.format(s[i][j]))
- mail_msg_list.append('</tr>')
- # 结尾标识
- mail_msg_list.append('</tbody>')
- mail_msg_list.append('</table>')
- mail_msg=''.join(mail_msg_list) # 列表转为字符串HTML
- message = MIMEText(mail_msg, 'html', 'utf-8')
- message['From'] = Header("任务监测", 'utf-8')
- message['To'] = ','.join(receivers)
- subject = 'DS调度异常任务监控'
- message['Subject'] = Header(subject, 'utf-8')
- try:
- smtpObj = smtplib.SMTP()
- smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
- smtpObj.login(mail_user, mail_pass) # 登陆
- smtpObj.sendmail(sender, receivers, message.as_string()) # 发送
- print('邮件发送成功')
- except smtplib.SMTPException:
- print('Error: 无法发送邮件')
- if __name__ == '__main__':
- send_mail()
Send_Email.py
整合以上两个为一个shell脚本


- #!/bin/bash
- if [ ${#} -ne 1 ]
- then
- deal_day=$(date +"%Y-%m-%d")
- else
- deal_day=$1
- fi
- echo ${day}
- mysql -hip -P3306 -u用户 -p密码 -e"
- use dolphinscheduler;
- select a.name,
- a.state,
- a.submit_time,
- a.start_time,
- a.end_time,
- CONCAT(TIMESTAMPDIFF(SECOND, a.start_time,a.end_time),'(s)') dur
- from t_ds_task_instance a,
- (
- select name,
- max(submit_time) submit_time
- from t_ds_task_instance
- group by name
- ) b
- where a.name=b.name
- and a.submit_time=b.submit_time
- and substr(a.start_time,1,10)='${deal_day}'
- and a.state not in(0,1,7)
- union all
- select a.name,
- a.state,
- a.submit_time,
- a.start_time,
- '-' end_time,
- CONCAT(cast(TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)/60/60 as decimal(10,2)),'(h)') dur
- from t_ds_task_instance a,
- (
- select name,
- max(submit_time) submit_time
- from t_ds_task_instance
- group by name
- ) b
- where a.name=b.name
- and a.submit_time=b.submit_time
- and substr(a.submit_time,1,10)='${deal_day}'
- and a.state in(1,10,11)
- and TIMESTAMPDIFF(SECOND, a.start_time,current_timestamp)>7200;
- " > rwjk.txt
- # 发送邮件
- n=`cat rwjk.txt|wc -l`
- if [ $n -ge 2 ]
- then
- python rwjk_mail.py # 执行python,发送邮件
- else
- echo "无异常任务"
- fi
rwjk.sh
执行结果
初识python 之 smtplib 发送(dolphinscheduler任务监测)邮件的更多相关文章
- Python+request+ smtplib 测试结果html报告邮件发送(上)《五》
此方法通用适合所有邮箱的使用,只需注意几个点,如下: QQ邮箱.其他非QQ邮箱的写法,区别点如下: #--------------------------使用腾讯企业邮箱作为发件人的操作如下----- ...
- web端自动化——Python的smtplib发送电子邮件
SMTP (Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. Python的smtplib模块提 ...
- 接口测试基础——第3篇smtplib发送带图片的邮件
smtplib发送邮件最后一篇,发送带图片的邮件: 大家可以去廖雪峰的网站看一下,下面的代码就是我跟着博客写的,哈哈,大家即使不明白为什么,也要多写两遍,记在心里,如果有不明白的地方可以留言,船长会第 ...
- Python+request+ smtplib 测试结果html报告邮件发送(下)《六》
目录结构如下: 1.cfg.ini的配置信息写法如下: [email] ;--------------------------使用腾讯企业邮箱作为发件人的操作如下------------------- ...
- 接口测试基础——第2篇smtplib发送带附件的邮件
我先给大家补充一个用QQ发送纯文本电子邮件的代码,用QQ的朋友可以参考一下: # coding=utf-8 import smtplib from email.mime.text import MIM ...
- Python模块探秘 Smtplib发送带有各种附件的邮件
这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...
- 利用Python+163邮箱授权码发送带附件的邮件
背景 前段时间写了个自动爬虫的脚本,定时在阿里云服务器上执行,会从某个网站上爬取链接保存到txt文本中,但是脚本不够完善,我需要爬虫完毕之后通过邮件把附件给我发送过来,之前写过一个<利用Pyth ...
- python利用smtplib和MIMETYPE发送邮件
# -*- coding:utf- -*- import smtplib from email.mime.text import MIMEText sender = '你的发送邮件' my_pass= ...
- python使用smtplib发送邮件
python要实现发送邮件的功能,需要使用smtplib库. 1. 过程大致如下: 1. 建立和SMTP邮件服务器的连接 # 默认端口25 smtp = smtplib.SMTP(host, port ...
随机推荐
- Thymeleaf标准表达式
Thymeleaf的官网为: http://www.thymeleaf.org/ 一.变量表达式${-} 使用${-}括起来的表达式,称为变量表达式.该表达式的内容会显示在HTML标签体文本处. 该表 ...
- 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用? 随着现在后端编程标 ...
- Springboot 入门及Demo
一:SpringBoot入门1.1:SpringBoot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的 ...
- Tableau如何使用 度量值和度量名称
一.把子类别拖拽至列 二.度量值拖拽至行 三.度量名称拖拽至筛选器,右键-编辑筛选器-选择销售额和利润 四.度量名称拖拽是标记选择颜色-其它细节调整-最终结果如下所示
- Redis入门及常用命令学习
Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持 ...
- 使用.NET 6开发TodoList应用(2)——项目结构搭建
为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...
- Google Earth Engine 批量点击RUN任务,批量取消正在上传的任务
本文内容参考自: https://blog.csdn.net/qq_21567935/article/details/89061114 https://blog.csdn.net/qq_2156793 ...
- CF151B Phone Numbers 题解
Content 在一座城市中,每个人的电话号码都是由六位整数组成的,例如 11-45-14. 现在有 \(n\) 个人,第 \(i\) 个人有 \(s_i\) 个人的电话号码.已知: 出租车司机的电话 ...
- java 图形化工具Swing 基本使用
Swing介绍: 使用Swing开发图形界面比AWT更加优秀,因为Swing是一种轻量级组件,它采用100% Java实现,不再依赖于本地平台的图形界面,所以可以在所有平台上保持相同的运行效果,对跨平 ...
- 【LeetCode】1060. Missing Element in Sorted Array 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...