Доступ к SMTP-серверу с AUTH NTLM из Node.js

Я пытаюсь получить доступ к SMTP-серверу с типом AUTH NTLM.

Я использую nodemailer и nodemailer-smtp-transport как таковые:

var config = require('./config.json');
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
    host : config.mailer.host,
    port: config.mailer.port,
    auth: {
        user: config.mailer.username,
        pass: config.mailer.password
    },
    authMethod: 'PLAIN'
}));

Но это не работает. Ошибка, которую я получаю:

{ [Error: Invalid login: 504 5.7.4 Unrecognized authentication type]
  code: 'EAUTH',
  response: '504 5.7.4 Unrecognized authentication type',
  responseCode: 504 }

Что имеет смысл, потому что, если я подключаюсь к SMTP-серверу через telnet

ehlo server.domain.net
250-server.domin.net Hello [10.100.10.100]
250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-X-ANONYMOUSTLS
250-AUTH NTLM
250-X-EXPS GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XRDST

И введите

AUTH PLAIN

я получил

504 5.7.4 Unrecognized authentication type

Но внутри Node, если я изменю authMethod на «NTLM», я получу сообщение об ошибке

{ [Error: Unknown authentication method "NTLM"] code: 'EAUTH' }

Я подозреваю, что nodemailer просто не поддерживает NTLM. Если это так, как мне подключиться к SMTP-серверу, для которого требуется тип аутентификации NTLM?

Спасибо


person davidx1    schedule 13.04.2016    source источник
comment
github.com/nodemailer/nodemailer/issues/314 — кажется, мы закончили удачи - последний комментарий на момент написания от сопровождающего, который говорит: я ничего не имею против NTLM как такового. Я просто понятия не имею, как это проверить, так как это похоже на Microsoft, и я ничего не знаю о системах на базе Windows.   -  person Stevie    schedule 19.04.2016


Ответы (3)


Моя компания столкнулась с той же проблемой несколько дней назад. Варианты, которые мы рассматривали, были:

  1. Попросите администраторов сервера обмена включить PLAIN-аутентификацию в STARTTLS (это безопасно и требует только установки нескольких флажков)
  2. Настройте локальный ретранслятор (например, постфикс), который ретранслирует на Exchange, и используйте ретранслятор постфикса из nodemailer.
  3. Разветвить nodemailer и добавить поддержку NTLM

К сожалению, мы столкнулись с политическими проблемами на простых вариантах (1) и (2), поэтому пришлось разветвить nodemailer.

Я еще не отправлял запрос на вытягивание, но форк находится здесь. На данный момент самый простой способ использовать его — через npm, напрямую обратившись к проекту github в вашем пакете json, например:

"dependences": {
  "nodemailer": "steveliles/nodemailer"
}

Если вам интересно, большая часть изменений на самом деле была в под-под-проекте (smtp-connection) и ответвления nodemailer, nodemailer-smtp-pool и nodemailer-smtp-transport необходимы только для того, чтобы моя вилка smtp-соединения была поднята.

Нам не нужно было реализовывать протокол NTLM, так как https://github.com/SamDecrock/node-http-ntlm уже проделал тяжелую работу.

Он был протестирован только с Exchange 2007 через TLS (с STARTTLS) и без домена или рабочей станции.

Если вам нужен домен + рабочая станция в учетных данных, просто добавьте их в options.auth nodemailer, и они будут пропущены, например.

var smtpConfig = {
    host: 'ntlm.boo.hoo',
    port: 25,
    auth: {
        domain: 'windows-domain',
        workstation: 'windows-workstation',
        user: '[email protected]',
        pass: 'pass'
    }
};

Нам еще больше не повезло в том, что сервер обмена, к которому мы подключаемся, не имеет действительного SSL-сертификата, но, к счастью, nodemailer может справиться с этим, установив tls: {rejectUnauthorized: false} в настройках.

person Stevie    schedule 22.04.2016
comment
Запрос на включение 46 уже объединен — похоже, поддержка NTLM будет доступна в основном проекте nodemailer довольно скоро — github.com/nodemailer/smtp-connection/pull/46 - person Stevie; 25.04.2016

Начиная с версии 6.x.x вы можете использовать пользовательскую аутентификацию: https://github.com/nodemailer/nodemailer-ntlm-auth

Ссылки: https://nodemailer.com/smtp/#authentication

person Thuan Bui    schedule 28.06.2019

Если это приложение внутреннего/сервисного типа и администратор вашего сервера не возражает, вы можете попросить его создать хост без авторизации и просто избавиться от

auth: {
    user: '-----------',
    pass: '-----------'
}

Поскольку я просто создаю приложение типа службы только для отправки электронных писем по расписанию, мой администратор сервера разрешил это для меня.

У меня сработало, но я уверен, что это решение не для всех!

person JSkyS    schedule 13.09.2019