Nodemailer 6.1.1 не работает с NodeJs ›= 12

У меня возникла ошибка 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'
    }
})

Если я перейду на последнюю версию nodejs v11: 11.15.0, все снова будет работать. Это происходит только на v>12, потому что я пробовал с 12.1.0 & 12.2.0 и получил ту же ошибку, что и описанную выше.

Кто-то экспериментирует с таким же поведением? Предложения?

ПРИМЕЧАНИЕ. Я nodemailer обновился до последней версии 6.1.1, как я сказал в Q'title.


person robe007    schedule 20.05.2019    source источник
comment
Такое же поведение наблюдается при использовании самозаверяющего сертификата с другим пакетом Axios. Вы используете самозаверяющий сертификат?   -  person salep    schedule 22.05.2019


Ответы (7)


Если ваш почтовый сервер поддерживает только TLS 1.0, просто добавьте:

tls: { secureProtocol: "TLSv1_method" }
person uizz    schedule 30.10.2019
comment
У меня это сработало, но я пошел с tls: { minVersion: 'TLSv1' } для поддержки и более новых версий TLS. - person cooljeffro; 04.02.2020

ОБНОВЛЕНИЕ:

Я наконец нашел свое исправление - уверен, что у вас такая же проблема. Причина, по которой это не удается на Node 12, заключается в том, что Node Version 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

Кроме того, ссылка Next добавляет клиентскую поддержку 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
        }
      });

Надеюсь, это поможет вам ...

person Sean Pitcher    schedule 21.05.2019
comment
Хорошо, я поддержал ваш ответ на исследование, но я еще не тестировал. Мой почтовый сервер находится на Linux, поэтому мне нужно посмотреть, что мне нужно изменить. Я напишу позже, чтобы вы знали! - person robe007; 22.05.2019

Такая же проблема с npm версии 6.9.0, node версии 12.2.0 и nodemailer 6.1.1 ... Функциональные тесты, которые также используют электронную почту, ВСЕ запускаются с ошибкой при обновлении до node 12.2.0. ПРИМЕЧАНИЕ: эти тесты работали нормально до новой версии Node ...

Это ошибка, которую мы получаем (извлеченная из результатов теста мокко):

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
        }
      });

Любые полезные предложения, кроме "понижения" узла в качестве решения, будут оценены!

person Sean Pitcher    schedule 21.05.2019
comment
Да, мы надеемся, что какой-нибудь гуру nodemailer это увидит :) - person robe007; 21.05.2019

Вы можете запустить узел> = 12 с параметром --tls-min-v1.0. У меня это сработало.

person Marco Jacovone    schedule 13.10.2019
comment
Извините, но у меня это не работает. Какая у вас tls конфигурация объекта? - person robe007; 14.10.2019
comment
Никаких опций tls вообще. Просто хост, порт, безопасность и авторизация. Прекрасно работает с итальянским провайдером aruba. - person Marco Jacovone; 15.10.2019
comment
Хорошо, я понимаю, но для меня, как я уже сказал, он не работает, в том числе без tls :( - person robe007; 15.10.2019

Я не мог изменить это с помощью аргумента командной строки --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

person pseudosavant    schedule 26.12.2019
comment
Также помните, что вам сначала нужно будет импортировать tls ... так что const tls = require('tls'); или require('tls').DEFAULT_MIN_VERSOIN = 'TLSv1'; - person Brandon; 25.11.2020

Похоже, эта проблема исчезла в nodemailer версии 6.4.0 и выше для Node.js 12 в среде _4 _ / _ 5_.

Это код:

const mailTransport = nodemailer.createTransport({
  // Make sure the environmental variables have proper typings.
  host: 'MYHOST',
  port: PORT_NUMBER,
  auth: {
    user: '[email protected]',
    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 для своих SMTP настроек.

person Daniel Danielecki    schedule 27.11.2020

person    schedule
comment
Здравствуйте, спасибо за ваш ответ, но вам нужно дать объяснение в своем коде. Может, кто-то еще пытается это сделать, и это нужно. - person robe007; 23.11.2020