Как исправить ReferenceError при отправке электронной почты с помощью Nodemailer - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь использовать Nodemailer для отправки электронной почты из моего приложения Angular с использованием Node.js

Я могу собирать данные из приложения 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 и т. Д.), Но все они выдают мне ту же ошибку.

1 Ответ

0 голосов
/ 29 марта 2019

Вы определяете let info внутри try/catch, что означает, что он находится в области действия, отличной от того, когда вы пытаетесь зарегистрировать его вне try/catch.

Ваш код фактически не работает в этой строке:

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

Переместить let info за пределы блока try/catch. Имейте в виду, что info может быть undefined, если в try/catch.

добавлено Error.
  // 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);
...