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

我试图访问AUTHtypesNTLM的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 

然后input

 AUTH PLAIN 

我明白了

 504 5.7.4 Unrecognized authentication type 

但是在Node里面,如果我把authMethod改成'NTLM',我得到一个错误

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

我怀疑nodemailer只是不支持NTLM。 如果是这种情况,我如何连接到需要NTLM身份validationtypes的SMTP服务器?

谢谢

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

  1. 要求交换服务器pipe理员在STARTTLS下启用PLAIN身份validation(这是安全的,似乎只涉及勾选几个checkbox)
  2. 设置中继到Exchange的本地中继(例如后缀),并使用来自nodemailer的后缀中继
  3. 叉节点pipe理器并添加NTLM支持

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

我还没有发送拉请求,但叉子在这里 。 暂时最简单的方法是使用npm,通过直接引用包json中的github项目,例如:

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

如果你有兴趣,大部分的变化实际上是在一个子项目( smtp连接 ),并且节点制造者 , nodemailer-smtp-pool和nodemailer-smtp-transport的fork只是为了让我的smtp连接叉子被拿起。

我们不需要实现NTLM协议 ,因为SamDecrock的httpntlm已经做了很多工作。

它只通过TLS(使用STARTTLS)进行了Exchange 2007testing,没有域或工作站。

如果你确实需要在证书中使用domain + workstation,只需将它们添加到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}来处理这个问题。