简洁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())

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

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

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

猜你也喜欢

  1. 阿凯说道:

    州sir的文章虽然都是小工具, 但是更好说明了python的强大特性! :biggrin:

发表评论

电子邮件地址不会被公开。