首页 > 解决方案 > 错误登录尝试次数过多:使用 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 的池而不是单个连接有任何想法,那就太好了。蒂亚!

标签: javascriptnodemailer

解决方案


推荐阅读