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

时间:2016-04-13 05:26:53

标签: node.js email smtp ntlm nodemailer

我正在尝试访问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服务器?

由于

3 个答案:

答案 0 :(得分:4)

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

  1. 要求交换服务器管理员在STARTTLS下启用PLAIN身份验证(它是安全的,似乎只涉及勾选几个复选框)
  2. 设置中继到Exchange的本地中继(例如postfix),并使用来自nodemailer的后缀中继
  3. Fork nodemailer并添加NTLM支持
  4. 不幸的是,我们在简单的选项(1)和(2)上遇到了政治问题,所以不得不使用fork nodemailer。

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

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

    如果您有兴趣,大部分更改实际上是在子项目(smtp-connection)中,以及nodemailernodemailer-smtp-pool和{的分支只需要获取我的smtp-connection fork就可以使用{3}}。

    我们并不需要实施nodemailer-smtp-transport,因为NTLM protocol已经做了很多努力。

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

    如果您确实需要凭据中的域+工作站,只需将它们添加到节点制作者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}来解决这个问题。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果这是内部/服务类型的应用程序,并且您的服务器管理员不介意,您可以要求他们未经授权而创建主机,而直接删除

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

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

为我工作,但我确定此解决方案并不适合所有人!