【问题标题】:Accessing SMTP server with AUTH NTLM from Node.js从 Node.js 使用 AUTH NTLM 访问 SMTP 服务器
【发布时间】:2016-08-04 00:19:05
【问题描述】:

我正在尝试使用 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 }

这是有道理的,因为如果我 telnet 进入 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 服务器?

谢谢

【问题讨论】:

  • github.com/nodemailer/nodemailer/issues/314 - 看来我们运气不好 - 撰写本文时的最后一条评论来自维护者说:“我对 NTLM 本身没有任何意见。我只是不知道如何测试它似乎是微软特有的,我对基于 Windows 的系统一无所知"

标签: node.js email smtp ntlm nodemailer


【解决方案1】:

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

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

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

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

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

如果您有兴趣,大部分更改实际上是在一个子子项目(smtp-connection)中,nodemailernodemailer-smtp-poolnodemailer-smtp-transport 的分支只需要我的smtp-connection fork 被拾取。

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

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

如果您在凭据中确实需要域 + 工作站,只需将它们添加到 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} 来处理。

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    如果这是一个内部/服务类型的应用程序并且你的服务器管理员不介意,你可以要求他们在没有授权的情况下创建一个主机然后摆脱

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

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

    为我工作,但我确信这个解决方案并不适合所有人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 2015-08-28
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2013-10-26
      • 2016-09-10
      相关资源
      最近更新 更多