You need to enable JavaScript to run this app. 使用Nodemailer经Gmail SMTP发营销邮件报过多登录尝试错误,如何配置连接池?
优惠活动
大模型
产品
解决方案
定价
更多

使用Nodemailer经Gmail SMTP发营销邮件报过多登录尝试错误,如何配置连接池?

核心问题溯源
  • 每发送一封邮件就在回调中调用smtpTransport.close(),导致每发一封就断开SMTP连接,下一次发信要重新走完整的账号认证流程,短时间内几十上百次重复登录直接触发Gmail的too many login attempts风控
  • 未针对Gmail的发信限制做连接数、发送速率的管控,纯依赖单连接反复重建,不仅发送效率极低,还容易被Gmail判定为异常发信行为
  • 连接池默认配置未做适配,直接用默认参数反而会因为并发连接过多加速触发限流
适配Gmail的连接池正确配置

修改EmailService文件中的传输实例配置,不要只加pool: true,要把参数按Gmail的限流规则卡死:

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
    },
    // 连接池核心配置,严格匹配Gmail限流要求
    pool: true, // 开启连接复用
    maxConnections: 2, // 最大并发连接数,Gmail非Workspace账号最多允许2个并发SMTP连接,多了会触发登录限制
    maxMessages: 100, // 单个连接最多发送100封邮件就自动轮换,避免长连接被Gmail主动断开
    rateDelta: 1000, // 发送速率统计窗口为1秒
    rateLimit: 5, // 每个统计窗口最多发5封邮件,等效每分钟最多发300封,完全在Gmail的瞬时速率限额内
});

module.exports = {smtpTransport}

注意:如果使用的是免费个人Gmail账号,每日SMTP发信上限为500封,800收件人的营销活动如果一次性发送会触发每日发信限额,建议拆分为2个间隔12小时以上的批次发送,或使用Gmail Workspace账号将每日发信额度提升至2000封。

原有业务代码的必须修改项
  • 移除每封邮件发送后的手动关连接逻辑
    原来SendEmail函数的回调里写的smtpTransport.close()完全违背连接池的设计目的,必须删掉。连接池会自动维护连接的复用、空闲超时回收,不需要在单封邮件发送后手动断开。
    修改后的SendEmail函数示例:
    export const SendEmail = (from, to, bcc, subject, msg, attachments, customer_id, pbid) => {
        return new Promise((resolve, reject) => {
            smtpTransport.sendMail({
                from: from, // 发件人需与Gmail认证账号一致
                to: to, 
                bcc: bcc,
                subject: subject,
                html: msg,
                attachments: attachments
            }, (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() 已移除
            });
        });
    }
    
  • 调整连接池关闭的时机
    等整个营销活动的所有邮件(含成功、失败的)全部处理完成,生成发送报告之前,再统一调用一次smtpTransport.close()清理所有连接即可,不需要每次发信都关。
  • 补充临时失败的重试逻辑
    针对偶发的临时限流报错(比如短暂的登录频率限制),不要直接将邮件标记为发送失败,可以做最多2次的延迟重试(每次间隔30秒以上),减少非永久性错误导致的发送失败率。
常见配置误区
  • 仅开启pool: true不设置限流参数是无效的:nodemailer连接池默认的最大并发连接是5个、无发送速率限制,这种配置短时间内会对Gmail发起大量连接请求,反而会更快触发too many login attempts的报错
  • 不要盲目调高并发数提升发送速度:Gmail对非Workspace账号的并发连接上限管控非常严格,超过2个并发连接就大概率会被拒绝登录
  • 不要在发信过程中频繁手动关闭传输实例:这会让连接池完全失效,每次发信都重新登录认证,和不开连接池的效果没有区别

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 19:36:06