设置 Nodemailer 以使用 STARTLS 握手保护电子邮件?
Set up Nodemailer to secure email with a STARTLS handshake?
我需要从桌面上的 Node.js 通过我的远程 Postfix/Dovecot SASL 服务发送电子邮件。
当我使用 Thunderbird 发送电子邮件时,它有效并且 Postfix 服务器日志显示
Anonymous TLS connection established from unknown[dh.cp.ip.ip]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
但不是通过 nodemailer,Postfix 服务器记录的地方:
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: connect from unknown[dh.cp.ip.ip]
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: lost connection after CONNECT from unknown[dh.cp.ip.ip]
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: disconnect from unknown[dh.cp.ip.ip] commands=0/0
这些相同的设置用于 Nodemailer 传输和 Thunderbird
let transporter = nodemailer.createTransport(
{
host: "mx.example.com",
port: 587,
secure: false, // use TLS
// requireTLS:true,
auth: {
user: "emailuser",
pass: "password"
},
tls: { rejectUnauthorized: false },
// logger: true,
debug: true
},
{
from: 'myuser@example.com',
}
);
但是 Nodemailer 不会像 Thunderbird 那样使用 TLS 连接到 Dovecot ??
当我将 secure 更改为 true
以强制 TLS 出现 SSL routines:ssl3_get_record:wrong version number
错误时(如下);它在验证传输时出现。
transporter.verify(function(error, success) {
if (error) {
console.log(error);
} else {
console.log("Server is ready to take our messages");
return false;
}
});
Error: 140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:
code:"ECONNECTION"
command:"CONN"
function:"ssl3_get_record"
library:"SSL routines"
message:"140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n"
reason:"wrong version number"
stack:"Error: 140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n"
当我用这个命令测试时:
openssl s_client -starttls smtp -connect mx.example.com:587
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = mx.example.com
verify return:1
---
Certificate chain
0 s:CN = mx. ...
...
...
... SSL/STARTTLS 握手成功并且证书
但是如果我使用这个命令:
openssl s_client -connect mx.example.com:587 -crlf -ign_eof
我收到与 Nodemailer 相同的错误
CONNECTED(00000005)
140508975112640:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:332:
我尝试了很多选项配置,但不知所措...
如何通过 Nodemailer 通过我的 Dovecot/Postfix 服务器发送安全电子邮件?我需要在 Nodemailer 中配置一些证书吗?我应该使用不同的东西从 node.js 发送安全电子邮件吗?任何帮助表示赞赏。
我在 Mocha
中的单元测试上下文没有可用的 Node.js 密码套件。
当 运行 在 Node.js 上下文中时,Nodemailer 从 STARTLS 启动 TLS 握手没有问题。
无法对@Kickaha 的回复添加评论以确认他的观察。
仅供参考:一些节点邮件错误消息具有误导性。当我用手指输入端口号时,我得到了错误的版本错误,但现在它在 firebase node.js 函数中运行良好:
try {
const mailFrom = functions.config().mail.from;
const mailPwd = functions.config().mail.pwd;
const mailHost = functions.config().mail.host;
// some code to generate the message
const mailOptions = {
from: mailFrom,
to: creatorEmail,
subject: subject,
html: message
};
const transporter = nodemailer.createTransport({
host: mailHost,
port: 465,
secure: true, // STARTTLS
auth: {
type: 'LOGIN',
user: mailFrom,
pass: mailPwd
}
});
await transporter.sendMail(mailOptions);
} catch (err) {
console.error(err);
}
我需要从桌面上的 Node.js 通过我的远程 Postfix/Dovecot SASL 服务发送电子邮件。
当我使用 Thunderbird 发送电子邮件时,它有效并且 Postfix 服务器日志显示
Anonymous TLS connection established from unknown[dh.cp.ip.ip]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
但不是通过 nodemailer,Postfix 服务器记录的地方:
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: connect from unknown[dh.cp.ip.ip]
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: lost connection after CONNECT from unknown[dh.cp.ip.ip]
Nov 26 22:02:31 servicelabel postfix/submission/smtpd[27019]: disconnect from unknown[dh.cp.ip.ip] commands=0/0
这些相同的设置用于 Nodemailer 传输和 Thunderbird
let transporter = nodemailer.createTransport(
{
host: "mx.example.com",
port: 587,
secure: false, // use TLS
// requireTLS:true,
auth: {
user: "emailuser",
pass: "password"
},
tls: { rejectUnauthorized: false },
// logger: true,
debug: true
},
{
from: 'myuser@example.com',
}
);
但是 Nodemailer 不会像 Thunderbird 那样使用 TLS 连接到 Dovecot ??
当我将 secure 更改为 true
以强制 TLS 出现 SSL routines:ssl3_get_record:wrong version number
错误时(如下);它在验证传输时出现。
transporter.verify(function(error, success) {
if (error) {
console.log(error);
} else {
console.log("Server is ready to take our messages");
return false;
}
});
Error: 140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:
code:"ECONNECTION"
command:"CONN"
function:"ssl3_get_record"
library:"SSL routines"
message:"140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n"
reason:"wrong version number"
stack:"Error: 140185182082944:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n"
当我用这个命令测试时:
openssl s_client -starttls smtp -connect mx.example.com:587
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = mx.example.com
verify return:1
---
Certificate chain
0 s:CN = mx. ...
...
...
... SSL/STARTTLS 握手成功并且证书
但是如果我使用这个命令:
openssl s_client -connect mx.example.com:587 -crlf -ign_eof
我收到与 Nodemailer 相同的错误
CONNECTED(00000005)
140508975112640:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../ssl/record/ssl3_record.c:332:
我尝试了很多选项配置,但不知所措...
如何通过 Nodemailer 通过我的 Dovecot/Postfix 服务器发送安全电子邮件?我需要在 Nodemailer 中配置一些证书吗?我应该使用不同的东西从 node.js 发送安全电子邮件吗?任何帮助表示赞赏。
我在 Mocha
中的单元测试上下文没有可用的 Node.js 密码套件。
当 运行 在 Node.js 上下文中时,Nodemailer 从 STARTLS 启动 TLS 握手没有问题。
无法对@Kickaha 的回复添加评论以确认他的观察。
仅供参考:一些节点邮件错误消息具有误导性。当我用手指输入端口号时,我得到了错误的版本错误,但现在它在 firebase node.js 函数中运行良好:
try {
const mailFrom = functions.config().mail.from;
const mailPwd = functions.config().mail.pwd;
const mailHost = functions.config().mail.host;
// some code to generate the message
const mailOptions = {
from: mailFrom,
to: creatorEmail,
subject: subject,
html: message
};
const transporter = nodemailer.createTransport({
host: mailHost,
port: 465,
secure: true, // STARTTLS
auth: {
type: 'LOGIN',
user: mailFrom,
pass: mailPwd
}
});
await transporter.sendMail(mailOptions);
} catch (err) {
console.error(err);
}