【问题标题】:Nodemailer says message sent and accepted, but the email was never sent // Process never completesNodemailer 说消息已发送并接受,但电子邮件从未发送过 // 进程永远不会完成
【发布时间】:2019-11-09 23:51:30
【问题描述】:

我正在测试 Nodemailer 向我的个人电子邮件地址发送测试电子邮件的能力。我使用了 Nodemailer 网站上的一些示例代码来保持简单并尽可能少地引入变量。但是,我有两个主要问题:

1) 虽然回复表明邮件已被我的电子邮件接受并带有 250 状态代码,但我在收件箱或垃圾邮件中找不到该邮件。

2) 尽管我的代码中有一个 return 语句,但该函数永远不会完成——也就是说,我的 Postman 中有一个正在进行的“加载”,而在我的终端中它永远不会让我返回到下一行。

我的 nodemailer.js 文件(使用 nodemailer 推荐的测试帐户):

"use strict";
const nodemailer = require("nodemailer");

exports.mailer = async function() {
  try {
    let testAccount = await nodemailer.createTestAccount();
    console.log(testAccount);
    // 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
      }
    });

    // send mail with defined transport object
    let info = await transporter.sendMail({
      from: '"Mike" <foo@gmail.com>', // sender address
      to: "myemail@gmail.com", // list of receivers
      subject: "Hello ✔", // Subject line
      text: "Hello world?", // plain text body
      html: "<b>Hello world?</b>" // html body
    });

    console.log(info);

    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...
    return;
  }

  catch(err) {
    console.log('error!: ', err);
  }

}

调用该函数的路由:

exports.reset = async function(req, res, next) {
  try {
    const user = await db.User.findOne({
      email: req.body.email
    });

    if (user) {
      mailer();
    }
  }
  catch(err) {
    console.log(err);
    return next({
      status: 400,
      message: 'No user was found with this email address'
    });
  }
};

生成的测试帐号:

{ user: 'ffjxqtgqtjcyvnro@ethereal.email',
  pass: 'DySZuSDckx2Vb3zzRx',
  smtp: { host: 'smtp.ethereal.email', port: 587, secure: false },
  imap: { host: 'imap.ethereal.email', port: 993, secure: true },
  pop3: { host: 'pop3.ethereal.email', port: 995, secure: true },
  web: 'https://ethereal.email' }

回复:

{ accepted: [ 'myemail@gmail.com' ],
  rejected: [],
  envelopeTime: 673,
  messageTime: 1157,
  messageSize: 562,
  response:
   '250 Accepted [STATUS=new MSGID=XRVjPdwpOWUvgMwHXRVjQcwUe2Vy-jP3AAAAAXNi-JPSS9eOph-N0f1.Anw]',
  envelope: { from: 'myemail@gmail.com', to: [ 'myemail@gmail.com' ] },
  messageId: '<ed8b9a0c-e04c-5a5b-62f9-c2ebea5b5f59@gmail.com>' }

【问题讨论】:

    标签: nodemailer forgot-password


    【解决方案1】:

    它可能正在发送,但我看到您使用的是 gmail 地址。确保您将您的 gmail 帐户设置为能够发送这些:https://codeburst.io/sending-an-email-using-nodemailer-gmail-7cfa0712a799

    “在使用 gmail 发送电子邮件之前,您必须允许非安全应用访问 gmail,您可以通过转到您的 gmail 设置来执行此操作”

    您可以在此处了解更多信息:https://myaccount.google.com/lesssecureapps?pli=1

    如果您使用 AWS,我建议您使用 SES。如果您已经设置好,这很容易,而且您不必担心您的电子邮件会变成垃圾邮件或任何带有您的 AWS 验证电子邮件地址的邮件:)

    【讨论】:

    • 目前(为了避免以明文形式写出我的 Gmail 密码)我只是使用 nodemailer 在其默认示例中使用的空灵测试电子邮件服务器。这无效吗?
    • 哇,这真的很酷,我以前从未见过这种空灵的电子邮件。迫不及待地想自己使用它 :) 但看起来整个事情的运作方式可能有些奇怪......就像你应该用真实帐户进行测试一样。您可以使用环境变量 (dotenv) 隐藏密码,因此使用它的 process.env.EMAIL_PASSWORD 而不是实际的东西
    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多