Nodemailer SMTP服务器收到电子邮件,但没有任何响应

y3bcpkx1  于 2023-03-01  发布在  Node.js
关注(0)|答案(3)|浏览(223)

我有一个简单的脚本接收电子邮件,即使它接收电子邮件和打印好,不幸的是,不响应发送服务器,(没有250OK)作为一个结果发送服务器不断发送相同的电子邮件(重试)
需要做出哪些响应或可能存在哪些错误?
在这个设置中,这段代码在我的本地网络(OsX)中运行,我的路由器的端口25转发到我的机器。

const SMTPServer = require("smtp-server").SMTPServer;
const parser = require("mailparser").simpleParser

const server = new SMTPServer({

  onData(stream, session, callback) {
    parser(stream, {}, (err, parsed) => {

      if (err){
        console.log("Error:" , err)
      }
      
      eMailParse(parsed)
      stream.on("end", callback)

    })
    
  },
  disabledCommands: ['AUTH']

});

server.listen(25, "192.168.50.20")

console.log("Mail Server Running");

function eMailParse(parsed){
    const {headers, from, to, cc, date, html, text, messageId} = parsed;

    console.log("\n//############# New Mail #############\n")
    console.log(messageId)//Unique Mail ID;
    console.log("\n//$$$$$")
    console.log(from)
    console.log(to)
    console.log(cc)
    console.log(date)
    console.log(text)
    console.log("//====")
    console.log(html)
}

Gmail的回应
收件人服务器未接受我们的连接请求。有关详细信息,请访问https://support.google.com/mail/answer/7720 [dc-133a13304d09.********. fun. nn. nnn. nn:超时]
远程登录响应
421超时-关闭连接连接被外部主机关闭。

hpcdzsge

hpcdzsge1#

过了一会儿,我又试了一会儿,我找到了解决办法。
这部分不行了

eMailParse(parsed)
stream.on("end", callback) //on("end") is never triggered

相反;

eMailParse(parsed)
callback()

就像个护身符。

rryofs0p

rryofs0p2#

我最近遇到了同样的问题。我找到了这个线程,答案对我也有效,但后来我发现了真实的的问题--“end”事件的侦听器应该立即附加在onData回调中,而不是在解析器回调中。下面是解决方案:

const SMTPServer = require("smtp-server").SMTPServer;
const parser = require("mailparser").simpleParser

const server = new SMTPServer({

  onData(stream, session, callback) {
    stream.on("end", callback)
    parser(stream, {}, (err, parsed) => {
      if (err){
        console.log("Error:" , err)
      }
      
      eMailParse(parsed)
    })
  },
  disabledCommands: ['AUTH']
});

server.listen(25, "192.168.50.20")

console.log("Mail Server Running");

function eMailParse(parsed){
    const {headers, from, to, cc, date, html, text, messageId} = parsed;

    console.log("\n//############# New Mail #############\n")
    console.log(messageId)//Unique Mail ID;
    console.log("\n//$$$$$")
    console.log(from)
    console.log(to)
    console.log(cc)
    console.log(date)
    console.log(text)
    console.log("//====")
    console.log(html)
}
xmjla07d

xmjla07d3#

当您使用stream.on("end", callback)注册“end”监听器时,“end”事件已经发生,因此该事件监听器不会被触发,也不会进行回调。
这是因为parser(stream, {}, callback_fcn)中的回调函数(另请参见下面代码中的注解)* 在 * 解析器完成流的使用后调用(或在出现错误之后)。因此,在我们进入(err, parsed) => {\\function body}的函数体的点,流已经结束。并且在我们通过执行stream.on("end", callback)注册“end”侦听器时,“结束”事件已经发生,因此监听器将永远不会触发。

onData(stream, session, callback) {
    parser(stream, {}, (err, parsed) => {
      // at the point where we enter this function body of the parser
      // callback function, the stream has already terminated
      if (err){
        console.log("Error:" , err)
      }
      eMailParse(parsed)
      // this will have no effect because the "end" event 
      // occurred before the listener was registered
      stream.on("end", callback) 
    })
  },
});

您最终的解决方案是有效的,因为您现在是在解析器完成(因此流结束)之后调用回调函数。
最好的方法还应该将callback调用为callback(null, "Success message")callback(err),在解析或其他过程中出现错误的情况下,可以适当地设置err.responseCode

相关问题