соединение nodemailer с Gmail закрыто с большим количеством писем

У меня точно такая же проблема, как и в этом сообщении: Отправляйте несколько писем с помощью nodemailer и gmail < / а>

При отправке слишком большого количества писем с помощью nodemailer и gmail я получаю ошибку 421, относящуюся к слишком большому количеству одновременных сеансов.

Что я могу сделать, чтобы не открывать слишком много сеансов?

Я уже связался с Google, который подтвердил, что я не заблокирован никакими ограничениями (я не набрал количество ежедневных писем, и нет ограничений на почту в минуту). Я пытался дождаться отправки каждого письма перед отправкой нового; для создания и закрытия нового транспорта в каждой почте, но я продолжаю получать эту ошибку примерно после сотого письма.

Вот полная ошибка:

{ [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 / await для ожидания отправки письма перед отправкой нового:

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 писем?


person zevanb    schedule 05.06.2017    source источник


Ответы (2)


Вы должны добавить параметр пула в свой объект конфигурации транспортера nodemailer:

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

Дополнительные параметры конфигурации можно найти здесь

person David Kahara    schedule 31.10.2019

Используйте объединенный SMTP: https://nodemailer.com/smtp/pooled/

Если используется пул, Nodemailer сохраняет фиксированное количество открытых соединений и отправляет следующее сообщение, как только соединение становится доступным. Это в основном полезно, когда у вас есть большое количество сообщений, которые вы хотите отправлять пакетами, или когда ваш провайдер позволяет вам использовать только небольшое количество параллельных соединений.

person Cokadev    schedule 23.08.2017
comment
Ссылка - это не ответ. Пожалуйста, добавьте код и объяснение - person Aleks Andreev; 23.08.2017