Nodejs nodemailer 直接发送邮件的问题

Nodejs nodemailer 直接发送邮件的问题

我按照nodemailer github上的介绍这段代码 var transport = nodemailer.createTransport();

transport.sendMail(messageOptions, function(error, response){ if(error){ console.log(error); return; }

// response.statusHandler only applies to 'direct' transport
response.statusHandler.once("failed", function(data){
    console.log(
      "Permanently failed delivering message to %s with the following response: %s", 
      data.domain, data.response);
});

response.statusHandler.once(“requeue”, function(data){ console.log(“Temporarily failed delivering message to %s”, data.domain); });

response.statusHandler.once(“sent”, function(data){ console.log(“Message was accepted by %s”, data.domain); });

}); 然后直接报response没有statusHandler这个错,然后这是为什么?因为我想用nodemailer做一个验证 邮件的功能,但可能用户输入非法的地址时他会一直retry,所以我不想让他retry,那具体该怎么做呢,,谢谢。


2 回复

Node.js nodemailer 直接发送邮件的问题

你遇到了一个问题,即在使用 nodemailer 发送邮件时,遇到 response 没有 statusHandler 的错误。这是因为 statusHandlernodemailer-smtp-pool 这个插件的一部分,而不是 nodemailer 本身的功能。因此,你需要确保你已经安装并正确配置了 nodemailer-smtp-pool

下面是一个完整的示例,展示如何使用 nodemailernodemailer-smtp-pool 来发送邮件,并处理发送失败的情况。

安装依赖

首先,确保你已经安装了 nodemailernodemailer-smtp-pool

npm install nodemailer nodemailer-smtp-pool

示例代码

const nodemailer = require('nodemailer');
const smtpPool = require('nodemailer-smtp-pool');

// 创建一个SMTP传输对象
let transporter = nodemailer.createTransport(smtpPool({
    host: 'smtp.example.com',
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
        user: 'your-email@example.com', // 发件人的邮箱
        pass: 'your-password' // 发件人的密码
    },
    maxConnections: 5, // 最大并发连接数
    maxMessages: 100, // 每个连接的最大邮件数
}));

// 邮件选项
let mailOptions = {
    from: '"Fred Foo" <foo@example.com>', // 发件人
    to: 'bar@example.com, baz@example.com', // 收件人
    subject: 'Hello ✔', // 邮件主题
    text: 'Hello world?', // 纯文本正文
    html: '<b>Hello world?</b>' // HTML 正文
};

// 发送邮件
transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error);
    }

    // 使用 statusHandler 处理发送状态
    if (info.messageId) {
        transporter.getSmtpPool().on('data', (event, data) => {
            if (event === 'failed') {
                console.log(`Failed to deliver message to ${data.domain}: ${data.response}`);
            } else if (event === 'requeue') {
                console.log(`Temporary failure delivering message to ${data.domain}`);
            } else if (event === 'sent') {
                console.log(`Message sent successfully to ${data.domain}`);
            }
        });
    }
});

解释

  1. 创建SMTP传输对象:使用 nodemailer-smtp-pool 创建一个 SMTP 传输对象。
  2. 邮件选项:定义邮件的基本信息,如发件人、收件人、主题等。
  3. 发送邮件:调用 sendMail 方法发送邮件。
  4. 处理发送状态:通过监听 data 事件来处理发送状态,包括失败、重试和成功的情况。

这样,你可以更精确地控制邮件的发送过程,并在遇到问题时进行适当的处理。


当你使用 nodemailer 发送邮件时,默认情况下它不会立即尝试直接连接到邮件服务器。如果你遇到了 response 没有 statusHandler 这个错误,可能是由于你的邮件传输策略或者配置问题。

如果你想避免邮件发送失败后重试,可以在配置中设置 maxRetries 参数为 0,以禁用重试机制。同时,你可以使用 nodemailersendMail 方法来处理发送结果,并通过捕获异常来管理错误。

以下是一个示例代码:

const nodemailer = require('nodemailer');

// 创建一个 SMTP 传输对象
let transporter = nodemailer.createTransport({
    host: 'smtp.example.com',
    port: 587,
    secure: false, // 使用 TLS
    auth: {
        user: 'your-email@example.com',
        pass: 'your-password'
    },
    maxRetries: 0 // 禁用重试
});

// 邮件选项
let mailOptions = {
    from: '"Fred Foo" <foo@example.com>', // 发件人
    to: 'bar@example.com', // 收件人
    subject: 'Hello ✔', // 邮件主题
    text: 'Hello world ?', // 文本正文
    html: '<b>Hello world ?</b>' // HTML 正文
};

// 发送邮件
transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error.message);
    }
    console.log('Message sent: %s', info.messageId);
});

在这个例子中,我们禁用了重试机制,并且通过捕获 error 来处理发送过程中的任何错误。这样可以确保如果邮件发送失败,程序不会重试。

希望这能帮助你解决问题!

回到顶部