bash命令行调用google/gmail api实现linux服务(service)变更发送邮件
前边讲到使用monit监控服务进程的状态,而没有使用monit的邮件功能,是因为需要配置邮件服务器。而管理邮件服务器是个很累的工作,尤其是被攻击后发送大量垃圾邮件会造成停机,所以考虑到使用第三方的邮件服务。
这里我找到的服务又sendgrid,mailgun等服务,mailgun可以快速上手,需要设置一些域名cname等信息,api调用可以简单的使用curl命令完成。mailgun类服务可以使用独立的域名,但有一个缺点,即使在设置了Message-Id后发送的邮件仍有很大的可能会被gmail、zoho等邮箱丢到垃圾邮件。这是因为mailgun使用了共享的ip来发送邮件,所以ip一旦被标记为垃圾邮件服务器地址,不管是什么域名都会被丢到垃圾邮件里。垃圾邮件这个问题对国内的邮箱很小,qq就可以正常的接收。
由于垃圾邮件的问题,最终考虑使用gmail作为发件服务器,但需要一个能正常调用google服务的服务器转接,这对于在国外架站的人来说不是问题。
下面介绍实现
1.准备一个应用专用密码
如google账号为xxx@gmail.com,那么在账号设置里开启了二次认证后,进入账号设置-安全性-应用专用密码,添加一个密码并记下来,如密码xxxxxxxxx。
2.服务端调用
做一个服务端的email.php文件,内容如下
// Pear Mail Library
require_once "Mail.php";
$event = $_POST['event'];
$name = $_POST['name'];
$time = date('Y-m-d H:i:s');
$from = '<xxx@gmail.com>';
$to = $_POST['email'];
$subject = "$name"." event notify";
$body = "Hi, \n\n$name $event at $time\n\n------------\n\nThis mail is auto generated by mail api.";
$headers = array(
'From' => "$from",
'To' => "$to",
'Subject' => "$subject"
);
$smtp = Mail::factory('smtp', array(
'host' => 'ssl://smtp.gmail.com',
'port' => '465',
'auth' => true,
'username' => 'xxx@gmail.com',
'password' => 'xxxxxxxxx'
));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail)) {
echo('<p>' . $mail->getMessage() . '</p>');
} else {
#echo('Email successfully sent!');
}
?>
需要以下php库,运行命令安装
pear install Net_SMTP
3.客户端调用
客户端使用类似如下命令调用
这样就会发送下边信息给aaaaa@gmail.com,bbbbb@xdty.org,ccccc@qq.com几个邮箱
opensips service started at 2014-11-20 20:06:53
------------
This mail is auto generated by mail api.
4.mail脚本封装mail.sh
mail.sh文件
#title :mail.sh [event] [service name] [config file]
#description :This script will call mail api to send mail via gmail.
#author :xdtianyu@gmail.com
#date :20141120
#version :1.0 final
#usage :bash mail.sh
#bash_version :4.3.11(1)-release
if [ $# -ne 3 ];then
echo "Error param.";
echo "Usage: $0 [event] [service name] [config file]"
exit 0;
fi
EVENT=$1
NAME=$2
CONF=$(cat $3)
if [ "$(echo $CONF|grep email|wc -l)" == "1" ];then
curl -s https://www.xdty.org/email.php -X POST -d "event=$EVENT&name=$NAME&email=$(echo $CONF|grep email|cut -c7-)"
else
echo "Config file error."
fi
mail.cfg文件
调用示例
然后将类似于上边的命令添加到类似/etc/init.d/opensips的start,stop,restart调用位置,就可以在每次service 变更时得到邮件通知。而在上文中做了monit的服务崩溃自动重启,在服务重启后就会得到事件通知了。
Tags: bash gmail gmail api gmail发邮件 google linux php 服务监控
发表评论