7

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

 2 years ago
source link: https://zmister.com/archives/753.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

文章目录 [显示]

有一天,你眼疾手快写好了一个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 = '[email protected]'  # 发件人邮箱
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'] = '程序小助手<[email protected]>'
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())

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

add0a1952bba1eb1e453195167b59211.png

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

def72de0204aa81be5547bdfb4dbdfa7.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK