2017-06-05 2 views
2

J'ai exactement la même question que ce poste: Send multipe emails using nodemailer and gmailnodemailer connexion gmail fermée avec nombre de mails

Lors de l'envoi trop de courriels avec nodemailer et gmail, je reçois une erreur 421, se référant à un trop grand nombre de sessions simultanées . Que puis-je faire pour éviter d'ouvrir trop de sessions?

Je contacte déjà google qui me confirme que je n'ai été bloqué par aucune limitation (je n'ai pas atteint le nombre de courrier quotidien et il n'y a pas de limite de courrier/minute). J'ai essayé d'attendre que chaque courrier soit envoyé avant d'en envoyer un nouveau; pour créer et fermer un nouveau transport à chaque mail, mais je continue à recevoir cette erreur après environ le 100ème email.

Voici l'erreur complète:

{ [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' } 

Et mon code:

paramètres Nodemailer:

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

l'envoi de courrier unique:

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 
    } 
} 

récursive async/Attendent foncti à attendre courrier envoyé avant d'envoyer un nouveau:

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) 
} 

Toute idée de l'endroit où j'aurais eu tort ou sur tout autre moyen d'envoyer plus de 100 mails?

Répondre

-1

Utilisez Pooled SMTP: https://nodemailer.com/smtp/pooled/

If pooling is used then Nodemailer keeps a fixed amount of connections open and sends the next message once a connection becomes available. It is mostly useful when you have a large number of messages that you want to send in batches or your provider allows you to only use a small amount of parallel connections.

+0

Un lien est pas une réponse. S'il vous plaît ajouter un code et une explication –