通过AWS SES发送电子邮件时出现Openssl问题



更新:如果我按照"使用命令行使用Amazon SES SMTP接口发送电子邮件"中的说明进行操作,我可以从我的本地和ec2实例完美地发送电子邮件。


我们使用nodemailer通过SMTP发送电子邮件。当我们使用Gmail的SMTP用户/通行证配置所有内容时,一切都很好。

我们正在尝试转到AWS SES。一切似乎都设置得很好(域已验证,我们已脱离SANDBOX模式,并且我们正在使用SMTP用户/通行证凭据(。

我们使用完全相同的代码,只是交换了凭据文件中的smtp用户/pass/host。当使用SES凭据发送邮件时,我们会收到以下错误:

Email was not send due to the following error:  [Error: 62024:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:c:wsdepsopensslopensslsslrecordssl3_record.c:332:
] {
library: 'SSL routines',
function: 'ssl3_get_record',
reason: 'wrong version number',
code: 'ESOCKET',
command: 'CONN'
}

根据这个GitHub问题,问题似乎是:

您正在尝试在非TLS端口或openssl上使用TLS您使用的版本与服务器不兼容。

我不太确定该如何处理这些信息。我们的SSL证书在ELB上。

以下是负责发送实际电子邮件的代码:

"use strict";
const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: process.env.SMTP_SECURE,
auth: {
user: process.env.SMTP_AUTH_USER,
pass: process.env.SMTP_AUTH_PASS
}
});
module.exports = {
sendMail: (to, subject, html, callback) => {
const mailOptions = {
from: "no-reply@xyz.com",
to,
subject,
html
};
transporter.sendMail(mailOptions, (err, info) => {
if (err) {
return callback(err);
}
return callback(null, info);
});
}
};

TLDR

secure选项为true时,请使用端口465。

我做了什么

我参考了@modeler对这个问题的评论,它起到了作用。

要明确的是,您应该使用465,true来使用SSL进行连接,或者使用587,false来在没有SSL的情况下进行连接并通过STARTTLS进行升级。任何其他组合都不起作用。代码有问题,在这里修复:

来源:Fabien Potencier在symfony/symfony#34846

另请参阅symfony/symfony/34067

亚马逊怎么说

就像有HTTP和HTTPS("s"表示安全(一样,也有SMTP和SMTPS(有点(。。。至于通信的安全版本,有很多方法可以建立这种安全性。

  • STARTTLS-客户端连接时没有安全性。服务器表示支持安全性。然后,客户端与SMTP服务器协商安全协议,并从不安全通信迁移到安全通信
  • TLS包装器-客户端从一开始就很安全

来源:亚马逊SES文档-连接到SMTP端点

最新更新