Nodemailer 6.1.1不适用于> = 12的NodeJ

时间:2019-05-20 21:44:14

标签: javascript node.js nodemailer

将我的nodemailer版本更新为nodejs时,我的行为12

现在,当我尝试发送电子邮件时,我得到:

DEBUG Creating transport: nodemailer (6.1.1; +https://nodemailer.com/; SMTP/6.1.1[client:6.1.1])
DEBUG Sending mail using SMTP/6.1.1[client:6.1.1]
DEBUG [9mzLKQAwcwQ] Resolved mail.mycompany.com as xxx.xxx.xxx.xxx [cache miss]
INFO  [9mzLKQAwcwQ] Connection established to xxx.xxx.xxx.xxx:587
DEBUG [9mzLKQAwcwQ] S: 220 mail.mycompany.com ESMTP
DEBUG [9mzLKQAwcwQ] C: EHLO [127.0.0.1]
DEBUG [9mzLKQAwcwQ] S: 250-mail.mycompany.com
DEBUG [9mzLKQAwcwQ] S: 250-STARTTLS
DEBUG [9mzLKQAwcwQ] S: 250-PIPELINING
DEBUG [9mzLKQAwcwQ] S: 250-8BITMIME
DEBUG [9mzLKQAwcwQ] S: 250-SIZE 23068672
DEBUG [9mzLKQAwcwQ] S: 250 AUTH LOGIN PLAIN CRAM-MD5
DEBUG [9mzLKQAwcwQ] C: STARTTLS
DEBUG [9mzLKQAwcwQ] S: 220 ready for tls
ERROR [9mzLKQAwcwQ] 139673645745984:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1922:
ERROR [9mzLKQAwcwQ]
DEBUG [9mzLKQAwcwQ] Closing connection to the server using "end"
ERROR Send Error: 139673645745984:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1922:
ERROR
[Error: 139673645745984:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1922:
] {
  library: 'SSL routines',
  function: 'ssl_choose_client_version',
  reason: 'unsupported protocol',
  code: 'ESOCKET',
  command: 'CONN'
}
INFO  [9mzLKQAwcwQ] Connection closed
INFO  [9mzLKQAwcwQ] Connection closed

这是我的SMTP传输配置:

nodemailer.createTransport({
    host: 'mail.mycompany.com',
    port: 587,
    debug: true,
    logger: true,
    tls: {
      secure: false,
      ignoreTLS: true,
      rejectUnauthorized: false
    },
    auth: {
      user: 'user',
      pass: 'pass'
    }
})

如果我更改为v11的最新版本,即11.15.0,一切将再次正常运行。仅在v>12上发生这种情况,因为我尝试使用12.1.012.2.0并遇到了与上述相同的错误。

有人尝试相同的行为吗?有建议吗?

注意::我已将nodemailer更新为最新版本6.1.1,就像我在Q'title上所说的那样。

7 个答案:

答案 0 :(得分:2)

如果您的邮件服务器仅支持TLS 1.0,只需添加:

tls: { secureProtocol: "TLSv1_method" }

答案 1 :(得分:1)

npm版本6.9.0,节点版本12.2.0和nodemailer 6.1.1都存在相同的问题。碰巧还使用电子邮件ALL的功能测试在升级到节点12.2.0时开始失败。注意:在新版本的Node ...之前,这些测试一直工作良好。

这是我们收到的错误(摘自mocha测试结果):

Uncaught AssertionError: expected Object {
  library: 'SSL routines',
  function: 'ssl_choose_client_version',
  reason: 'unsupported protocol',
  code: 'ESOCKET',
  command: 'CONN'
} to be ''

这是我们的传输配置:

const transporter = nodemailer.createTransport({
  host: 'email.ourhost.com',
  port: 25,
  secure: false,
  auth: {
    user: 'test',
    pass: 'pass'
  },
        tls: {
          rejectUnauthorized: false
        }
      });

除将节点“降级”作为解决方案外,任何有益的建议都将受到赞赏!

答案 2 :(得分:1)

更新:

我终于找到了解决方法-可以肯定的是您遇到了同样的问题。从节点12开始失败的原因是,节点版本12最终禁用了TLS 1.0支持。不幸的是,我们的测试邮件服务器仅支持TLS 1.0,因此没有有效的握手选项会导致nodemailer在握手期间失败。

这也可能与11.4版中的TLS.Min版本已修改为TLS 1.2版有关-请参见https://nodejs.org/api/tls.html#tls_tls_default_min_version

无论如何,我的解决方法是使电子邮件服务器使用TLS 1.0停止并开始使用TLS 1.2或TLS 1.3。

我在服务器上添加了一堆注册表项,并在邮件设置中实施了TLS。我的服务器是Windows 2008 ...

1。)以“管理员”身份打开“ RegEdit”(以管理员身份运行)

