javascript - 错误登录尝试次数过多:使用 nodemailer 发送电子邮件活动
问题描述
在我的应用程序中,我有一些电子邮件活动,大约每月发送一次。我的两个电子邮件活动有一个包含大约 50 多个收件人的邮件列表,而另一个可以有多达 800 多个收件人。我最近遇到了这个问题,我在尝试发送大型电子邮件活动时遇到了这个错误:Error: too many login attempts. Please try again later.
. 在做了一些研究之后,如果我在创建传输时使用 nodemailer 的选项中的 pooling 参数,那将是最好的。
我已经在他们的网站上查看过这个问题,但这是一个非常模糊的部分,并没有真正展示它如何在应用程序中使用。就像添加pool: true
到我的交通选项一样简单吗?或者他们比这更重要。我正在使用 gmail 的 smtp,并且我知道他们会限制可以一次发送的电子邮件数量,因此有一个池来并行处理它们可能会导致问题。
这是我的电子邮件活动文件的样子:
.
.
.
import { FormatEmailReport } from '../imports/Utilities/EmailReports';
import { smtpTransport } from '../imports/Utilities/EmailService';
import performance from 'perf_hooks';
export const SendCampaign = () => {
try {
let date = new Date();
date.setMonth(date.getMonth() - 4); // get 4 months prior to today
date= ConvertDateToYMD(date);
getEmailList(date).then(email_list => {
FormatEmailsToSend(email_list);
}).catch(e => {
console.log('ERROR: micro.getEmailList: ' + e);
})
} catch (e) {
console.log('ERROR: micro.SendCampaign: ' + e);
}
}
export const FormatEmailsToSend = async (email_list) => {
try {
let accepted = [];
let rejected = [];
let t0 = performance.performance.now();
for(let pbid in email_list){
let customer = email_list[pbid][0];
let to = customer.Email;
let txt = `
<div width="100%">
<p>Hi ${customer.Name},</p>
<p>this is a courtesy email from the server</p>
</div>
`
let result = await SendEmail("myemail.com", to, "myemail.com", `Email Subject`, txt, attachment, customer.CustomerID, customer.PBID);
result.Status == 'accepted' ? accepted.push(result) : rejected.push(result);
}
let t1 = performance.performance.now();
let execution_time = (t1-t0)/1000;
FormatEmailReport(accepted,rejected,execution_time,`Email Report`);
} catch (e) {
console.log('ERROR: micro.FormatEmailsToSend: ' + e);
}
}
export const SendEmail = (from, to, bcc, subject, msg, attachments, customer_id, pbid) => {
return new Promise(async (resolve,reject) => {
try {
smtpTransport.sendMail({ //email options
from: from, // sender address. Must be the same as authenticated user if using Gmail.
to: to,
bcc: bcc,
subject: subject, // subject
html: msg, // body
attachments: attachments
}, function (error, res) {
if (error) {
console.log(`Email FAILED for address: ${to}! ERROR: ${error}`);
reject({CustomerID: customer_id, PBID: pbid, Email: to, Status: 'rejected', Msg: error})
} else {
resolve({CustomerID: customer_id, PBID: pbid, Email: to, Status: 'accepted', Msg: res.response})
}
smtpTransport.close();
});
} catch (e) {
console.log('ERROR: micro.SendEmail: ' + e);
reject({CustomerID: customer_id, PBID: pbid, Email: to, Status: 'rejected', Msg: e})
}
})
}
这是我的电子邮件服务文件:
import nodemailer from 'nodemailer';
import env from '../../../env.config.json';
const smtpTransport = nodemailer.createTransport({
service: env.SalesEmail.SERVICE, // "Gmail"
auth: {
user: env.SalesEmail.AUTH.USER,
pass: env.SalesEmail.AUTH.PASS
}
});
module.exports = {smtpTransport}
如果有人对我如何能够使用 nodemailer 的池而不是单个连接有任何想法,那就太好了。蒂亚!
解决方案
推荐阅读
- sql - 我怎样才能查询到这个结果?
- javascript - 我如何过滤数组并返回正确的属性?
- python - 试图理解这段 Matlab 代码
- r - 尝试 .jcall(object, "[[Ljava/lang/String;", "staticMethod", methodParam) 时出现 ArrayIndexOutOfBoundsException
- python - 如何从大数据集的单列中分割字符串?
- ios - 为付费应用设置免费试用
- c# - 计算 ASP .NET Core 博客中的单词
- excel - 考虑到单元格具有不同的字符长度,将单元格拆分为 2
- css - Swiper - 有没有办法在每张幻灯片后自动滚动顶部?
- javascript - 如何使用 jquery 每个循环用多个动态 url 替换多个链接?