节点`smtp-server`模块不适用于TLS

时间:2018-10-07 06:39:48

标签: node.js smtp nodemailer

此运行SMTP服务器的最少代码可以正常工作。当我向服务器发送电子邮件时,所有内容(由于logger的原因)均按预期记录,并接收到电子邮件数据。

const {SMTPServer} = require("smtp-server");
const {simpleParser} = require("mailparser");
const server = new SMTPServer({
    authOptional: true,
    onData: async (stream, session, callback) => {
        const parsed = await simpleParser(stream);
        callback();
        console.log(parsed);
    },
    logger: true
});
server.listen(8025);

但是,当我启用TLS选项时,向服务器发送电子邮件不再记录任何内容。根据日志,我什至没有收到任何连接。

const fs = require("fs");
const {SMTPServer} = require("smtp-server");
const {simpleParser} = require("mailparser");
const server = new SMTPServer({
    secure: true,
    authOptional: true,
    onData: async (stream, session, callback) => {
        const parsed = await simpleParser(stream);
        callback();
        console.log(parsed);
    },
    key: fs.readFileSync("privkey.pem"),
    cert: fs.readFileSync("cert.pem"),
    ca: fs.readFileSync("chain.pem"),
    logger: true
});
server.listen(8025);

我认为证书文件是正确的,因为我将它们用于Web服务器以及Postfix配置(在同一域中),并且HTTP / SMTP输出正常且安全。由于这个问题,我无法安全地接收电子邮件。

顺便说一句,我正在使用iptables从25重定向到8025的端口监听8025,而我只是通过我的Gmail帐户发送。

这是怎么回事?我在做错什么吗?

1 个答案:

答案 0 :(得分:1)

  

顺便说一句,我正在监听8025端口,其iptables从25重定向到8025,而我只是通过我的Gmail帐户发送。

由于您使用的是secure: true,因此您将强制进行TLS加密。为此,您必须在服务器的端口 465 NOT 25上接受连接。

您可以在端口25上设置secure: false,它仍允许通过STARTTLS 加密。

但是,为了获得最大的兼容性,您应该启动两个smtp-server实例-一个实例使用secure: false监听端口25,另一个实例使用secure: true监听端口465。

编辑:

我刚刚进行了一些测试,我可以确认只是从脚本中删除secure: true就可以了。

您可以通过https://www.checktls.com/TestReceiver进行测试,它将检查连接,TLS升级,您的证书以及其他所有内容。

这是我在删除secure: true的情况下使用您的脚本的结果:

https://gyazo.com/05a34942d2cc4a2d633e830258b90f88

如您所见,将连接升级到TLS很好,一切顺利。这是在端口25上。