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

ETIMEDOUT connect error using nodemailer in Nodejs Openshift application

我在 Openshift 中的 node.js 单齿轮不可扩展应用程序中使用 nodemailer 模块时遇到了一些问题。正如 documentation 所建议的那样,我初始化了传输器对象并使用了 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 设置或环境变量?

我还 运行 进行了几次测试,但我想我已经弄清楚问题出在哪里了。通过用户名和密码进行身份验证是 Gmail 的一种不安全的身份验证方法。如 Nodemailer 文档中所写

Even though Gmail is the fastest way to get started with sending emails, it is by no means a preferable solution unless you are using OAuth2 authentication. Gmail expects the user to be an actual user not a robot so it runs a lot of heuristics for every login attempt and blocks anything that looks suspicious to defend the user from account hijacking attempts. For example you might run into trouble if your server is in another geographical location – everything works in your dev machine but messages are blocked in production.

我使用 XOAuth2 升级了我的授权方法,在此 guide 中进行了说明,现在邮件已正确发送。

如果您尝试从本地主机运行这样做。

在auth选项后添加如下代码

 tls:{
        rejectUnauthorized:false
    }

它会起作用,但您可以考虑按照@matt.kiwi

的建议升级到 XOAuth2

在我的例子中,问题出在端口上 我已将端口从 25 更改为 2525,它起作用了。

尝试更改端口

const transporter = await nodemailer.createTransport(smtpTransport({
    service: "Outlook365",
    host: "smtp.office365.com",
    port: "587",
    tls: {
        ciphers: "SSLv3",
        rejectUnauthorized: false,
    },
    auth: {
        user: '***',
        pass: '***'
    }
}));

适用于 outlook