最近项目需要实现这样一个异常报告的功能:网站管理系统出现错误时,自动发送错误报告的邮件给运维人员。
原先是直接通过捕获错误异常,然后直接发送邮件的。但是随着项目的增多,部署到多台服务器,各个项目都有相同的一套告警邮件发送代码,不方便对告警机制做统一的管理;随着项目规模扩大,为了快速定位和发现存在的问题,告警邮件发送功能必须做到实时且不拖累网站功能的正常使用。
由于历史原因,网站主要使用的语言是C#,考虑到方便迁移和IIS并发的不足,直接否定了用C#实现这个告警系统的方案。考察了PHP、Python和Node.js以后,决定用Node.js来实现,因为和PHP、Python相比,满足以上的业务需求和性能需求,且足够的小巧,还方便部署。
由于之前没有Node.js的实际开发经验,只是跑了跑例子,所以还是去Google了一把“Node.js send mail”,找到了这个node_mailer ,按照Readme里面的步骤安装好node_mailer,并运行里面的例子,我稍微小修改了下,去掉了for循环:
var email = require("../lib/node_mailer");
email.send({
host : "localhost", // smtp server hostname
port : "25", // smtp server port
ssl: true, // for SSL support
domain : "localhost", // domain used by client to identify itself to server
to : "***@gmail.com",
from : "***@whitehouse.gov",
subject : "node_mailer test email",
body: "Hello! This is a test of the node_mailer.",
authentication : "login", // auth login is supported; anything else is no auth
username : "my_username", // username
password : "my_password" // password
},
function(err, result){
if(err){ console.log(err); }
});
但是一直报错:cannot find moudel ”../lib/node_mailer”,修改为:
require("node_mailer");
也是一样找不到mooudel。Google到这篇 《Windows下 NodeJS 全局安装 modules 后在应用中 require 不到的解决方案》,添加 NODE_PATH以后,把代码改为如下:
var email = require("mailer");
email.send({
host : "smtp.gmail.com",
port : "25",
ssl: true,
domain : "smtp.gmail.com",
to : "****@gmail.com",
from : "****@gmail.com",
subject : "node_mailer test email",
body: "Hello! This is a test of the node_mailer.",
authentication : "login",
username : "****@gmail.com",
password : "****"
},
function(err, result){
if(err){ console.log(err); }
});
require的错误是没有了,但是:运行之后报“TypeError: Object # has no method ‘send’”错误。我在CNodejs.org发了这个帖子:《Node.js发送邮件,报no method ‘send’错误》,但是最终也还没有人答复我。
好吧,自力更生;不管白猫黑猫,能抓到老鼠的猫就是好猫。又Google到了Nodemailer,并通过特别注意下列方法把它install到全局模块:
npm install -g nodemailer
直接运行示例里面的代码:
var nodemailer = require("nodemailer");
// create reusable transport method (opens pool of SMTP connections)
var smtpTransport = nodemailer.createTransport("SMTP",{
service: "Gmail",
auth: {
user: "gmail.user@gmail.com",
pass: "userpass"
}
});
// setup e-mail data with unicode symbols
var mailOptions = {
from: "Sender Name ✔ <sender@example.com>", // sender address
to: "receiver1@example.com, receiver2@example.com", // list of receivers
subject: "Hello ✔", // Subject line
text: "Hello world ✔", // plaintext body
html: "<b>Hello world ✔</b>" // html body
}
// send mail with defined transport object
smtpTransport.sendMail(mailOptions, function(error, response){
if(error){
console.log(error);
}else{
console.log("Message sent: " + response.message);
}
// if you don’t want to use this transport object anymore, uncomment following line
//smtpTransport.close(); // shut down the connection pool, no more messages
});