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,那具体该怎么做呢,,谢谢。
Node.js nodemailer 直接发送邮件的问题
你遇到了一个问题,即在使用 nodemailer
发送邮件时,遇到 response
没有 statusHandler
的错误。这是因为 statusHandler
是 nodemailer-smtp-pool
这个插件的一部分,而不是 nodemailer
本身的功能。因此,你需要确保你已经安装并正确配置了 nodemailer-smtp-pool
。
下面是一个完整的示例,展示如何使用 nodemailer
和 nodemailer-smtp-pool
来发送邮件,并处理发送失败的情况。
安装依赖
首先,确保你已经安装了 nodemailer
和 nodemailer-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}`);
}
});
}
});
解释
- 创建SMTP传输对象:使用
nodemailer-smtp-pool
创建一个 SMTP 传输对象。 - 邮件选项:定义邮件的基本信息,如发件人、收件人、主题等。
- 发送邮件:调用
sendMail
方法发送邮件。 - 处理发送状态:通过监听
data
事件来处理发送状态,包括失败、重试和成功的情况。
这样,你可以更精确地控制邮件的发送过程,并在遇到问题时进行适当的处理。
当你使用 nodemailer
发送邮件时,默认情况下它不会立即尝试直接连接到邮件服务器。如果你遇到了 response
没有 statusHandler
这个错误,可能是由于你的邮件传输策略或者配置问题。
如果你想避免邮件发送失败后重试,可以在配置中设置 maxRetries
参数为 0
,以禁用重试机制。同时,你可以使用 nodemailer
的 sendMail
方法来处理发送结果,并通过捕获异常来管理错误。
以下是一个示例代码:
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
来处理发送过程中的任何错误。这样可以确保如果邮件发送失败,程序不会重试。
希望这能帮助你解决问题!