使用Nodemailer发送电子邮件时如何修复ReferenceError

时间:2019-03-29 17:08:44

标签: node.js angular nodemailer

我正在尝试使用Nodemailer通过Node.js从我的Angular应用发送电子邮件

我能够从Angular应用程序捕获数据并将其传递到服务器,但是当我尝试使用Nodemailer发送数据时,以下错误记录到控制台:

SENDING ERROR MESSAGE: connect ETIMEDOUT  
UnhandledPromiseRejectionWarning: ReferenceError: info is not defined

代码在这里失败:

let info = await transporter.sendMail(mailOptions);

这是我的完整 app.js 代码:

const express = require("express");
const app = express();
const bodyParser = require("body-parser");
var nodemailer = require("nodemailer");

app.get("/", (req, res) => {
  res.send("Welcome to Node API");
});

app.get("/getData", (req, res) => {
  res.json({ message: "Hello World" });
});

app.post("/postData", bodyParser.json(), async (req, res) => {
  const output = `
    <p>You have a new contact request</p>
    <h3>Contact Details</h3>
    <ul>
        <li>Name: ${req.body.name}</li>
        <li>Company: ${req.body.message}</li>        
    </ul>    
    `;

  console.log("EMAIL DETAILS: " + output);
  try {
    var transporter = nodemailer.createTransport({
      service: "gmail",
      auth: {
        user: "myaddress@mail.com",
        pass: "myPassword"
      },
      tls: {
        rejectUnauthorized: false
      }
    });
  } catch (err) {
    console.log("TRANSPORTER ERROR MESSAGE: " + err.message);
  }

  const mailOptions = {
    from: "myaddress@mail.com", // sender address
    to: "myaddress@mail.com", // list of receivers
    subject: "Test email", // Subject line
    html: output // plain text body
  };

  try {
    let info = await transporter.sendMail(mailOptions);
  } catch (err1) {
    console.log("SENDING ERROR MESSAGE: " + err1.message);
  }

  console.log("Message sent: %s", info.messageId);
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
});

app.listen(3000, () => console.log("Example app listening on port 3000!"));

有人可以给我一些指导,以防止失败吗?

我还尝试了其他类型的电子邮件地址(hotmail等),但它们都给我同样的错误。

2 个答案:

答案 0 :(得分:0)

您正在let info内定义try/catch,这意味着它与尝试在try/catch之外登录时的作用域不同。

您的代码实际上在此行失败:

  

console.log("Message sent: %s", info.messageId);

let info移动到try/catch块之外。请记住,如果在info中抛出undefined,则Error可能是try/catch

  // define `info` here
  let info;
  try {
   // assign a value here
   info = await transporter.sendMail(mailOptions);
  } catch (err1) {
    console.log("SENDING ERROR MESSAGE: " + err1.message);
  }

  // log `info` here (may be undefined if an Error is thrown)
  console.log("Message sent: %s", info && info.messageId);

答案 1 :(得分:0)

Info 是未定义的,因为您使用具有块 scope 的 let 关键字声明了 info 变量,这意味着它仅限于声明它的块或范围。此外,console.log("Message sent: %s", info.messageId); 将在 try 块(异步事件)中的代码之前运行,因为它是一个同步事件。 更好的写法是

   try {
     // assign a value here
     let info = await transporter.sendMail(mailOptions);
     console.log("Message sent: %s", info.messageId);
     } catch (err1) {
     console.log("SENDING ERROR MESSAGE: " + err1.message);
   }

这样,console.log 就必须等到有信息值后才会记录。

如果你需要使用块外的信息,那么

   let info
   try {
     // assign a value here
     info = await transporter.sendMail(mailOptions);
     } catch (err1) {
     console.log("SENDING ERROR MESSAGE: " + err1.message);
   }
     console.log("Do something with info", info.messageId);
相关问题