gpt4 book ai didi

javascript - NodeJS 延迟发送电子邮件

转载 作者:搜寻专家 更新时间:2023-11-01 00:16:56 24 4
gpt4 key购买 nike

我正在使用 Nodemailer在我的 NodeJS/Express 服务器中发送邮件。我不想直接发送邮件,而是想等 20 分钟再发送邮件。我认为这比直接发送邮件感觉更个性化。

但我不知道如何实现这一点。我想我不需要像这样的 NodeJS cronjob 这样的东西 NodeCron包,还是我?

router.post('/', (req, res) => {
const transporter = nodemailer.createTransport(smtpTransport({
host: 'smtp.gmail.com',
port: 465,
auth: {
user: 'noreply@domain.nl',
pass: 'pass123'
}
}));

const mailOptions = {
from: `"${req.body.name}" <${req.body.email}>`,
to: 'info@domain.nl',
subject: 'Form send',
html: `Content`
};

transporter.sendMail(mailOptions, (error, info) => {
if (error) res.status(500).json({ responseText: error });
res.status(200).json({ responseText: 'Message send!' });
});
}
});

我的路由器如上图所示。因此,如果调用 post,我希望此请求等待 20 分钟。我不想使用 cronjob 只执行一次该帖子,但有一点延迟。有关如何执行此操作的任何建议?

最佳答案

有些人可能会来这里告诉您使用外部队列系统和 bla bla...但您可以简单地使用普通的旧 Javascript 将发送安排到 future 20*60*1000 毫秒以开始工作。 :)

然而,您的代码存在问题:您在向用户发送 200 - 'Message sent' 响应之前等待邮件程序成功。叫我疯子,但我很确定用户不会盯着浏览器窗口 20 分钟,所以你可能必须尽快回答,然后安排邮件。修改代码:

router.post('/', (req, res) => {
const DELAY = 20*60*1000 // min * secs * milliseconds
const transporter = nodemailer.createTransport(smtpTransport({
host: 'smtp.gmail.com',
port: 465,
auth: {
user: 'noreply@domain.nl',
pass: 'pass123'
}
}));

const mailOptions = {
from: `"${req.body.name}" <${req.body.email}>`,
to: 'info@domain.nl',
subject: 'Form send',
html: `Content`
};

res.status(200).json({ responseText: 'Message queued for delivery' });

setTimeout(function(){
transporter.sendMail(mailOptions, (error, info) => {
if (error)
console.log('Mail failed!! :(')
else
console.log('Mail sent to ' + mailOptions.to)
}),
DELAY
);
}
});

然而,此解决方案可能存在许多缺陷。如果您预计该端点上的流量很大,您最终可能会收到许多会吃掉堆栈的预定回调。此外,如果出现故障,用户当然不会知道。

如果这是一个大型/严肃的项目,请考虑使用那个 cronjob 包或使用外部存储机制,您可以在其中对这些“待处理”消息进行排队(Redis 可以做到,而且非常简单),并让不同的进程从中读取任务在那里并执行电子邮件发送。

编辑:在您的代码中看到了更多内容。

1) 您可能不需要在 POST 处理程序中创建一个新的 transport,而是在外部创建并重用它。

2) 除了上述问题外,如果您的服务器崩溃,将永远不会发送电子邮件。

3) 如果您仍想在单个 Node.js 应用程序中执行此操作,而不是为每个对此端点的请求安排电子邮件,您最好存储电子邮件数据(发件人、收件人、主题、正文) 某处并每 20 分钟安排一个函数,该函数将获取所有待处理的电子邮件,一个接一个地发送它们,然后重新安排自身在 20 分钟后重新运行。这将使您的内存使用率保持在较低水平。服务器崩溃仍然会丢失所有电子邮件,但如果您将 REDIS 添加到组合中,那么您可以在应用程序启动时从 REDIS 中简单地获取所有待处理的电子邮件。

答案可能太多了,如果不需要,抱歉! :)

关于javascript - NodeJS 延迟发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42043073/

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