ETL过程跑完后,使用python发送邮件
目标库中,如果有行数为0的表,使用python发送邮件
# -*- coding:utf-8 -*-
# Author: zjc
# Description:send monitor info to someone.
# Date: 20170718 import contextlib
import pymysql
import smtplib from email.mime.text import MIMEText # 监控信息变量
TABLE_SCHEMA_LIST = ('db-name1', 'db-name2')
COLUMN_LIST = "table_schema,table_name,table_type,table_rows,table_comment" # 邮箱信息变量
MAIL_HOST = "smtp.xxxxx.com" # set you mail host
#定义成列表,实现全局变量功能
MAIL_SUBJECT = ["XX - MONITOR "]
MAIL_SENDER_NAME = "1234567@qq.com"
MAIL_SENDER_PASSWORD = "******"
MAIL_RECEIVERS = ["asdfghj@XXX.com","eqerqreq@163.com"]
MAIL_MESSAGE_BEGIN = """
<p>ETL结果信息</p>
<table border="1">
<tr>
<th>table_schema</th>
<th>table_name</th>
<th>table_rows</th>
<th>table_comment</th>
</tr>
"""
MAIL_MESSAGE_END = """
</table>
""" # 邮局发送函数
def sendMailTo(message):
msg = MIMEText(message, 'html', 'utf-8')
msg['Subject'] = MAIL_SUBJECT[0]
try:
server = smtplib.SMTP()
server.connect(MAIL_HOST)
server.login(MAIL_SENDER_NAME, MAIL_SENDER_PASSWORD)
server.sendmail(MAIL_SENDER_NAME, MAIL_RECEIVERS, msg.as_string())
server.close()
#print("邮件发送成功")
return True
except smtplib.SMTPException:
#print("Error: 无法发送邮件")
raise # 定义数据库连接,上下文管理器,连接后自动关闭连接
@contextlib.contextmanager
def mysql(host='10.0.8.*', user='', password='*****',
db='', port=3306, charset='utf8mb4'):
conn = pymysql.connect(host=host, port=port, user=user, passwd=password, db=db, charset=charset)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
try:
yield cursor
finally:
conn.commit()
cursor.close()
conn.close() # 查询 MySql 元数据信息
def query_schema_table_info():
resultlist = []
# Connect to the database
with mysql() as cursor:
# Read a single record
sql = "select "+ COLUMN_LIST + " FROM information_schema.TABLES " \
"WHERE TABLE_SCHEMA IN "+str(TABLE_SCHEMA_LIST)
#print(sql)
cursor.execute(sql)
for row in cursor.fetchall():
resultlist.append(row)
return resultlist # 根据查询结果,判断数据抽取是否正常
def deal():
mess = ""
zero_table_count = 0
result_list = query_schema_table_info()
for r in result_list:
# 总体情况
if r["table_rows"] == 0:
mess += "<tr bgcolor='red''>" \
+ " <td>" + r["table_schema"] + "</td>" \
+ " <td>" + r["table_name"] + "</td>" \
+ " <td>" + str(r["table_rows"]) + "</td>" \
+ " <td>" + r["table_comment"] + "</td>" \
+ " </tr>"
else:
mess += "<tr>" \
+ " <td>" + r["table_schema"] + "</td>" \
+ " <td>" + r["table_name"] + "</td>" \
+ " <td>" + str(r["table_rows"]) + "</td>" \
+ " <td>" + r["table_comment"] + "</td>" \
+ " </tr>" if r["table_rows"] == 0:
zero_table_count += 1 # 如果多于0个表是空的,则表示数据出问题了
if zero_table_count > 0:
MAIL_SUBJECT[0] = " - MONITOR 发生错误"
#print(mess)
#print(MAIL_SUBJECT[0])
return mess # print(query_schema_table_info())
if __name__ == '__main__':
message = MAIL_MESSAGE_BEGIN + deal() + MAIL_MESSAGE_END
sendMailTo(message)
===================
放到到服务器运行可能错误:
报错一:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
1、原因
因为默认情况下,Python采用的是ascii编码方式,如下所示:
python -c "import sys; print sys.getdefaultencoding()" ascii
而Python在进行编码方式之间的转换时,会将 unicode 作为“中间编码”,但 unicode 最大只有 128 那么长,所以这里当尝试将 ascii 编码字符串转换成"中间编码" unicode 时由于超出了其范围,就报出了如上错误。
2、解决办法
1)第一种:这里我们将Python的默认编码方式修改为utf-8,就可以规避上述问题的发生,具体方式,我们在Python文件的前面加上如下代码:
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
reload(sys)
sys.setdefaultencoding(defaultencoding)
2)第二种:我们在/usr/lib/python2.7/site-packages/目录下添加一个sitecustomize.py文件,内容如下:
import sys sys.setdefaultencoding('utf-8')
ETL过程跑完后,使用python发送邮件的更多相关文章
- 解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫
Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫 问题:scrapy-redis框架中,reids存储的xxx:requests已经爬取完毕,但程序仍然一直运行,如何自动 ...
- Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫
首先解决爬虫等待,不被关闭的问题: 1.scrapy内部的信号系统会在爬虫耗尽内部队列中的request时,就会触发spider_idle信号. 2.爬虫的信号管理器收到spider_idle信号后, ...
- python 发送邮件例子
想到用python发送邮件 主要是服务器 有时候会产生coredump文件 ,然后因为脚本重启原因,服务器coredump产生后会重启 但是没有主动通知开发人员 想了下可以写个脚本一旦产生cored ...
- 从工厂流水线小妹到Google上班程序媛,看完后,我跪服了!
阅读本文大概需要 10.2 分钟. 文作者:Ling Sun 原文链接:https://www.zhihu.com/question/68154951/answer/546265013 我家境很不好, ...
- python发送邮件及附件
今天给大伙说说python发送邮件,官方的多余的话自己去百度好了,还有一大堆文档说实话不到万不得已的时候一般人都不会去看,回归主题: 本人是mac如果没有按照依赖模块的请按照下面的截图安装 导入模块如 ...
- 解读Python发送邮件
解读Python发送邮件 Python发送邮件需要smtplib和email两个模块.也正是由于我们在实际工作中可以导入这些模块,才使得处理工作中的任务变得更加的简单.今天,就来好好学习一下使用Pyt ...
- iPhone不为人知的功能常用技巧,看完后才发现很多用iPhone的人实在是愧对乔布斯! - imsoft.cnblogs
很多人花了四五千买部苹果,结果只用到四五百块钱的普通手机功能. iPhone不为人知的功能,常用技巧: 网上搜集整理的iPhone快捷键操作,虽然表面上iPhone按键只有一个HOME键,大部分操作都 ...
- 利用python发送邮件
找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...
- ETL过程
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的过程.ETL一词较常用在数 ...
随机推荐
- 全民抵制“辱华”品牌秀,D&G神回复:呵呵~ 那不是我!
### 补发一下,前写天写的: 就在今天下午,有网友爆出知名品牌 Dolce&Gabbana(杜嘉班纳)的设计师兼创始人Stefano Gabbana在ins上公然发表辱华言论. 下面截图 可 ...
- 黏包现象之TCP
老师的博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5 server #_*_coding:gbk*_ from socket ...
- bibli直播弹幕实时爬取
1 分析数据来源 在不知道弹幕信息在哪里的时候,只能去all里面查看每一个相应的信息,看信息是否含有弹幕信息 在知道弹幕信息文件的时候,我们可以直接用全局文件搜索,定位到弹幕数据文件.操作如下图 2 ...
- c#语法学习
自动属性.隐试类型.命名参数和自动初始化器. note:这里说的这些,是语法糖.按照一定的格式写,部分代码编译器帮我们实现了, 1.自动属性:自动属性是非常有用的语法糖,帮我我们做了两件事:1.自动帮 ...
- DeveloperGuide Hive UDF
Creating Custom UDFs First, you need to create a new class that extends UDF, with one or more method ...
- Linux删除文件夹和修改文件名
rm [选项] 文件 -f, --force 强力删除,不要求确认 -i 每删除一个文件或进入一个子目录都要求确认 -I 在删除超过三个文件或者递归删除前要求确认 -r, -R 递归删除子目录 -d, ...
- day17-异常处理
今天的内容比较少,只是单独的异常处理 开始今日份整理 1.异常 定义:异常时错误发生的信号,一旦出错,并且程序没有处理这个错误,就会抛出异常,并且程序会运行中止 2.异常的分类 2.1语法错误:pyt ...
- 返回数组中指定的一列,将键值作为元素键名array_column
array_column() 函数 从记录集中取出 last_name 列: <?php // 表示由数据库返回的可能记录集的数组 $a = array( array( 'id' => 5 ...
- nginx上配置phpmyadmin
Nginx配置phpmyadmin流程如下: 一.准备软件和环境(这里我以ubuntu16.04为例) 1.安装php7.1 sudo LC_ALL=C.UTF- add-apt-repository ...
- .NET Core 开源工具 IPTools - 快速查询 IP 地理位置、经纬度信息
快速查询IP信息,支持国内和国外IP信息查询,支持查询经纬度,地理位置最高支持到城市. 1. IPTools.China 快速查询中国IP地址信息,包含国家.省份.城市.和网络运营商.非中国IP只支持 ...