利用Pycurl库监控WEB访问质量-邮件模板优化(三)

上一篇文章《利用Pycurl库监控WEB访问质量(二)》中成功的实现了通过邮件报警的功能,但是对于发送邮件却有很多的限制:为了邮件美观,一般都会制作成html邮件进行发送。但是发过HTML邮件的同学应该知道,电子邮箱中的HTML页面与普通的HTML页面比较在相当多的限制:

  • 不能引用外部CSS,所以只能写在页面里面
  • 不能引用外部JS,或者干脆禁用JS脚本

基于上述限制,我在《利用Pycurl库监控WEB访问质量(二)》中将HTML邮件代码直接和Python代码混在一起,细心的同学可以发现代码变得非常的混乱和冗长,实在难以接受。因此想个办法来进行优化。
思路:

  1. 如何将python代码和HTML代码分离开来?我想到了在平常的WEB开发中,不可避免的会使用到模板。因此模板是否也能适用在我发邮件上呢?经过思考,我决定使用jinja2(http://docs.jinkan.org/docs/jinja2/templates.html) 来使用
  2. 将HTML代码单独生成一个文件,然后监控脚本上将数据通过参数传递给模板(当然是利用了jinja2模板引擎的功能啦)
  3. 将最终渲染的html代码通过发送邮件的形式发出来即可。

开始动手吧,第一步生成邮件HTML,将原python文件中的HTML相关代码移出来,保存成mail.html(这我里叫mail.html,可以随意命名)



  
    {{ title }}
    
    
    
    
    
    
    
    
  
  
    
![LoGo Here](http://upload-images.jianshu.io/upload_images/3900471-558fa222f990324d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://www.sendwithus.com/assets/img/emailmonks/images/spacer.gif)
![](https://www.sendwithus.com/assets/img/emailmonks/images/spacer.gif)
{{ subtitle }}
机房信息 : {{ location }}
机房电话 : {{ jftel}}
{{ username }} : {{ telephone}} | {{email}}
网站 Code 响应时间
{% for site in status %} {% endfor %}
{{ site[0]}} {{ site[1] }} {{ site[2] }}
![](https://www.sendwithus.com/assets/img/emailmonks/images/spacer.gif)
总网站数: {{ num_sites }} 个
PRIVACY STATEMENT | TERMS OF SERVICE | RETURNS
©2‌016 XXX.net. All Rights Reserved.
If you do not wish to receive any further emails from us, please

第二步,改造python代码:

# coding: utf-8
import pycurl
try:
    from io import BytesIO
except ImportError:
    from StringIO import StringIO as BytesIO
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
import jinja2

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

templateLoader = jinja2.FileSystemLoader(searchpath=".")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = 'receipt.html'
template = templateEnv.get_template(TEMPLATE_FILE)
templateVars = {'title': 'XX监控邮件',
                'subtitle': 'XX网站监控信息记录',
                'location': 'XX数据中心',
                'jftel': '138XXXXXXXX',
                'username': 'XXX',
                'telephone': 'XXXX',
                'email': '[email protected]',
                'status': [],
                'num_sites': 0}

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode("utf-8") if isinstance(addr, unicode) else addr))


from_addr = "[email protected]"
to_addr = "[email protected]"  # 发送给多个用户,使用逗号分隔
password = "XXX"
smtp_server = "smtp.XXX.com"


def format_msg(s):
    # type: (object) -> object
    msg = MIMEText(s, _subtype='html', _charset='utf-8')
    msg['From'] = _format_addr(from_addr)
    msg['To'] = _format_addr(to_addr)
    msg['Subject'] = Header(u'来自XXX的监控小黑屋', 'utf-8').encode()
    return msg.as_string()


def send_email(s):
    server = smtplib.SMTP(smtp_server, 25)
    server.set_debuglevel(0)
    server.login(from_addr, password)
    server.sendmail(from_addr,to_addr, s)
    server.quit()

flag = False    # 决定是否发报警邮件的标志
list_of_sites = []
outputText = ''

with open("sites.txt") as f:
    list_of_sites = f.readlines()

num_sites = len(list_of_sites)

templateVars['num_sites'] = num_sites

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.FRESH_CONNECT, 1)

for site in list_of_sites:
    if len(site) == 0 or site.startswith("#"):
        pass
    else:
        c.setopt(c.URL, site.replace('\n', ''))
        c.setopt(c.WRITEFUNCTION, buffer.write)
        try:
            c.perform()
            http_code = c.getinfo(c.HTTP_CODE)
            total_time = c.getinfo(c.TOTAL_TIME)
            if http_code == 200:
                if total_time <= 5.0:
                    templateVars['status'].append([site, http_code, total_time])
                    # outputText = template.render(templateVars)
                else:
                    templateVars['status'].append([site, http_code, total_time])
                    # outputText = template.render(templateVars)
                    flag = True
            else:
                templateVars['status'].append([site, http_code, total_time])
                # outputText = template.render(templateVars)
                flag = True
        except pycurl.error, error:
            errno, errstr = error
            print errno, errstr
            templateVars['status'].append([site, errno, errstr])
            # outputText = template.render(templateVars)
            flag = True
c.close()
print templateVars

outputText = template.render(templateVars)
msg = format_msg(outputText)
if flag:
    send_email(msg)

最后的邮件如下:

利用Pycurl库监控WEB访问质量-邮件模板优化(三)_第1张图片
Paste_Image.png

你可能感兴趣的:(利用Pycurl库监控WEB访问质量-邮件模板优化(三))