前几天甲方爸爸机房的交换机出问题了,产品几个小时进不去,被甲方爸爸一顿批评。。
准备做一个简单的python程序定时访问产品端口保证网络通常,一旦无法访问就发送告警邮件,这里记录一下自定义的stmp模块:
源码
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
# 第三方 SMTP 服务
mail_host = "xxx.xxx.xxx.xxx" # 邮箱服务器
mail_user = "user" # 邮箱用户名
mail_pass = "passwd" # 邮箱密码
'''receivers示例
{
"To":[
"aaa@bbb.com"
],
"Cc":[
"bbb@bbb.com",
"ccc@bbb.com"
]
}
'''
def sendMessage(receivers, body):
try:
to_list = receivers["To"] # 收件人
cc_list = receivers["Cc"] # 抄送人
message = MIMEText(body, 'plain', 'utf-8') # 内容
message['Subject'] = Header("项目连接异常", 'utf-8') # 邮件标题
message['From'] = formataddr(('cqrzbb', mail_user)) # 发件人 使用Header可能会存在显示错误的问题
message['To'] = ','.join(to_list) # 收件人
message['Cc'] = ','.join(cc_list) # 抄送人
re = to_list
re.extend(cc_list) # 抄送对象列表
# re.extend(bccto_list) # 暗送对象列表
try:
smtpObj = smtplib.SMTP(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.set_debuglevel(1)
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(mail_user, re, message.as_string())
smtpObj.quit()
print("邮件发送成功")
except smtplib.SMTPException as e:
print("无法发送邮件,异常详情:%s" % e)
except Exception as ee:
print("获取邮件详情失败:%s" % ee)
注意
在多个参考文章中,每篇文章对标题、发件人、收件人等格式化方式都不一样,我最先使用的是email.header()进行的格式化,但是在QQ邮箱中发件人会显示多余的字符,改成email.utils()进行格式化后没有这个问题,各位可以按照接收邮箱的实际情况选择格式化方式。
参考文章
参考文章1:利用SMTP发送邮件终极篇,主送、抄送、暗送
参考文章2:SMTP发送邮件
参考文章3:Python使用SMTP协议实现邮件发送(含明文/SSL加密/TLS加密)