当前位置: 首页 > 知识库问答 >
问题:

发布JSON发送电子邮件与Nodemailer要么发送邮件,但挂起或抛出一个错误

颜奇希
2023-03-14

我的工作MERN应用程序与一个基本的联系形式,使用Nodemailer发送电子邮件。我想从服务器的某种响应,可以显示在前端,如邮件发送或邮件未发送等...

这是我的第一次尝试(来自server.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被记录到控制台),但是对服务器的发布请求只是挂起,直到它最终超时。所以,因为我无论如何都需要这样做,从服务器获取响应,这将通知前端的用户,我想我应该在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...
});

这会收到一封“已发送邮件!”来自服务器的响应,但服务器抛出此错误:unhandledPromisejectionWarning:TypeError:无法读取未定义的的属性“catch”,并且它不会记录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...
});

这会得到邮件发送!再次响应,但服务器现在抛出此错误:UnhandledPromiseRejtionWarning: TypeError:无法读取未定义的属性'MessageId'

你知道我该怎么做吗?我只需要一个简单的联系表单,当它提交时,会从服务器返回一个状态的响应,告诉我们邮件是否已发送。

共有1个答案

郗唯
2023-03-14

您忘记添加退货,请尝试以下方法:

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!'});
}
 类似资料:
  • 我已经创建了一个帐户与sendInBlue,并导入了nodemailer和nodemailer-sendinblue-transport到我的项目中,我正在尝试发送一个简单的确认电子邮件。下面的代码是我如何尝试安装的: 下面的代码是我的注册方法中负责发送确认邮件的一节: 当我运行我的程序时,注册过程成功,但抛出以下错误,而不是发送电子邮件: 错误:在数据库中找不到键(失败,401) 我读到他们的v

  • 问题内容: 在Swift 的正常情况下,我使用此代码发送邮件。 如何在SwiftUI中实现相同目标? 我需要使用吗? 问题答案: 如前所述,您需要将组件移植到via 。 这是一个简单的实现: 用法 : (在运行iOS 13的iPhone 7 Plus上进行了测试-就像一个护身符) 为Xcode 11.4更新

  • 主要内容:SmtpClient类,示例VB.Net应用程序可发送电子邮件。名称空间包含用于向简单邮件传输协议(SMTP)服务器发送电子邮件以供传送的类。 下表列出了一些常用的类: 编号 类 描述 1 代表电子邮件的附件。 2 将附件存储为电子邮件的一部分。 3 代表电子邮件发件人或收件人的地址。 4 存储与电子邮件关联的电子邮件地址。 5 表示可以使用类发送的电子邮件。 6 允许应用程序使用简单邮件传输协议(SMTP)发送电子邮件。

  • 主要内容:使用 CDOSYS 发送电子邮件,CDONTs 怎么样?,使用 CDOSYS 的实例CDOSYS 是 ASP 中的内建组件。此组件用于通过 ASP 发送电子邮件。 使用 CDOSYS 发送电子邮件 CDO (Collaboration Data Objects) 是一项微软的技术,设计目的是用来简化通讯应用程序的创建。 CDOSYS 是 ASP 中的内建组件。我们将向您演示如何通过 ASP 使用该组件来发送电子邮件。 CDONTs 怎么样? 微软已经在 Windows 2000、

  • 问题内容: 但是我已经尝试了一天多了,以获取与Django一起使用的电子邮件。 我收到此错误消息:当我尝试发送电子邮件时 这是我创建电子邮件并尝试在其视图中发送的地方: 我的设置文件如下: 我尝试过使用进行测试发送python -m smtpd -n -c DebuggingServer localhost:1025并获得了成功,但是当最终归结为真正却没有成功时。 当我尝试从外壳执行send_ma

  • 我不想问关于用flutter发送电子邮件的事。我使用https://pub.dev/packages/flutter_email_sender#-readme-tab-发送电子邮件。 视图.省道