Warm tip: This article is reproduced from serverfault.com, please click

node.js-通过AWS SES发送电子邮件时的Openssl问题

(node.js - Openssl issue when sending email through AWS SES)

发布于 2020-02-27 07:55:14

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


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

我们正在尝试迁移到AWS SES。一切似乎都设置正确(域已验证,我们已退出SANDBOX模式,并且正在使用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'
}

根据这个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);
    });
  }
};
Questioner
djibouti33
Viewed
11
Salathiel Genèse 2020-12-02 05:32:03

TLDR;

使用端口465时,secure选项true

我做了什么

我接受@moulder对这个问题的评论它奏效了。

为了清楚起见,你应该使用465(真)来使用SSL进行连接,或者使用587(真)来进行不使用SSL的连接并通过STARTTLS进行升级。其他任何组合均无效。该代码是错误的,在此处进行了修复:

来源:法比安斯基Potenciersymfony中/ symfony中#34846

另请参见symfony / symfony / 34067

亚马逊怎么说

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

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

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