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的Flask框架实现视频的流媒体传输
Mar 31 Python
深入解析Python中的集合类型操作符
Aug 19 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
教你怎么用Python操作MySql数据库
May 31 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
php 远程关机操作的代码
2008/12/05 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
django实现用户注册实例讲解
2019/10/30 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
python实现人像动漫化的示例代码
2020/05/17 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
应届毕业生求职自荐书
2014/01/03 职场文书
应届生自荐书
2014/06/23 职场文书
英文产品推荐信
2015/03/27 职场文书
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android
公历12个月名称的由来
2022/04/12 杂记