Python实现报警信息实时发送至邮箱功能(实例代码)


Posted in Python onNovember 11, 2019

Python实现报警信息实时发送至邮箱功能,具体内容如下所示:

程序设计

Python实现报警信息实时发送至邮箱功能(实例代码)

实现代码

cpu.py

# -*- coding: utf-8 -*-
import psutil
import time
from emailsender import txtMail
from log import myloggers
import gc
class mycpumonitor():
 # up是cpu监控的阈值,默认是90%
 def __init__(self, up=None):
  self.up = 90 if up is None else up
 def cpu_monitor(self):
  cpu_percent = psutil.cpu_percent()
  now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  if cpu_percent > self.up:
   filename = 'cpu.txt'
   with open(filename, 'w') as f: # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
    f.write(str(now) + "CPU使用率超过" + str(self.up) + "!!!!.\n")
    f.write(str(now) + "当前CPU使用率" + str(cpu_percent) + "!!!\n")
   mail = txtMail()
   try:
    mail.txt_send_mail(filename="test.config", alarm=filename)
    temp_msg = "CPU超标,当前CPU使用率:" + str(cpu_percent)
    logger1 = myloggers(temp_msg)
    logger1.maillogging()
    del mail
    gc.collect()
   except:
    print("文本文件格式不正确")

mem.py

# -*- coding: utf-8 -*-
import psutil
import time
from emailsender import txtMail
from log import myloggers
import gc
class mymemmonitor():
 # up是内存监控的阈值,默认是90%
 def __init__(self, up=None):
  self.up = 90 if up is None else up
 def mem_monitor(self):
  mem_percent = psutil.virtual_memory()[2]
  now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  if mem_percent > self.up:
   filename = 'mem.txt'
   with open(filename, 'w') as f: # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
    f.write(str(now) + "内存使用率超过" + str(self.up) + "!!!!.\n")
    f.write(str(now) + "当前内存使用率" + str(mem_percent) + "!!!\n")
   mail = txtMail()
   try:
    mail.txt_send_mail(filename="test.config", alarm=filename)
    temp_msg = "内存超标,当前内存使用率:" + str(mem_percent)
    logger1 = myloggers(temp_msg)
    logger1.maillogging()
    del mail
    gc.collect()
   except:
    print("文本文件格式不正确")

watchpc.py

# -*- coding: utf-8 -*-
# Author: WuYang
# Date-modified: 07Nov2019
# Function: send alarm data through SMTP protocol
# Architecture: cpu.py, mem.py, etc. is to monitor performance of server
# Lang: Python3.7
# Env: CentOS7/WindowServer 2012R2
import time
from cpu import mycpumonitor
from mem import mymemmonitor
import gc
if __name__ == "__main__":
 while True:
  memObj = mymemmonitor(50)
  memObj.mem_monitor()
  cpuObj = mycpumonitor(10)
  cpuObj.cpu_monitor()
  del memObj
  gc.collect()
  time.sleep(10)

emailsender.py

