node.js - 使用 setTimeout 发送邮件
问题描述
我想每 200 毫秒发送一次电子邮件,但它似乎不适用于承诺:
我的功能:
SendMail.send = function(from, to, subject, body, name, logo) {
var transporter, html,
contactparam = _.find(options.blocks, { name: 'contactparam' }).params,
smtpUsername = _.find(contactparam, { name: 'smtp_username' }),
smtpPassword = _.find(contactparam, { name: 'smtp_password' }),
smtpHost = _.find(contactparam, { name: 'smtp_host' }),
smtpPort = _.find(contactparam, { name: 'smtp_port' }),
compagny = _.find(contactparam, { name: 'compagny' }),
firstname = _.find(contactparam, { name: 'firstname' }),
facebookUrl = _.find(_.find(options.blocks, { name: 'socialparam' }).params, { name: 'facebook' }).value,
twitterUrl = _.find(_.find(options.blocks, { name: 'socialparam' }).params, { name: 'twitter' }).value,
linkedinUrl = _.find(_.find(options.blocks, { name: 'socialparam' }).params, { name: 'linkedin' }).value,
secondaryColor = _.find(_.find(options.blocks, { name: 'themeparam' }).params, { name: 'secondary_color' }).value,
loadedLogo = logo || _.find(_.find(options.blocks, { name: 'logoparam' }).params, { name: 'logo' }).value,
websiteUrl = _.find(_.find(options.blocks, { name: 'mainparam' }).params, { name: 'url' }).value,
templateFile = fs.readFileSync('./app/views/0-templates/' + options.template + '/mail.ejs', 'utf-8'),
loadedName = name || (compagny && compagny.value) || (firstname && name && firstname.value + ' ' + name.value),
ejsTemplate = ejs.compile(templateFile);
html = ejsTemplate({
logo: loadedLogo || '/images/LOGO.png',
websiteUrl: websiteUrl,
body: body,
title: subject,
facebookUrl: facebookUrl,
twitterUrl: twitterUrl,
linkedinUrl: linkedinUrl,
secondaryColor: secondaryColor || '#1c1c1c'
});
if ((smtpUsername && smtpUsername.value !== '') && (smtpPassword && smtpPassword.value !== '') && (smtpHost && smtpHost.value !== '') && (smtpPort && smtpPort.value !== '')) {
transporter = nodemailer.createTransport({
host: smtpHost.value,
pool: true,
port: parseInt(smtpPort.value, 10),
auth: {
user: smtpUsername.value,
pass: smtpPassword.value
}
});
} else {
transporter = nodemailer.createTransport({
sendmail: true,
newline: 'unix',
path: '/usr/sbin/sendmail'
});
}
return transporter.sendMail({
from: loadedName + ' <' + from + '>',
replyTo: from,
to: to,
subject: subject,
html: html
});
};
SendMail.arraySend = function(array) {
var promises = [];
promises = array.map(function (emailObj, index) {
return new Promise(function () {
setTimeout(function () {
return sendMailHelper.send(emailObj.from, emailObj.to, emailObj.title, emailObj.htmlMessage);
}, 200 * index);
});
});
return promises;
};
使用我的功能:
Promise.all(sendMailHelper.arraySend(emailsArray)).then( function() {
request.flash('success', 'Emails sent !');
response.redirect('/');
});
电子邮件数组:
emailsArray.push({
from: from,
to: registration.cfc_user.email,
title: 'Finale : ' + newTournament.name,
htmlMessage: htmlMessage
});
问题:未发送电子邮件。
解决方案
您不能return
从超时调用的函数中调用。此外,调用这么多 Promise 似乎不是一个好主意。
最好的方法是将所有电子邮件分组到一个 Promise 中,返回一个已发送的电子邮件对象和带有错误的电子邮件:
SendMail.arraySend = array => {
return new Promise(resolve => {
let sent = [];
let errors = [];
const finalise = () => {
if ((sent.length + errors.length) >= array.length) {
resolve({ sent, errors });
}
};
array.forEach((emailObj, index) => {
setTimeout(function () {
sendMailHelper.send(emailObj.from, emailObj.to, emailObj.title, emailObj.htmlMessage)
.then(() => {
sent.push(emailObj);
finalise();
});
.catch(() => {
errors.push(emailObj);
finalise();
})
}, 200 * index);
});
});
};
推荐阅读
- javascript - 按具有条件和自定义键的对象数组分组
- javascript - 消除重复
- azure - 如何在 Azure Devops 发布管道中使用 PowerShell 设置环境变量?
- python - 用新方法动态包装任意类
- javascript - Blazor wasm 项目中单击事件时出错
- python - 如何使用 RGB 图像数组的 PyTorch 张量在 colab 中显示视频?
- c++ - 我怎样才能让我的代码不输出无效和 DQed 运动员的分数?
- java - 将特定格式的Java long类型值转换为秒/毫秒
- apache-kafka-connect - Debezium 属性 snapshot.new.tables 不工作
- spring-boot - 无法访问多模块maven项目子模块中的org.springframework.data.repository.PagingAndSortingRepository