#node.js #amazon-web-services #email #ssl
#node.js #amazon-веб-сервисы #Адрес электронной почты #ssl
Вопрос:
Я создаю приложение, которое будет использовать AWS SES для отправки электронной почты через SMTP. Я правильно настроил домен и подтвердил, что могу отправлять электронную почту с этого домена с помощью AWS SDK. Я создал учетные данные SMTP и убедился, что пользователь IAM правильно настроен с правильными разрешениями. Я написал тестовый скрипт, который использует Nodemailer для отправки электронной почты.
Тестовый сценарий успешно выполняется с использованием моей персональной машины разработки в моей домашней сети, но сценарий НЕ будет работать при использовании ноутбука разработки, выпущенного моим корпоративным клиентом, в моей домашней сети. На корпоративном ноутбуке запущено множество инструментов безопасности, включая ZScaler. Я также знаю, что из-за службы ZScaler NPM должен быть настроен на использование самозаверяющего сертификата (команда npm config set cafile {CA_FILEPATH}
).
Я не знаю, почему скрипт не будет работать на корпоративном ноутбуке, и я был бы признателен за помощь в определении того, что попробовать дальше.
Вот сценарий:
'use strict';
const nodemailer = require('nodemailer');
const runtest = async function() {
console.debug('Creating the SMTP transport');
const transporter = nodemailer.createTransport({
host: 'email-smtp.us-west-2.amazonaws.com',
port: 465,
secure: true,
auth: {
user: 'myusername',
pass: 'mypassword',
},
});
console.debug('Building mail options');
const mailOptions = {
from: 'me@example.com',
to: 'you@example.com',
subject: 'subject',
text: 'body',
html: '<h1>Hi</h1',
};
console.debug('Sending mail...');
const info = await transporter.sendMail(mailOptions);
console.debug(`Sent mail. Info: ${JSON.stringify(info, null, 2)}`);
console.info('Message sent!');
};
runtest().catch(console.error);
Вот результат при запуске с корпоративного ноутбука:
Creating the SMTP transport
Building mail options
Sending mail...
Error: read ECONNRESET
at TLSWrap.onStreamRead (internal/stream_base_commons.js:200:27) {
errno: 'ECONNRESET',
code: 'ESOCKET',
syscall: 'read',
command: 'CONN'
}
Вещи, которые я пробовал:
- Игра с настройками TLS, такими как
rejectUnauthorized: false
и указание версии TLS - Подключение к корпоративной VPN или отключение от нее
- Я нашел ссылку на эту проблему Github, в которой предлагалось протестировать соединение с
openssl
. Я выполнил эту командуopenssl s_client -connect email-smtp.us-west-2.amazonaws.com:465
, и это был результат (кажется, нормально):
CONNECTED(0000021C)
write:errno=10054
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 336 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
Комментарии:
1. какая у вас версия узла на вашем корпоративном ноутбуке. попробуйте использовать версию узла выше v12 и посмотрите, работает ли она hppens
2. Справедливый вопрос. в настоящее время мой ноутбук использует версию 12.15.0.
3. Пожалуйста, попробуйте последнюю версию. 13 или 14
Ответ №1:
В моем случае причиной этой ошибки была версия узла. Я обновил версию своего узла до версии 12.x, чтобы устранить проблему.
Комментарии:
1. В настоящее время на моем ноутбуке используется версия 12.15.0, и я использовал NVM для Windows для установки 14.9.0, обновления пакетов и повторной попытки. К сожалению, я все еще получаю тот же результат. Тем не менее, спасибо за предложение.
2. извините, что это вам не помогло. после установки вы убедились, что при тестировании nodejs равно 14? вы можете сделать
node -v
, чтобы подтвердить это3. Да, я выполнил эту команду для подтверждения версии, удалил все локальные пакеты npm и переустановил их перед запуском тестов.