简洁Python程序运行异常邮件提醒

一、前言

有一天,你眼疾手快写好了一个Python程序来处理大批量的任务,然后信心满满地点击“Run”按钮,想着任务量巨大,可能需要计算机处理一段时间,于是带着还未消散的成就感,约上了三五好友把酒言欢……

举杯邀明月,对饮成三人,把酒言欢后,全都没干成。

由于一个未知的异常,程序在运行不久后就挂掉了…………掉了…………了,在你把酒言欢的这段时间里,你以为计算机在埋头苦干,实则在闭目养神。

这时的你追悔莫及,恨不得给自己两耳巴子,但是真打自己是不可能的了,只能继续完善代码。除了对异常进行了处理,还加上了提醒功能,以便程序第一时间出状况的时候你能够知道。

二、邮件提醒

对程序加入提醒功能可以有很多种方式,比如短信、QQ消息、微信消息、邮件、飞信等等。

最及时的,当然是短信了,但是发送短信可能需要购买短信服务,对于个人而言并不是很划算。

QQ、微信、飞信等聊天软件也很不错,但是对接这些软件稍显麻烦,所以最后我们选择经典的电子邮件作为程序异常的提醒方式。

在Python中,已经有内置库支持电子邮件的发送和接收。其中:

  • 接收邮件使用poplib和imaplib这两个库;
  • 发送邮件使用smtplib这个库。

这3个库的具体使用方法在此就不做详细介绍,Python的官方文档里面已经有说明。

下面我们直接来编写这个邮件提醒函数。

三、代码实践

首先,我们引入所需的库:

import smtplib from email.mime.text import MIMEText import datetime import traceback 

其中:

  • smtplib:用于发送电子邮件;
  • MIMEText:用于处理电子邮件的正文内容;
  • datetime:用于获取时间;
  • traceback:用于获取异常的信息;

接着,创建一个名为send_email的函数,接收3个参数name,ex和ex_detail。

def send_email(name,ex,ex_detail):     '''     :param name:程序名     :param ex: 异常名     :param ex_detail: 异常详情     :return:     ''' 

在函数内定义一个变量now_time,赋值为当前的时间:

now_time = datetime.datetime.strftime(datetime.datetime.today(), "%Y-%m-%d %H:%M:%S:%f")  # 当前时间 

在函数内定义电子邮箱相关变量:

msg_from = 'xxx@xxxxxx.com'  # 发件人邮箱 passwd = '666666'  # 发件人邮箱密码 msg_to = '你自己的邮箱'  # 收件人邮箱 s = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)  # 发件箱邮件服务器及端口号 

继续在函数内定义邮件内容相关的变量,为了让邮件的正文更加地美观,我们使用HTML格式的文本作为内容:

subject = "【程序异常提醒】{name}-{date}".format(name=name, date=now_time)  #标题 content = '''<div class="emailcontent" style="width:100%;max-width:720px;text-align:left;margin:0 auto;padding-top:80px;padding-bottom:20px">     <div class="emailtitle">         <h1 style="color:#fff;background:#51a0e3;line-height:70px;font-size:24px;font-weight:400;padding-left:40px;margin:0">程序运行异常通知</h1>         <div class="emailtext" style="background:#fff;padding:20px 32px 20px">             <p style="color:#6e6e6e;font-size:13px;line-height:24px">程序:<span style="color:red;">【{name}】</span>运行过程中出现异常错误,下面是具体的异常信息,请及时核查处理!</p>             <table cellpadding="0" cellspacing="0" border="0" style="width:100%;border-top:1px solid #eee;border-left:1px solid #eee;color:#6e6e6e;font-size:16px;font-weight:normal">                 <thead>                     <tr>                         <th colspan="2" style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;background:#f8f8f8">爬虫异常详细信息</th>                     </tr>                 </thead>                 <tbody>                     <tr>                         <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center;width:100px">异常简述</td>                         <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">{ex}</td>                     </tr>                     <tr>                         <td style="padding:10px 0;border-right:1px solid #eee;border-bottom:1px solid #eee;text-align:center">异常详情</td>                         <td style="padding:10px 20px 10px 30px;border-right:1px solid #eee;border-bottom:1px solid #eee;line-height:30px">{ex_detail}</td>                     </tr>                 </tbody>             </table>         </div>     </div> </div>     '''.format(ex=ex, ex_detail=ex_detail, name=name)  # 正文 msg = MIMEText(content, _subtype='html', _charset='utf-8') msg['Subject'] = subject msg['From'] = '程序小助手<xxx@xxxxxxxxxx.com>' msg['To'] = msg_to 

最后登录邮箱并发送邮件:

try:     s.login(msg_from, passwd)     s.sendmail(msg_from, msg_to, msg.as_string())     print("发送成功") except smtplib.SMTPException as e:     print("发送失败") finally:     s.quit() 

这样,我们的Python程序异常邮件提醒小功能就实现了。

为了看看效果,我们来试验一下:

if __name__ == '__main__':     # 示例     try:         a = int("哈哈哈")     except Exception as e:         print(traceback.format_exc())         send_email(name='州的先生程序测试', ex=repr(e), ex_detail=traceback.format_exc()) 

很快的,就收到了新邮件的提醒了:

打开邮件看看,异常时间、名称、异常详情一应俱全:

怎么样是不是很简单,欢迎留言讨论~

分类目录: 编程

标签: 程序异常编程技巧