使用 nodemailer 一次发送多封电子邮件
Sending multiple emails at once with nodemailer
我正在尝试使用 nodemailer
根据数据库中的条目发送电子邮件。我已经尝试了几乎所有我能想到的方法(手动创建一个 Promises
的数组并在 Promise.all()
的调用中使用它,使用 map
等),但我总是不断收到相同的错误:UnhandledPromiseRejectionWarning: Error: Message failed: 450 SQLITE_ERROR: cannot start a transaction within a transaction
。 nodemailer
-文档明确指出——当不传递回调函数时,transporter.sendMail()
-函数被包装为一个承诺。但是,当我像这样手动定义这些承诺的数组时...
const transporter = nodemailer.createTransport(serverData);
const mailData = ...;
const arr = [transporter.sendMail(mailData), transporter.sendMail(mailData)];
...即使我什至没有 'ran' 使用 Promise.all()
通过该数组,同样的错误已经发生;难道我手动指定数组中的函数只会运行是一种误解吗?
总之,这是我的数据库的完整代码;我正在使用 sequelize
从数据库中检索数据。我已验证此任务的从数据库端检索数据没有问题。
class Mail extends Model {
...
static resendUndeliveredMails(){
this.findAll()
.then((mails) => {
return Promise.all(mails.map(async mail => {
transporter.sendMail(mail.dataValues);
}));
})
.catch((e) => {
console.log(e);
});
}
}
如有任何帮助,我们将不胜感激!提前谢谢你:).
我已经用 promise.all 测试了 nodeMailer API 并且我没有发现它有任何问题这是我在下面使用的代码,我认为你得到的错误与另一件事有关均衡器或 SQL 导致你得到的错误被 SQLITE_ERROR UnhandledPromiseRejectionWarning: Error: Message failed: 450 SQLITE_ERROR: cannot start a transaction within a transaction
抛出,另一件事是你在承诺中编写异步的方式我认为是错误的我将在这里与您分享您应该编写函数的方式,但是关于您关于在您之前触发的承诺的第一个问题 运行 promise.all 这就是您创建 Array-like 这个 [promise(arg)]
你在那一刻调用函数所以承诺将开始并且节点将处理它即使你不把它放在 promise.all
static async resendUndeliveredMails() {
try {
const mails = await findAll();
const mailerPromises = mails.map((mail) => transporter.sendMail(mail.dataValues));
const responses = await Promise.all(mailerPromises);
console.log(responses, "All Mails Have Been Sent Successfully");
} catch (e) {
console.log(e);
}
}
const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: "user",
pass: "pass", // naturally, replace both with your real credentials or an application-specific password
},
});
const mailOptions = {
from: "user@gmail.com",
to: "test@gmail.com",
subject: "testing due",
text: "Dudes, we really need your money.",
};
const mailOptions2 = {
from: "user@gmail.com",
to: "test1@gmail.com",
subject: "LOL due",
text: "Dudes, we really need your money.",
};
Promise.all([
transporter.sendMail(mailOptions),
transporter.sendMail(mailOptions2),
])
.then((res) => console.log(res))
.catch((err) => console.log(err));
我正在尝试使用 nodemailer
根据数据库中的条目发送电子邮件。我已经尝试了几乎所有我能想到的方法(手动创建一个 Promises
的数组并在 Promise.all()
的调用中使用它,使用 map
等),但我总是不断收到相同的错误:UnhandledPromiseRejectionWarning: Error: Message failed: 450 SQLITE_ERROR: cannot start a transaction within a transaction
。 nodemailer
-文档明确指出——当不传递回调函数时,transporter.sendMail()
-函数被包装为一个承诺。但是,当我像这样手动定义这些承诺的数组时...
const transporter = nodemailer.createTransport(serverData);
const mailData = ...;
const arr = [transporter.sendMail(mailData), transporter.sendMail(mailData)];
...即使我什至没有 'ran' 使用 Promise.all()
通过该数组,同样的错误已经发生;难道我手动指定数组中的函数只会运行是一种误解吗?
总之,这是我的数据库的完整代码;我正在使用 sequelize
从数据库中检索数据。我已验证此任务的从数据库端检索数据没有问题。
class Mail extends Model {
...
static resendUndeliveredMails(){
this.findAll()
.then((mails) => {
return Promise.all(mails.map(async mail => {
transporter.sendMail(mail.dataValues);
}));
})
.catch((e) => {
console.log(e);
});
}
}
如有任何帮助,我们将不胜感激!提前谢谢你:).
我已经用 promise.all 测试了 nodeMailer API 并且我没有发现它有任何问题这是我在下面使用的代码,我认为你得到的错误与另一件事有关均衡器或 SQL 导致你得到的错误被 SQLITE_ERROR UnhandledPromiseRejectionWarning: Error: Message failed: 450 SQLITE_ERROR: cannot start a transaction within a transaction
抛出,另一件事是你在承诺中编写异步的方式我认为是错误的我将在这里与您分享您应该编写函数的方式,但是关于您关于在您之前触发的承诺的第一个问题 运行 promise.all 这就是您创建 Array-like 这个 [promise(arg)]
你在那一刻调用函数所以承诺将开始并且节点将处理它即使你不把它放在 promise.all
static async resendUndeliveredMails() {
try {
const mails = await findAll();
const mailerPromises = mails.map((mail) => transporter.sendMail(mail.dataValues));
const responses = await Promise.all(mailerPromises);
console.log(responses, "All Mails Have Been Sent Successfully");
} catch (e) {
console.log(e);
}
}
const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: "user",
pass: "pass", // naturally, replace both with your real credentials or an application-specific password
},
});
const mailOptions = {
from: "user@gmail.com",
to: "test@gmail.com",
subject: "testing due",
text: "Dudes, we really need your money.",
};
const mailOptions2 = {
from: "user@gmail.com",
to: "test1@gmail.com",
subject: "LOL due",
text: "Dudes, we really need your money.",
};
Promise.all([
transporter.sendMail(mailOptions),
transporter.sendMail(mailOptions2),
])
.then((res) => console.log(res))
.catch((err) => console.log(err));