项目维护中服务会不定时的出现异常,好比50二、40四、101等等,当工做任务繁重时又不能实时监测,而linux的运维者,逃脱不了定时任务的命题,最经常使用和快捷简单的是crontab,在少许机器的状况下,crontab效率仍是比较高和比较便捷。但当机器越多、应用越多的状况下,继续使用crontab进行定时任务的管理配置,那严重影响工做效率。但crontab执行后结果如何若是不登陆服务器通常不能实施感知,此时咱们能够借助python的邮件机制进行实时通知也能够定时监测服务发出告警信息以便及时处理。html
SMTP (Simple Mail Transfer Protocol) 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。 SMTP协议的一个重要特色是它可以接力传送邮件。它工做在两种状况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另外一个服务器。python
POP3 (Post Office Protocol) & IMAP (Internet Message Access Protocol) POP协议和IMAP协议是用于邮件接收的最多见的两种协议。几乎全部的邮件客户端和服务器都支持这两种协议。 POP3协议为用户提供了一种简单、标准的方式来访问邮箱和获取电邮。使用POP3协议的电邮客户端一般的工做过程是:链接服务器、获取全部信息并保存在用户主机、从服务器删除这些消息而后断开链接。POP3协议的默认TCP端口号是110。 IMAP协议也提供了方便的邮件下载服务,让用户能进行离线阅读。使用IMAP协议的电邮客户端一般把信息保留在服务器上直到用户显式删除。这种特性使得多个客户端能够同时管理一个邮箱。IMAP协议提供了摘要浏览功能,可让用户在阅读完全部的邮件到达时间、主题、发件人、大小等信息后再决定是否下载。IMAP协议的默认TCP端口号是143。 邮件格式 (RFC 2822) 每封邮件都有两个部分:邮件头和邮件体,二者使用一个空行分隔。 邮件头每一个字段 (Field) 包括两部分:字段名和字段值,二者使用冒号分隔。有两个字段须要注意:From和Sender字段。From字段指明的是邮件的做者,Sender字段指明的是邮件的发送者。若是From字段包含多于一个的做者,必须指定Sender字段;若是From字段只有一个做者而且做者和发送者相同,那么不该该再使用Sender字段,不然From字段和Sender字段应该同时使用。 邮件体包含邮件的内容,它的类型由邮件头的Content-Type字段指明。RFC 2822定义的邮件格式中,邮件体只是单纯的ASCII编码的字符序列。 MIME (Multipurpose Internet Mail Extensions) (RFC 1341) MIME扩展邮件的格式,用以支持非ASCII编码的文本、非文本附件以及包含多个部分 (multi-part) 的邮件体等。linux
Python smtplib模块 该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听器守护程序向任何互联网机器发送邮件。 用来建立一个SMTP对象,稍后将演示如何用它来发送电子邮件api
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
复制代码
这里是上面语法的参数细节bash
- sender - 具备发件人地址的字符串。
- receivers - 字符串列表,每一个收件人一个。
- message - 做为格式如在各类RFC中指定的字符串。
Python email模块服务器
- class email.message.Message getitem,__setitem__实现obj[key]形式的访问。 Msg.attach(playload): 向当前Msg添加playload。 Msg.set_playload(playload): 把整个Msg对象的邮件体设成playload。 Msg.add_header(_name, _value, **_params): 添加邮件头字段。
- class email.mime.base.MIMEBase(_maintype, _subtype, **_params) 全部MIME类的基类,是email.message.Message类的子类。
- class email.mime.multipart.MIMEMultipart() 在3.0版本的email模块 (Python 2.3-Python 2.5) 中,这个类位于 email.MIMEMultipart.MIMEMultipart。 这个类是MIMEBase的直接子类,用来生成包含多个部分的邮件体的MIME对象。
- class email.mime.text.MIMEText(_text) 使用字符串_text来生成MIME对象的主体文本。
# -*- coding=utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
#163smtp服务器,须要设置POP3端口并设置受权码
host_server = 'smtp.163.com'
#sender_user为发件人邮箱号
sender_user = 'xxx@163.com'
#pwd为发件人邮箱的受权码
pwd = 'xxxx'
#发件人的邮箱
sender_user_mail = 'xxx@163.com'
#收件人邮箱
receiver = 'xxx@qq.com'
#邮件的正文内容
mail_content = '你好,这是使用python登陆并验证mail模块功能发邮件的测试'
#邮件标题
mail_title = 'TEST邮件'
#ssl登陆
def send_mail(mail_content,mail_tile):
smtp = SMTP_SSL(host_server)
#set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.ehlo(host_server)
smtp.login(sender_user, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_user_mail
msg["To"] = receiver
smtp.sendmail(sender_user_mail, receiver, msg.as_string())
smtp.quit()
复制代码
def test_server_status():
apiUrl = 'www.baidu.com'
try :
# message = "OK"
res = requests.get(apiUrl, verify = False)
return str(res.status_code),str(res.content.decode("utf-8"))
except Exception as e:
import re
m = re.search(r'(\[*[0-9]+\])', str(e), re.M | re.I)
if m:
status_code = m.group().split(']')[0]
return status_code,e
复制代码
添加定时任务,实时监测服务状态,当服务状态出现错误时,发送邮件并告知维护人员简单信息。至此一个简单的定时监测服务告警任务就大功告成了。运维