在Nodejs Openshift应用程序中使用nodemailer ETIMEDOUT连接错误

我正在使用Node.js中的nodemailer模块,在Openshift中使用一个不可扩展的应用程序。 正如文档build议的那样,我初始化了transporter对象并使用了sendMail函数。 我的代码的简化版本是

var transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'my.mail@gmail.com', pass: 'mypassword' } }); var mail = { from: 'my.mail@gmail.com', to: 'test@mydomain.com', subject: 'Test mail', html: 'Test mail' }; transporter.sendMail(mail, function(error, info) { if(error){ console.log(error); }else{ console.log(info); } }); 

当我在本地机器上运行它时,此代码正常工作,但是当我尝试在服务器上执行它时,出现ETIMEDOUT错误,就好像应用程序不能连接到smtp服务器一样。

 { [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' } 

我试图增加超时连接参数,但我得到了相同的结果。

 var transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'my.mail@gmail.com', pass: 'mypassword' }, connectionTimeout: 5 * 60 * 1000, // 5 min }); 

有没有防火墙或默认的Openshift设置或环境variables我错过了?

我还需要进行更多的testing,但是我想我已经find了问题所在。 通过用户名和密码进行身份validation对Gmail来说是一种不安全的身份validation方法。 正如在Nodemailer文档中所写的那样

尽pipeGmail是开始发送电子邮件的最快方式,但除非您使用OAuth2身份validation,否则绝不是一个可取的解决scheme。 Gmail希望用户成为真正的用户,而不是机器人,因此它为每次login尝试都运行了很多启发式操作,并阻止任何看起来可疑的内容,以防止帐户被劫持。 例如,如果您的服务器位于另一个地理位置,则可能会遇到麻烦 – 在您的开发计算机中一切正常,但生产中的邮件已被阻止。

我使用XOAuth2升级了我的授权方法,并在本指南中进行了解释,现在邮件已正确发送。