Estoy enviando un correo electrónico usando nodemailer y en caso de que falle un envío, quiero usar un host diferente en un reintento.
Lo intenté:
let tries = 0; let maxTries = 2; const sendEmail = async () => { tries += 1; if (tries === maxTries) return; const transporter = nodemailer.createTransport({ host: tries === 1 ? host1 : host2, port: port, secure: false }); // mailOptions object here.... await transporter.sendMail(mailOptions, (err, info) => { if (err) { return sendEmail(); } else { console.log('Email Sent Successfuly'); } }); }Funciona pero se siente un poco engorroso.
¿Hay una mejor manera de implementar esta característica?
¿Qué tal algo como esto (actualizado por sugerencias de Bergi)?
const sendEmail = async (mailOptions, hosts = [host1, host2]) => { if (hosts .length == 0) { return Promise .reject ('all hosts failed') } // configure transporter try { const info = await transporter .sendMail (mailOptions); return 'Email sent successfully'; } catch (err) { return sendEmail (option, hosts .slice (1)) } }(Por favor, no use esta versión original, por la razón que señaló Bergi)
// DO NOT USE const sendEmail = async (options, hosts = [host1, host2]) => { if (hosts .length == 0) { return Promise .reject ('all hosts failed') } // configure transporter return new Promise ((resolve, reject) => { transporter .sendMail (mailOptions, (err, info) => { if (err) { return sendEmail (option, hosts .slice (1)) } else { resolve ('Email Sent Successfuly'); } }) }) }Podría extenderse fácilmente para manejar algo como:
const hosts = [{host: host1, tries: 3}, {host: host2, tries: 1}, {host: host3, tries: 5}] sendMail (options, hosts)para que probara el primer host tres veces, luego el segundo una vez, luego el tercero cinco veces antes de darse por vencido.