一、前言
有一天,你眼疾手快写好了一个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())
很快的,就收到了新邮件的提醒了:
打开邮件看看,异常时间、名称、异常详情一应俱全:
怎么样是不是很简单,欢迎留言讨论~
文章版权所有:州的先生博客,转载必须保留出处及原文链接
州sir的文章虽然都是小工具, 但是更好说明了python的强大特性!