SendCloud邮件队列状态和已使用额度的Python监控脚本

公司最近用上了 SendCloud 的邮件代发服务,于是就有了各种监控需求。比如每天发信额度是不是要超标了或是邮件是否堵塞了等等。最近经常接触 python,所以这次也一样,继续学习使用 python 来完成各种脚本需求。

SendCloud 提供了很多对外查询的 API,只要 Get 或 Post 传递用户名和 KEY 即可获得想要的各种数据,比如最简单的【已使用额度】就可以在用户信息 json 接口查询。

文档地址:http://sendcloud.sohu.com/doc/email/user_info/

调用形式如下:

http://sendcloud.sohu.com/webapi/userinfo.get.json?api_user=***&api_key=***

返回示例如下:

{
    "message": "success",
    "userinfo": {
        "quota": 5700,
        "usedQuota": 0,
        "reputation": 65.768845,
        "balance": 0,
        "availableBalance": -2.9,
        "userName": "sendcloud_admin",
        "accountType": "付费用户",
        "regTime": "2013-01-01"
    }
}

其中的 usedQuata 就是我所要监控的当前使用额度了。 先用我目前比较熟悉的 php 写一个脚本试试:

<?php
    $data = file_get_contents('http://sendcloud.sohu.com/webapi/userinfo.get.json?api_user=username&api_key=userkey');
    $data = json_decode($data,true); 
    $userinfo=$data["userinfo"];
    $usedQuota = $userinfo["usedQuota"];
    echo $usedQuota;
    exit;
?>

这样就可以输出当前的使用额度了,然后放到 zabbix 配置文件中即可 ,记得要使用 php 调用哦。

下面再试试我还不太熟悉的 python,目的很简单,在提高性能的同时学习一下自己的弱项,代码很稚嫩估计内行一看就知道是新手写的,仅供参考。。。

#coding=utf-8
#!/usr/bin/env python
#SendCloud当前使用额度和邮件队列是否阻塞监控脚本
#代码中的username和userkey需要修改为实际对应
#执行形式为:脚本.py -r usedQuota/isStop
#usedQuota表示查询当前使用额度,isStop查询是否存在暂停的队列
 
#转载所需组件
import optparse
import json
import httplib
 
#GET抓取JSON返回值并转换为字典
def GetData(url):
    conn = httplib.HTTPConnection("sendcloud.sohu.com")
    conn.request(method="GET",url=url) 
    response = conn.getresponse()
    if response.reason != 'OK':
        print 404
        exit()
    res= response.read()
    data = json.loads(res)
    conn.close()
    return data
 
#定义执行选项
choices = ['usedQuota','isStop']
parser = optparse.OptionParser()
parser.add_option('-r', '--run', type='choice', choices=choices)
(options, args) = parser.parse_args()
if not options.run: parser.error('Please run with Usg like script.ye -r isStop')
if options.run == 'usedQuota':
    #监控 SendCloud 当前请求额度
    url = "http://sendcloud.sohu.com/webapi/userinfo.get.json?api_user=username&api_key=userkey"
    print GetData(url)['userinfo']['usedQuota']
elif options.run == 'isStop':
    #监控 SendCloud API_USER 发送队列是否暂停,若暂停则输出未处理的邮件总数,正常情况下则输出 0
    url = "http://sendcloud.sohu.com/webapi/queueStatus.get.json?api_user=usename&api_key=userkey"
    data = GetData(url);
    if data['queueStatus']:
        exp = 0
        for obj in data['queueStatus']:
            if obj['isStop'] == True:
                exp += obj['unRequestNum']
        print exp  
    else:
        print 0

脚本执行形式:

#监控当天使用额度
SendCloud.py -r usedQuota
 
#监控队列是否暂停
SendCloud.py -r isStop

涉及到了网页抓取,期间少不了百度搜索 python 抓取网站的一些函数和用法,于是继续写了一个监控网页 HTTP 状态码的监控脚本,权当是学习之作:

#coding=utf-8
#!/usr/bin/env python
#网页状态码监控脚本
#若返回码不是200或304将输出对应数值,正常则输出200表示无异常
#执行形式为:脚本.py -r website1/website2
 
#装载必须组件
import optparse
import httplib
import sys
 
#屏蔽错误信息
sys.stderr = None
 
#使用head方法获取网页状态码
def GetData(host,url):
    conn = httplib.HTTPConnection(host)
    conn.request(method="HEAD",url=url) 
    response = conn.getresponse()
    return response.status
 
choices = ['webiste1','website2']
parser = optparse.OptionParser()
parser.add_option('-r', '--run', type='choice', choices=choices)
(options, args) = parser.parse_args()
if not options.run: parser.error('At least one check should be specified')
 
if options.run == 'website1':
    #监控Http CODE
    host = "zhangge.net"
    url = "/5028.html"
    http_code = GetData(host,url)
    if  http_code == 200 or http_code == 304:
        print 200
    else:
        print http_code
elif options.run == 'website2':
    host = "zhangge.net"
    url = "/4586.html"
    http_code = GetData(host,url)
    if  http_code == 200 or http_code == 304:
        print 200
    else:
        print http_code

几次接触下来,python 给我的感觉就是不但功能强大,而且简单易懂。基本都可以依葫芦画瓢实现你想要的各种功能。当然,本文分享的几个脚本都是用于 zabbix 监控的,如何添加请参考博客上一篇文章。

另外,SendCloud 的可监控项目非常多,比如今天发了多少邮件,成功了多少,被拦截了多少,无效邮件有多少等等。基本上,官方都提供了相应的查询接口,所以只要参考本文的脚本和思路,相信就能完成你想要的监控脚本。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林冠宏的技术文章

全面总结: Golang 调用 C/C++,例子式教程

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:htt...

1.1K5
来自专栏linux驱动个人学习

实时调度类

按照POSIX标准的强制要求,除了“普通”进程之外, Linux还支持两种实时调度类。调度器结构使得实时进程可以平滑地集成到内核中,而无需修改核心调度器,这显然...

1092
来自专栏大内老A

ASP.NET的路由系统:路由映射

总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection...

2309
来自专栏java一日一条

同步和异步的区别

答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

894
来自专栏郭霖

Android Volley完全解析(一),初识Volley的基本用法

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。And...

2385
来自专栏黑泽君的专栏

day45_Webservice学习笔记_01

Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。

1381
来自专栏FreeBuf

WIN10下ROP初体验

* 本文原创作者:与非门salome,本文属FreeBuf原创奖励计划,未经许可禁止转载 首先,在windows10下编写一个具有一定安全机制但又存在漏...

2909
来自专栏林冠宏的技术文章

全面总结: Golang 调用 C/C++,例子式教程

Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多。希望本文能在一定程度上,做到更通俗明了。

5382
来自专栏java一日一条

同步和异步的区别

答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

872
来自专栏向治洪

Volley请求

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。A...

2107

扫码关注云+社区

领取腾讯云代金券