【问题标题】:Nodemailer not sending responseNodemailer没有发送响应
【发布时间】:2022-04-14 04:37:06
【问题描述】:

我正在做我的第一个快递项目。我正在使用 Nodemailer,它可以很好地发送电子邮件,但我没有收到回复。有什么见解吗?这是我用来发送电子邮件的功能。它控制台记录消息发送得很好,但似乎没有响应。

exports.email = function(req, res, options, tokens) {
    receiver_id= options.email.receiver_id;
    message= options.email.message;
    sender_email = options.email.sender_email;
    sender_name = options.email.sender_name;
    slug=options.info.slug;
    org_name=options.info.org_name;
    dir_url=options.info.dir_url;    

    var https = require('https');
    str = '';
    //getting user email by id    

    path = '/api/v1/people/' + receiver_id +'?__proto__=&access_token=' + tokens[slug];
    var options = {
         host: slug + '.nationbuilder.com',
         path: path,
         method: "GET",
         json: true,
         headers: {
             "content-type": "application/json",
             "accept": "application/json"
         },
    }    

    var nb_req = https.get(options, req_callback);    

    function req_callback(response, res) {    

        response.on('data', function(chunk) {
            str += chunk;
        });    

        response.on('end', function() {
            object = JSON.parse(str);
            receiver_email = object.person.email1;
            var nodemailer = require('nodemailer');    

            var transporter = nodemailer.createTransport({
                    port:465,
                    host:"smtp.gmail.com",
                    auth: {
                        user: 'connect@alumninations.com', // Your email id
                        pass: '69$6FK$b6PQu' // Your password
                    }
                });    

                var html = '<p>From: ' + sender_email + '<br>';
                html += 'To: ' + receiver_email + '</p>';
                html += "<p>"+message + "</p>"
                html += "<p>This message was delivered by the " + org_name + " alumni directory website, " + "<a href='" + dir_url
                + "'>" + dir_url + "</p>";



                var mailOptions = {
                    from: 'connect@alumninations.com', // sender address
                    to: 'petervankoughnett@gmail.com', // list of receivers
                    subject: "A message from " + sender_name, // Subject line
                    /*text: "Message sent to", // plaintext body*/
                    html: html 
                };    

                transporter.sendMail(mailOptions, function(error, info){
                    if(error){
                        console.log(error);
                        res.json({yo: 'error'});
                    }else{
                        console.log('Message sent: ' + info.response);
                        res.sendStatus(200);
                    };
                    return res.sendStatus(200);    

                });    


        });    

    }    

}

【问题讨论】:

    标签: node.js express nodemailer


    【解决方案1】:

    您在res.sendStatus(200); 之后缺少res.end()

    transporter.sendMail(mailOptions, function(error, info){
      if (error){
         console.log(error);
         res.json({yo: 'error'});
         res.sendStatus(500);
      }else{
         console.log('Message sent: ' + info.response);
         res.sendStatus(200);
      };
      return res.end();
    }) ;
    

    【讨论】:

    • 似乎是一个很好的建议,但我尝试了它并没有任何改变。
    【解决方案2】:

    使用 res.status(200).json() 代替:

      transporter.sendMail(mailOptions, function(error, info){
     if (error){
     console.log(error);
     res.json({yo: 'error'});
     res.sendStatus(500);
     }else{
     console.log('Message sent: ' + info.response);
     res.status(200).json({"msg": "mesage  has been sent"})
     };});
    

    【讨论】:

      【解决方案3】:

      以下代码在传输器验证和发送邮件功能中对我有用。

      transporter.verify(function (error, success) {
          if (error) {
            console.log(error);
          } else {
            console.log("Server is ready to take our messages");
            res.send(success);
            res.status(200);
          }
        });
      
      
      transporter.sendMail(mailData, function (err, info) {
              if (err) {
                console.log("error: ", err);
              } else {
                console.log("all good", info);
                res.sendStatus(200);
              }
              return res.status(200).end();
               });
              }
      

      【讨论】:

        【解决方案4】:

        这就是 JavaScript 的异步问题。我也有同样的问题。当您在外部调用电子邮件函数时,它不会返回任何内容,因此您将得到“未定义”,因为您在回调函数中返回了响应。

         router.post('/"your api path"',async(req,res)=>{
         //remaining codes
                 transporter.sendMail(mailOptions, function(error, info){
                        if(error){
                            console.log(error);
                            res.status(400).json({yo: 'error'});
                        }else{
                            console.log('Message sent: ' + info.response);
                            res.sendStatus(200);
                        };
                        return res.sendStatus(200);    
                });    
        }
        

        【讨论】:

          【解决方案5】:

          Nodemailer 使用异步进程发送邮件,因此该功能不是即时的,其他功能可能同时运行。

          您需要在函数之后发送响应。

          **let valid = true;**
          transporter.sendMail(mailOptions, function(error, info){
             if(error){
             console.log(error);
             **valid = false;**
             res.json({yo: 'error'});
             }else{
             console.log('Message sent: ' + info.response);
          
            };});
          if(valid){
                  return res.status(200).send({
                      message: "Success"
                  });
              }else{
                  return res.status(500).send({
                      message: "Failed"
                  });
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多