监控告警一般使用邮件、短信、微信、钉钉接收告警,邮件作为免费方案一直不受重视。如果企业内部有邮件系统,使用 SMTP 发送告警邮件是非常方便的。
首先配置好手机的邮件客户端,比如网易的邮件大师,或激活邮件系统的 POP3/SMTP/IMAP 服务,这样就可以使用第三方的邮件客户端了。

先发送一封测试邮件;
import smtplibfrom email.mime.text import MIMEText# 邮件内容sender_email = "s1@example.com" # 你的邮箱地址password = "password" # 你的邮箱密码或应用专用密码receiver_email = "r1@example.com" # 接收者的邮箱地址msg = MIMEText("这是邮件的内容")msg['Subject'] = "测试邮件"msg['From'] = sender_emailmsg['To'] = receiver_email# 连接到SMTP服务器smtp_server = '192.168.1.1' # 替换为你的SMTP服务器地址smtp_port = 25 # 默认的SMTP端口with smtplib.SMTP(smtp_server, smtp_port) as server:#server.starttls() # 启用TLS加密server.login(sender_email, password)server.sendmail(sender_email, receiver_email, msg.as_string())

测试邮件发送没有问题,可以再试试 Markdown 文本格式:
import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimport mistunefrom pprint import pprintimport sys# 发件人邮箱账号email = 's1@example.com'password = 'password'# 收件人邮箱地址to_email = 't1@example.com'# Markdown文本markdown_text = """# H1## H2### H3#### H4##### H5###### H6Alt-H1======Alt-H2------**粗体文本***斜体文本*无序列表- 项目一- 项目二- 项目三有序列表1. 项目一2. 项目二3. 项目三[链接风格1](https://www.google.com)[链接风格2](https://www.google.com "Google's Homepage")[链接风格3][参考][链接风格4 - 本地文件](../blob/master/LICENSE)[链接风格5][1][链接风格6]参考链接放在最后[参考]: https://www.google.com[1]: https://www.google.com[链接风格6]: https://www.google.comInline-style:Reference-style:![alt text][logo][logo]: https://raw.githubusercontent.com/hyang0/ip_notes/main/img/IP.ico "Logo Title Text 2""""# 将Markdown转换为HTMLhtml_text = mistune.markdown(markdown_text)pprint(html_text)# sys.exit()# 创建消息对象msg = MIMEMultipart()msg['From'] = emailmsg['To'] = to_emailmsg['Subject'] = 'Markdown邮件'# 邮件正文#body = '这是一封通过Python SMTP库发送的测试邮件。'#msg.attach(MIMEText(body, 'plain'))# HTML邮件正文msg.attach(MIMEText(html_text, 'html'))# 连接到SMTP服务器with smtplib.SMTP('192.168.1.1', 25) as smtp:# smtp.starttls() # 启用TLS加密smtp.login(email, password) # 登录到你的邮箱账号smtp.send_message(msg) # 发送邮件

测试发现普通 Markdown 文本转换成 HTML 没有问题,但表格转换不太正常。最终表空间需要使用表格展现,表格的 markdown 转 html 实现不了,只能手写 html 样式。
代码如下:
import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom pprint import pprintimport cx_Oracleimport sys# 发件人邮箱账号email = 'hyang0@example.com'password = 'password'# 收件人邮箱地址to_email = 't1@example.com'# 设置收件人邮箱列表receivers = ["r1@example.com", "r2@example.com"]# 设置抄送人邮箱列表#cc = ["cc1@example.com", "cc2@example.com"]# 创建消息对象msg = MIMEMultipart()msg['From'] = emailmsg['To'] = ', '.join(receivers)# msg['Cc'] = ', '.join(cc)msg['Subject'] = '【HIS】表空间监控'def init_oracle(oci_path):'''初始化 Oracle 驱动'''try:if sys.platform.startswith("darwin"):# lib_dir = os.path.join(os.environ.get("HOME"), "Downloads",# "instantclient_19_8")lib_dir = oci_pathcx_Oracle.init_oracle_client(lib_dir=lib_dir)elif sys.platform.startswith("win32"):lib_dir=oci_pathcx_Oracle.init_oracle_client(lib_dir=lib_dir)except Exception as err:print("Whoops!")print(err)sys.exit(1)def table_space():''''返回SQL查询结果'''connection = cx_Oracle.connect(user="test", password="password",dsn="192.168.1.1/orcl")cursor = connection.cursor()cursor.execute("""select t.* from (select UPPER(F.TABLESPACE_NAME) as "表空间名称",ROUND(D.AVAILB_BYTES, 2) as "表空间大小(G)",ROUND(D.MAX_BYTES, 2) as "最终表空间大小(G)",ROUND((D.AVAILB_BYTES - F.USED_BYTES), 2) as "已使用空间(G)",TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) D.AVAILB_BYTES * 100,2),'999.99') as "使用比",TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) D.MAX_BYTES * 100, 2),'999.99') as "最终使用比",ROUND(F.USED_BYTES, 6) as "空闲空间(G)",ROUND(D.MAX_BYTES - D.AVAILB_BYTES, 2) as "最终空闲可用空间(G)"from (select TABLESPACE_NAME,ROUND(sum(BYTES) (1024 * 1024 * 1024), 6) USED_BYTES,ROUND(max(BYTES) (1024 * 1024 * 1024), 6) MAX_BYTESfrom SYS.DBA_FREE_SPACEgroup by TABLESPACE_NAME) F,(select DD.TABLESPACE_NAME,ROUND(sum(DD.BYTES) (1024 * 1024 * 1024), 6) AVAILB_BYTES,ROUND(sum(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))(1024 * 1024 * 1024),6) MAX_BYTESfrom SYS.DBA_DATA_FILES DDgroup by DD.TABLESPACE_NAME) Dwhere D.TABLESPACE_NAME = F.TABLESPACE_NAMEorder by 6 desc) t where rownum <= 5""",)r = []for i in cursor:r.append(i)connection.close()if len(r) == 0:sys.exit()return rcss = '''<style>table {border-collapse: collapse;width: 100%;margin: 20px 0;}th,td {padding: 8px;text-align: left;border: 1px solid #ddd;}th {background-color: #f2f2f2;color: #444;}tr:nth-child(odd) {background-color: #f9f9f9;}</style>'''html_text = '<h3>表空间使用率(Top5)</h3>'html_text += '<p></p>'html_text += '''<table><thead><tr><th>表空间</th><th>已使用</th><th>使用率</th></tr></thead><tbody>'''init_oracle(oci_path=r"D:\app\instantclient-basic-windows.x64-11.2.0.4.0\instantclient_11_2")r = table_space()for record in r:ts = record[0]size_used = record[3]usage = record[5]html_text += '<tr>\n'html_text += '<td>' + ts + '</td>\n'html_text += '<td>' + str(size_used) + 'G</td>\n'html_text += '<td>' + usage.strip() + '%</td>\n'html_text += '</tr>\n'html_text += '''</tbody></table>'''#print(html_text)#sys.exit()# 邮件正文#body = '这是一封通过Python SMTP库发送的测试邮件。'#msg.attach(MIMEText(body, 'plain'))# HTML邮件正文msg.attach(MIMEText(css+html_text, 'html'))# 连接到SMTP服务器with smtplib.SMTP('192.168.1.1', 25) as smtp:# smtp.starttls() # 启用TLS加密smtp.login(email, password) # 登录到你的邮箱账号smtp.send_message(msg) # 发送邮件
最终效果如下:

其中用到了第三方模块 cx-Oracle,安装使用方法之前介绍过:
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




