我正在尝试使用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等),但它们都给我同样的错误。
答案 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);