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

Openssl issue when sending email through AWS SES

更新: 如果我按照 Using the Command Line to Send Email Using the Amazon SES SMTP Interface 的说明进行操作,我可以从我的本地和我的 ec2 实例中完美发送电子邮件。


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

我们正在尝试迁移到 AWS SES。一切似乎都设置得很好(域已验证,我们已退出 SANDBOX 模式,并且我们正在使用 SMTP user/pass 凭据)。

我们使用的是完全相同的代码,只是在我们的凭据文件中换掉了 smtp user/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:\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'
}

根据this GitHub issue,问题似乎是:

You are either trying to use TLS on a non-TLS port or the openssl version you use is not compatible with the server.

我不太确定如何处理这些信息。我们的 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。

我做了什么

我对这个问题进行了 of @moulder,它奏效了。

To be clear, you should use 465, true to use SSL to connect, or 587, false to connect without SSL and upgrade via STARTTLS. Any other combination won't work. The code was buggy, fixing it here:

Source: Fabien Potencier at symfony/symfony#34846

另见 symfony/symfony/34067

亚马逊怎么说

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

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

来源:Amazon SES Docs - Connecting to an SMTP endpoint