发布 JSON 以使用 Nodemailer 发送电子邮件要么发送邮件,但挂起或抛出错误



我正在使用一个基本的联系表单来开发MERN应用程序,该表单使用Nodemailer发送电子邮件。我想要来自服务器的某种可以在前端显示的响应,例如"邮件已发送"或"邮件未发送"等......

这是我的第一次尝试(来自服务器.js的代码(,基于这里的例子:

myRoutes.route('/send-mail').post(async function(req, res) {
let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: 'smtp.ethereal.email',
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass // generated ethereal password
}
});
let senderName = req.body.senderName;
let senderEmail = req.body.senderEmail;
let subject = req.body.subject;
let message = req.body.message;
let toEmail = req.body.toEmail;
// send mail with defined transport object
let info = await transporter.sendMail({
from: `"${senderName}" <${senderEmail}>`, // sender address
to: toEmail, // receiver address
subject: subject, // Subject line
text: message, // plain text body
html: message
});
console.log('Message sent: %s', info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});

这有效(发送邮件,并将预览 URL 记录到控制台(,但对服务器的 post 请求只是挂起,直到最终超时。因此,由于无论如何我都需要这样做,为了从服务器获取响应,这将通知前端的用户,我想我会在 sendMail 函数之后添加一个回调。

带回调的代码:

myRoutes.route('/send-mail').post(async function(req, res) {
let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: 'smtp.ethereal.email',
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass // generated ethereal password
}
});
let senderName = req.body.senderName;
let senderEmail = req.body.senderEmail;
let subject = req.body.subject;
let message = req.body.message;
let toEmail = req.body.toEmail;
// send mail with defined transport object
let info = await transporter.sendMail({
from: `"${senderName}" <${senderEmail}>`, // sender address
to: toEmail, // receiver address
subject: subject, // Subject line
text: message, // plain text body
html: message
},function(){
res.json('Mail sent!');
}).catch(err => {
res.json("Couldn't send the mail for some reason");
});
console.log('Message sent: %s', info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});

这会从服务器获得"邮件已发送!"响应,但服务器抛出此错误:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'catch' of undefined,并且它不记录 messageID 或预览 URL,所以我不确定它是否真的发送了邮件。

我尝试在捕获之前将err作为参数传递给函数,但这没有帮助。

我也尝试完全删除捕获(见下文(:

myRoutes.route('/send-mail').post(async function(req, res) {
let testAccount = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: 'smtp.ethereal.email',
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: testAccount.user, // generated ethereal user
pass: testAccount.pass // generated ethereal password
}
});
let senderName = req.body.senderName;
let senderEmail = req.body.senderEmail;
let subject = req.body.subject;
let message = req.body.message;
let toEmail = req.body.toEmail;
// send mail with defined transport object
let info = await transporter.sendMail({
from: `"${senderName}" <${senderEmail}>`, // sender address
to: toEmail, // receiver address
subject: subject, // Subject line
text: message, // plain text body
html: message
},function(){
res.json('Mail sent!');
});
console.log('Message sent: %s', info.messageId);
// Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
// Preview only available when sending through an Ethereal account
console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));
// Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
});

这会再次收到"邮件已发送!"响应,但服务器现在抛出此错误:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'messageId' of undefined

知道我如何让它工作吗?我只需要一个简单的联系表单,提交后,它会从服务器发送回响应,并告诉我们邮件是否已发送状态。

你忘了添加return,试试这样:

let info = await transporter.sendMail({
from: `"${senderName}" <${senderEmail}>`, // sender address
to: toEmail, // receiver address
subject: subject, // Subject line
text: message, // plain text body
html: message
}).then((data)=>{return data}).catch((error)=> {return error});
if(info.messageId){
console.log('Message sent: %s', info.messageId);
res.json({message:'Mail sent!'});
}else{
console.log('Message Not sent');
res.json({message:'Mail not sent!'});
}

最新更新