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

Node `smtp-server` module won't work with TLS

这个 运行 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-out 工作正常且安全。由于这个问题,我无法安全地接收电子邮件。

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

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

By the way, I'm listening to port 8025 with an iptables redirect from 25 to 8025, and I'm just sending via my Gmail account.

因为您使用的是secure: true,所以您强制 TLS 加密。为此,您必须接受端口 465NOT 25 上的连接到您的服务器。

您可以设置 secure: false,这将仍然允许在端口 25 上通过 STARTTLS 进行加密。

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

编辑:

我刚刚做了一些测试,我可以确认只需从您的脚本中删除 secure: true 就可以正常工作。

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

以下是我使用删除了 secure: true 的脚本的结果:

https://gyazo.com/05a34942d2cc4a2d633e830258b90f88

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