nodemailer gmail连接以大量邮件关闭

时间:2017-06-05 09:35:52

标签: node.js nodemailer

我和这篇文章有完全相同的问题: Send multipe emails using nodemailer and gmail

当使用nodemailer和gmail发送太多电子邮件时,我收到421错误,指的是并发会话太多。

我可以做些什么来避免开太多会话?

我已经联系google,他确认我没有受到任何限制(我没有达到每日邮件的数量,邮件/分钟没有限制)。 我试图在发送新邮件之前等待每封邮件发送;在每封邮件中创建和关闭新传输,但在大约第100封电子邮件后我仍然收到此错误。

这里有完整的错误:

{ [Error: Mail command failed: 421 4.7.0 Try again later, closing 
connection. (MAIL) e17sm2124566ede.14 - gsmtp]
code: 'EENVELOPE',
response: '421 4.7.0 Try again later, closing connection. (MAIL) 
e17sm2124566ede.14 - gsmtp',
responseCode: 421,
command: 'MAIL FROM' }

我的代码:

Nodemailer设置:

function setMailTransport () {
  return nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    ignoreTLS: true,
    auth: {
      xoauth2: xoauth2.createXOAuth2Generator({
        user: 'xxxxxx',
        clientId: 'xxxxxx',
        clientSecret: 'xxxxxx',
        refreshToken: 'xxxxxx'
      })
    }
  }))
}

发送唯一邮件:

async function sendEmail (mail) { 
  // mail is an object {from, to, subject, text, html}
  const transport = setMailTransport()
  try {
    await transport.sendMail(mail)
    await transport.close()
    return 1
  } catch (err) {
    console.log(err)
    await transport.close()
    return 0
  }
}

递送异步/等待函数以等待邮件发送之前发送新邮件:

async function sendAlerts (mails, index, numberOfMailSent) {
  // mails is an array of mail object, index start at 0  
  // numberOfMailSent is just a counter to know how many mails have been sent
  if (index >= mails.length) return numberOfMailSent
  const mail = mails[position]
  const newMailSent = await sendEmail(mail)
  return sendAlerts(mails, index + 1, numberOfMailSent + newMailSent)
}

知道我可能在哪里出错或以其他方式发送超过100封邮件?

2 个答案:

答案 0 :(得分:0)

您应该将pool参数添加到您的nodemailer传输器配置对象:

export const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {},
  pool: true
});

有关其他配置选项,您可以选中here

答案 1 :(得分:-2)

使用合并的SMTP:https://nodemailer.com/smtp/pooled/

  

如果使用池化,则Nodemailer会保持固定数量的连接打开,并在连接可用后发送下一条消息。当您有大量要批量发送的消息或者提供商允许您仅使用少量并行连接时,它非常有用。