主页 > 原创 > bash命令行调用google/gmail api实现linux服务(service)变更发送邮件

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文件,内容如下

<?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 Mail-1.2.0
pear install Net_SMTP

3.客户端调用
客户端使用类似如下命令调用

curl https://www.xdty.org/email.php -X POST -d 'event=service started&name=opensips&email=aaaaa@gmail.com,bbbbb@xdty.org,ccccc@qq.com'

这样就会发送下边信息给aaaaa@gmail.com,bbbbb@xdty.org,ccccc@qq.com几个邮箱

Hi,

opensips service started at 2014-11-20 20:06:53

------------

This mail is auto generated by mail api.

4.mail脚本封装mail.sh
mail.sh文件

#!/bin/bash
#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文件

email=xxxxx@gmail.com,xxxxx@xdty.org

调用示例

./mail.sh "restart" "service opensips" mail.cfg

然后将类似于上边的命令添加到类似/etc/init.d/opensips的start,stop,restart调用位置,就可以在每次service 变更时得到邮件通知。而在上文中做了monit的服务崩溃自动重启,在服务重启后就会得到事件通知了。

Tags: bash gmail gmail api gmail发邮件 google linux php 服务监控

发表评论

电子邮件地址不会被公开。 必填项已用*标注