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

dji*_*i33 6 openssl smtp node.js amazon-ses nodemailer

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


我们使用 nodemailer 通过 SMTP 发送电子邮件。当我们使用 Gmail 的 SMTP 用户/密码配置所有内容时,一切正常。

我们正在尝试迁移到 AWS SES。一切似乎都设置得很好(域已验证,我们脱离了沙盒模式,并且我们正在使用 SMTP 用户/密码凭据)。

我们使用完全相同的代码,只是交换凭证文件中的 smtp 用户/通行证/主机。使用 SES 凭据发送邮件时,我们收到此错误:

Email was not send due to the following error:  [Error: 62024:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:332:
] {
  library: 'SSL routines',
  function: 'ssl3_get_record',
  reason: 'wrong version number',
  code: 'ESOCKET',
  command: 'CONN'
}
Run Code Online (Sandbox Code Playgroud)

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

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

我不太确定如何处理这些信息。我们的 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);
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

Sal*_*èse 8

太长了;

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

我做了什么

我按照@moulder对这个问题的评论进行了评论,结果成功了。

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

资料来源:Fabien Potenciersymfony/symfony#34846

另请参见symfony/symfony/34067

亚马逊怎么说

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

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

来源:Amazon SES 文档 - 连接到 SMTP 终端节点