【问题标题】:Nodemailer not working when sending email in a callback在回调中发送电子邮件时,Nodemailer 不工作
【发布时间】:2014-07-24 06:00:33
【问题描述】:

以下是通过忘记密码命中发送电子邮件的代码,它不起作用,但是如果通过文件运行相同的代码,它正在发送电子邮件..让我知道我在使用回调时做错了什么。

以下是代码,它可以工作但发送电子邮件 -

app.post('/forget', function(req, res){
  var userEmail = req.body.email;
  User.findOne({email: userEmail}, function(err, user){
    if (err) {
      res.send({"message": "Wrong!", "err": err, "status_code": "500"});
    }
    else{
      var password = "12345";
      var smtpTransport = nodemailer.createTransport("SMTP",{
          service: "Gmail",
          auth: {
              user: "XXXXX@gmail.com",
              pass: "YYYYY"
          }
      });
      var mailOptions = {
          from: "Team | <XXXXX@gmail.com>",
          to: user.email,
          subject: "Password Change",
          text: "Hello world",
          html: "Your password changed successfully."+ "Your new password is "+ "<style='color: red;'>"+ password +"</style>" // html body
      };   
      console.log(mailOptions);
      smtpTransport.sendMail(mailOptions, function(error, response){
          if(error){
              console.log(error);
          }else{
              console.log("Message sent: " + response.message);
          }
      });        

      user.password = password;
      user.save(function(err){
        if (err) return handleError(err);
        else return res.send({"message": "success", "data": user, "status_code": "200"});
      });
    }
  });
});

它抛出的错误 -

{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }

仅供参考 - 我在代码上方使用var nodemailer = require("nodemailer");,所以情况并非如此。

工作代码-

现在,如果我将相同的代码放在一个文件中并通过node mail.js 命令运行,那么邮件发送成功。

如果有的话,请告诉我我做错了什么

工作代码(只是重复代码)

  var password = "12345";
  var smtpTransport = nodemailer.createTransport("SMTP",{
      service: "Gmail",
      auth: {
          user: "XXXXX@gmail.com",
          pass: "YYYYY"
      }
  });
  var mailOptions = {
      from: "Team | <XXXXX@gmail.com>",
      to: user.email,
      subject: "Password Change",
      text: "Hello world",
      html: "Your password changed successfully."+ "Your new password is "+ "<style='color: red;'>"+ password +"</style>" // html body
  };   
  console.log(mailOptions);
  smtpTransport.sendMail(mailOptions, function(error, response){
      if(error){
          console.log(error);
      }else{
          console.log("Message sent: " + response.message);
      }
  }); 

【问题讨论】:

  • 看起来在您的应用服务器内运行时,与 gmail 邮件服务器的传出 SMTP 连接不起作用。您是在本地运行这一切,还是在远程服务器上运行应用程序服务器?如果是这样,也许服务器有防火墙阻止出站连接。
  • @PeterLyons 我在本地服务器上使用它,并且根据错误消息..我对防火墙这么想,但是在单个文件中运行它时它正在发送邮件,比如 - node mail.js 和它正在成功发送邮件。仅供参考 - 我正在使用前端应用程序,该应用程序在另一个应用程序上点击 api,在该应用程序中我正在使用代码发送电子邮件
  • 我知道,但请仔细检查一下,因为这听起来像是典型的防火墙问题
  • 您可以在服务器上运行tcpdump -i eth0 -nnn port 25 并将输出粘贴到此处吗?
  • @Trialcoder: 好的,然后(以root身份)运行ifconfig,找出用于发送邮件的接口名称,然后使用该接口名称而不是@987654330再次运行tcpdump @.

标签: javascript node.js express callback nodemailer


【解决方案1】:

这不是防火墙问题。我正在使用linemanjs,它通过代理访问 api,目前节点邮件程序不支持代理。

Nodemailer 不支持代理,目前没有计划 添加对这些的任何支持,对不起。

参考 - Nodemailer Issue With Proxy

作为修复,我在我的客户端应用程序(lineman 应用程序)上安装了 nodemailer 模块,并将数据发送到另一个应用程序并接收令牌,在此基础上我通过 nodemailer 发送电子邮件。

【讨论】:

    【解决方案2】:

    降级您的节点邮件程序版本 0.7.1

    在您的终端中使用此命令:- npm install nodemailer@0.7.1 --save

    然后检查你的 package.json 文件

    "dependencies": {
        "body-parser": "~1.15.1",
        "express": "~4.13.4",
        "mongoose": "^4.5.8",
        "nodemailer": "^0.7.1"
    }
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2021-08-06
      • 2013-08-13
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      相关资源
      最近更新 更多