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 = "[email protected]"
MAIL_SENDER_PASSWORD = "******"
MAIL_RECEIVERS = ["[email protected]","[email protected]"]
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‘)

原文地址:https://www.cnblogs.com/zjc10203/p/9080176.html

时间: 2024-10-11 06:53:43

ETL过程跑完后,使用python发送邮件的相关文章

解决 Scrapy-Redis 空跑问题,链接跑完后自动关闭爬虫

Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫 问题:scrapy-redis框架中,reids存储的xxx:requests已经爬取完毕,但程序仍然一直运行,如何自动停止程序,结束空跑. 分布式扩展: 我们知道 scrapy 默认是单机运行的,那么scrapy-redis是如何把它变成可以多台机器协作的呢? 首先解决爬虫等待,不被关闭的问题: 1.scrapy内部的信号系统会在爬虫耗尽内部队列中的request时,就会触发spider_idle信号. 2.爬虫的

【Robotframework】脚本跑完后自动发送邮件

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText import email.MIMEMultipart from email.header import Header import os import mimetypes def send_email(file_names=[]): # 第三方 SMTP 服务 receivers= ['[email prote

Scrapy-Redis 空跑问题,redis_key链接跑完后,自动关闭爬虫

首先解决爬虫等待,不被关闭的问题: 1.scrapy内部的信号系统会在爬虫耗尽内部队列中的request时,就会触发spider_idle信号. 2.爬虫的信号管理器收到spider_idle信号后,将调用注册spider_idle信号的处理器进行处理. 3.当该信号的所有处理器(handler)被调用后,如果spider仍然保持空闲状态, 引擎将会关闭该spider. scrapy-redis 中的解决方案 在信号管理器上注册一个对应在spider_idle信号下的spider_idle()方

没有基础该怎么学Python 学完后好不好找工作

没有基础该怎么学Python?学完后好不好找工作?Python是人工智能时代最佳的编程语言,凭借高可读性以及高开发效率的优势,Python受到各大开发者的欢迎,同时在运维领域也被大量运用到自动化运维场景中.且看小编的分析. 入门简单是Python的主要特点,这让很多人纠结究竟是自学还是参加专业学习.事实上,这个问题很简单,你只需要关注两点:你有没有编程基础.你能不能确保学习效率. 对于没有编程基础的人来说,他们连最基本的代码都不了解,完全摸不着头脑也找不到学习规律,参加专业学习无疑是学习效果最好

python发送邮件(一)

最近设计了一个小的应用程序,主要是根据文件中邮件地址发送一份excel中内容,并且在接受方收到邮件都是以网页的格式呈现的. 下面主要是对python发送邮件涉及到的部分知识点做个总结 一.先介绍一下Smtp协议和POP3协议 SMTP (Simple Mail Transfer Protocol) http://www.rfc-editor.org/info/rfc821    RFC821文档详细描述了这个协议信息: 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用S

第18课 python 发送邮件

到昨天课程已经完结.但是你是不是你还是觉得没有成就感....答案肯定的. 作为一名邮件管理员,也是一件有意思的事情..... 我触发学习Py的,主要也是用于群发邮件,解决市场管理部总是找我群发邮件..... 那时候我使用的是shell......但是还是要要入系统搞,能不能我给工具,你们自己发送.......... 所以还是很苦逼,我们 搜索python 发送邮件,你会发现2个模块smtplib,email 1. smtplib是用来发送邮件用的;( 跟服务器连接,你才能有机会发送邮件吧) 2.

python 发送邮件例子

想到用python发送邮件 主要是服务器 有时候会产生coredump文件  ,然后因为脚本重启原因,服务器coredump产生后会重启 但是没有主动通知开发人员 想了下可以写个脚本一旦产生coredump文件就可以发送邮件给开发者让其立马知道 下面只介绍简单的发送脚本 如果需要在生产环境用起来  还需要按要求修改脚本 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连

Office365与本地Exchange混合部署后无法互相发送邮件及解决方案

Office365与本地Exchange混合部署后无法互相发送邮件及解决方案 我们前面的文章介绍了Office365与本地Exchange混合部署及Office365与本地Exchange互相迁移用户的配置介绍,今天就介绍Office365与本地的Exchange邮箱用户实现邮件互相收发介绍,说到Online与本地的Exchange邮件互发,我们都知道,在配置Online与本地Exchange互发及添加本地域的时候,验证本地域,验证的时候,需要在本地的DNS中将MX记录指向Online,只有这样

解读Python发送邮件

解读Python发送邮件 Python发送邮件需要smtplib和email两个模块.也正是由于我们在实际工作中可以导入这些模块,才使得处理工作中的任务变得更加的简单.今天,就来好好学习一下使用Python发送邮件吧. SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件. 1.邮件正文是文本的格式 1 # -*- codi