#-*- coding: utf-8 -*-
import smtplib
import chardet
import codecs
import os
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
# 第三方SMTP服务
class txtMail(object):
 def __init__(self, host=None, auth_user=None, auth_password=None):
  self.host = "smtp.163.com" if host is None else host # 设置发送邮件服务使用专用报警账户的用户名
  self.auth_user = "xxxxxx@163.com" if auth_user is None else auth_user # 上线时使用专用报警账户的用户名
  self.auth_password = (
   "xxxxxxxx" if auth_password is None else auth_password
  ) # 上线时使用专用报警账户的密码
  self.sender = "xxxxxxxx@163.com"
 def send_mail(self, subject, msg_str, recipient_list, attachment_list=None):
  message = MIMEMultipart()
  message["From"] = self.sender
  message["To"] = Header(";".join(recipient_list), "utf-8")
  message["Subject"] = Header(subject, "utf-8")
  message.attach(MIMEText(msg_str, "plain", "utf-8"))
  # 如果有附件,则添加附件
  if attachment_list:
   for att in attachment_list:
    attachment = MIMEText(open(att, "rb").read(), "base64", "utf-8")
    attachment["Content-Type"] = "application/octet-stream"
    # 这里filename可以任意写,写什么名字,邮件中显示什么名字
    filename = os.path.basename(att)
    attachment.add_header(
     "Content-Disposition",
     "attachment",
     filename=("utf-8", "", filename),
    )
    message.attach(attachment)
  smtpObj = smtplib.SMTP_SSL(self.host)
  smtpObj.connect(self.host, smtplib.SMTP_SSL_PORT)
  smtpObj.login(self.auth_user, self.auth_password)
  smtpObj.sendmail(self.sender, recipient_list, message.as_string())
  smtpObj.quit()
  print("邮件发送成功")
  print(attachment_list)
 def guess_chardet(self, filename):
  """
  :param filename: 传入一个文本文件
  :return: 返回文本文件的编码格式
  """
  encoding = None
  try:
   # 由于本需求所解析的文本文件都不大,可以一次性读入内存
   # 如果是大文件,则读取固定字节数
   raw = open(filename, "rb").read()
   if raw.startswith(codecs.BOM_UTF8): # 处理UTF-8 with BOM
    encoding = "utf-8-sig"
   else:
    result = chardet.detect(raw)
    encoding = result["encoding"]
  except:
   pass
  return encoding
 def txt_send_mail(self, filename, alarm):
  """
  :param filename:
  :return:
  将指定格式的txt文件发送至邮箱,txt文件样例如下
  # 收件人,逗号分隔
  # 附件,逗号分隔
  """
  with open(filename, encoding=self.guess_chardet(filename)) as f:
   lines = f.readlines()
  recipient_list = lines[0].strip().split(",")
  attachment_list = []
  for file in lines[-1].strip().split(","):
   if os.path.isfile(file):
    attachment_list.append(file)
  # 如果没有附件,则为None
  if attachment_list == []:
   attachment_list = None
  with open(alarm, encoding=self.guess_chardet(alarm)) as f1:
   lines1 = f1.readlines()
  subject = lines1[0].strip()
  msg_str = "".join(lines1[1:])
  self.send_mail(
   subject=subject,
   msg_str=msg_str,
   recipient_list=recipient_list,
   attachment_list=attachment_list,
  )

test.config

XXXXX@qq.com,XXXXX@163.com
libvirt.log,qemu.log

注意事项

需进入邮箱设置,开启POP3/SMTP/IMAP。

Python实现报警信息实时发送至邮箱功能(实例代码)

总结

以上所述是小编给大家介绍的Python实现报警信息实时发送至邮箱功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
闭包在python中的应用之translate和maketrans用法详解
Aug 27 Python
Python中字符编码简介、方法及使用建议
Jan 08 Python
python中self原理实例分析
Apr 30 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
彻底搞懂Python字符编码
Jan 23 Python
python实现朴素贝叶斯算法
Nov 19 Python
对python的输出和输出格式详解
Dec 08 Python
wxPython实现列表增删改查功能
Nov 19 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
Python实现打包成库供别的模块调用
Jul 13 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 #Python
Python序列化与反序列化pickle用法实例
Nov 11 #Python
详解Python可视化神器Yellowbrick使用
Nov 11 #Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 #Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 #Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 #Python
Python多继承以及MRO顺序的使用
Nov 11 #Python
You might like
用 php 编写的日历
2006/10/09 PHP
Email+URL的判断和自动转换函数
2006/10/09 PHP
刚才在简化php的库,结果发现很多东西
2006/12/31 PHP
php a simple smtp class
2007/11/26 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
laravel 5.3中自定义加密服务的方案详解
2017/05/09 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
python pymysql库的常用操作
2020/10/16 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
加拿大的标志性百货公司:Hudson’s Bay(哈得逊湾)
2019/09/03 全球购物
毕业生个人的求职信范文
2013/12/03 职场文书
劳资专员岗位职责
2013/12/27 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
班委竞选稿范文
2015/11/21 职场文书
nginx 配置缓存
2022/05/11 Servers
Redis基本数据类型List常用操作命令
2022/06/01 Redis