从 Node.js 使用 AUTH NTLM 访问 SMTP 服务器

Accessing SMTP server with AUTH NTLM from Node.js

我正在尝试使用 AUTH 类型的 NTLM 访问 SMTP 服务器。

我正在使用 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 服务器

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。如果是这样,我如何连接到需要 NTLM 身份验证类型的 SMTP 服务器?

谢谢

我公司运行几天前遇到了同样的问题。我们考虑的选项是:

  1. 请交换服务器管理员在 STARTTLS 下启用 PLAIN 身份验证(它是安全的并且似乎只涉及勾选几个复选框)
  2. 设置中继到 Exchange 的本地中继(例如 postfix),并使用来自 nodemailer 的 postfix 中继
  3. 分支 nodemailer 并添加 NTLM 支持

不幸的是,我们在简单的选项 (1) 和 (2) 上遇到了政治问题,所以不得不 fork nodemailer。

我还没有发送拉取请求,但是分支是 here。目前最简单的使用方法是通过 npm 直接引用包 json 中的 github 项目,例如:

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

如果您有兴趣,大部分更改实际上是在子项目中进行的(smtp-connection), and the forks of nodemailer, nodemailer-smtp-pool, and nodemailer-smtp-transport 只需要让我的 smtp 连接分支被拾取。

我们不需要实施 NTLM protocol, as SamDecrock's httpntlm 已经完成了艰苦的工作。

它仅通过 TLS(使用 STARTTLS)针对 Exchange 2007 进行了测试,没有域或工作站。

如果您确实需要在凭据中使用域 + 工作站,只需将它们添加到 nodemailer 的 options.auth 中,它们就会通过,例如

var smtpConfig = {
    host: 'ntlm.boo.hoo',
    port: 25,
    auth: {
        domain: 'windows-domain',
        workstation: 'windows-workstation',
        user: 'user@somedomain.com',
        pass: 'pass'
    }
};

我们更不幸的是,我们连接的交换服务器没有有效的 SSL 证书,但幸运的是 nodemailer 可以通过在选项中设置 tls: {rejectUnauthorized: false} 来处理这个问题。

从版本 6.x.x 开始,您可以使用自定义身份验证: https://github.com/nodemailer/nodemailer-ntlm-auth

参考文献:https://nodemailer.com/smtp/#authentication

如果这是一个 internal/service 类型的应用程序并且您的服务器管理员不介意,您可以要求他们在未经授权的情况下创建一个主机并删除

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

因为我只是创建一个服务类型的应用程序只是为了按计划发送电子邮件,所以我的服务器管理员允许我这样做。

对我有用,但我敢肯定这个解决方案并不适合所有人!