2。)导航到以下注册表项

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\

3。)添加/更新以下每个带有最终DWORD值的子键:

SSL 2.0\Client   DisabledByDefault : 1
SSL 2.0\Server   DisabledByDefault : 1
SSL 2.0\Server   Enabled : 0

SSL 3.0\Client   DisabledByDefault : 1
SSL 3.0\Server   DisabledByDefault : 1
SSL 3.0\Server   Enabled : 0

TLS 1.0\Server   DisabledByDefault : 0
TLS 1.0\Server   Enabled : 1

TLS 1.2\Client   DisabledByDefault : 0
TLS 1.2\Server   DisabledByDefault : 0
TLS 1.2\Server   Enabled : 1

TLS 1.3\Client   DisabledByDefault : 0
TLS 1.3\Server   DisabledByDefault : 0
TLS 1.3\Server   Enabled : 1

应该最终看起来像这样:https://support.solarwinds.com/SuccessCenter/s/article/Enable-TLS-1-2-on-Windows-Server-2008

此外,“下一步”链接在服务器上添加了对TLS大于1.0的客户端支持(不需要修复连接到服务器的客户端,但可能还希望其用于出站连接):

https://support.microsoft.com/en-us/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

最后,重新启动电子邮件服务器,以便可以启用TLS,并且可以通过检查TLS连接来检查注册表设置是否已解决了问题-我使用了以下链接:https://www.checktls.com/TestReceiver

在我的代码中,我碰巧将运输工具tls部分更新为以下内容,但后来我使用原始设置进行了测试,并且一切正常,因此问题100%与电子邮件服务器设置有关,不支持TLS 1.0以外的任何内容...

const transporter = nodemailer.createTransport({
  host: 'email.ourhost.com',
  port: 25,
  secure: false,
  auth: {
    user: 'test',
    pass: 'pass'
  },
        tls: {
          rejectUnauthorized: false,
          ignoreTLS: false,
          requireTLS: true
        }
      });

希望对您有帮助...

答案 3 :(得分:0)

您可以使用选项--tls-min-v1.0开始 node> = 12 。 它对我有用。

答案 4 :(得分:0)

我无法使用命令行参数--tls-min-v1进行更改。另一个选择是在运行时为所有请求设置最低TLS版本。可以通过将tls.DEFAULT_MIN_VERSION设置为TLSv1之类的东西来完成。我刚刚在所有require语句之后添加了此代码:

tls.DEFAULT_MIN_VERSION = 'TLSv1';

node.js文档提供了有关此参数有效选项的更多信息。 https://nodejs.org/docs/latest/api/tls.html#tls_tls_default_min_version

答案 5 :(得分:0)

root=

答案 6 :(得分:0)

nodemailer / 6.4.0环境中,Node.js 12的{​​{1}}版本Firebase和更高版本似乎已经出现问题。

那是代码:

Cloud Functions for Firebase

环境:

const mailTransport = nodemailer.createTransport({
  // Make sure the environmental variables have proper typings.
  host: 'MYHOST',
  port: PORT_NUMBER,
  auth: {
    user: 'MY_USER@gmail.com',
    pass: 'MY_PASSWORD',
  },
});
...
exports.myFunction = functions.firestore
  .document(
    'mails/{somethingHere}'
  )
  .onCreate(async (snap: any, context: any) => {
    if (snap.data() === null) return null;
  ...
  return mailTransport
      .sendMail(mailOptions)
      .then((info: string) => {
        console.log('Info: ', info);
      })
      .catch((error: string) => {
        return console.log('Error: ', error); // This log will be shown in Firebase Functions logs.
      });
    ...

注意:我在"firebase": "^8.1.1", "firebase-admin": "^9.4.1", "firebase-functions": "^3.11.0", "nodemailer": "^6.4.11", 设置中使用了GMAIL