gpt4 book ai didi

javascript - 使用 nodemailer 一次发送多封电子邮件

转载 作者:行者123 更新时间:2023-12-03 22:19:16 24 4
gpt4 key购买 nike

我正在尝试使用 nodemailer 根据数据库中的条目发送电子邮件。我几乎尝试了我能想到的任何事情(手动创建一个 Promises 数组并在 Promise.all() 调用中使用它,使用 map 等等),但我总是得到相同的错误: UnhandledPromiseRejectionWarning: Error: Message failed: 450 SQLITE_ERROR: cannot start a transaction within a transactionnodemailer -documentation 清楚地指出——当不传递 callback-fn 时,transporter.sendMail() -function 被包装为一个 promise 。但是,当我手动定义一个像这样的 promise 数组时......

const transporter = nodemailer.createTransport(serverData);
const mailData = ...;

const arr = [transporter.sendMail(mailData), transporter.sendMail(mailData)];
...即使我还没有使用 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 中编写异步的方式我认为是错误的我将在这里与你分享你应该编写函数的方式,但是关于你在运行之前触发的 promise 的第一个问题promise.all 这就是当你创建一个像这个 [promise(arg)] 这样的数组时你正在调用该函数的全部内容,因此即使你没有将它放在 promise.all 中,promise 将启动并且 node 将处理它

 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));

关于javascript - 使用 nodemailer 一次发送多封电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64412815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com