Nodemailer no envía correos electrónicos en AWS Elastic Beanstalk.
He alojado mi aplicación de Node.js en Amazon Web Services, con el servicio de Elastic Beanstalk. Estoy enviando correos electrónicos con nodemailer y funcionaba bien localmente, pero después de alojar la aplicación en AWS dejó de enviar correos electrónicos. He intentado resolver el problema pero no funcionó, y también he abierto el puerto 465 pero sin resultados.
Entonces, ¿cómo solucionar el problema, he intentado usar AWS SES pero no funcionó.
Este es el error que estoy obteniendo:
“`
<em>http</em>outgoing.js:561
throw new ERR<em>HTTP</em>HEADERS_SENT('set');
Error [ERR<em>HTTP</em>HEADERS<em>SENT]: No se pueden establecer cabeceras después de que se hayan enviado al cliente
en NodeError nuevo (internal/errors.js:322:7)
14 de diciembre 19:28:14 ip-172-31-18-123 web: en ServerResponse.setHeader (</em>http<em>outgoing.js:561:11)
en ServerResponse.header (/var/app/current/node</em>modules/express/lib/response.js:771:10)
en ServerResponse.send (/var/app/current/node<em>modules/express/lib/response.js:170:12)
en ServerResponse.json (/var/app/current/node</em>modules/express/lib/response.js:267:15)
en /var/app/current/controllers/user<em>api.js:116:32
en /var/app/current/node</em>modules/nodemailer/lib/mailer/index.js:230:21
en /var/app/current/node<em>modules/nodemailer/lib/smtp-transport/index.js:282:36
en SMTPConnection.</em>actionAUTHComplete (/var/app/current/node<em>modules/nodemailer/lib/smtp-connection/index.js:1536:20)
en SMTPConnection.<anonymous> (/var/app/current/node</em>modules/nodemailer/lib/smtp-connection/index.js:540:26) {
code: 'ERR<em>HTTP</em>HEADERS_SENT'
web: }
<code>
Aquí está mi código
</code>
const transport = nodeMailer.createTransport({
service: "gmail",
port: 465,
secure: true,
auth: {
user: process.env.DORENT<em>GMAIL,
pass: process.env.DORENT</em>GMAIL_PASSWORD,
},
});
const mailOption = {
from: process.env.DORENT_GMAIL,
to: user.userMail,
subject: "Verificar dirección de correo electrónico",
html: <code>Haz clic en este enlace para verificar tu correo electrónico: <a href=${url}>${url}</a></code>,
};
<pre><code>// console.log(mailOption);
// console.log(transport);
transport.sendMail(mailOption, (err) => {
if (err) {
return res.status(500).json({ error: "error", message: err.message });
} else {
console.log("El correo ha sido enviado");
}
});
</code></pre>
“`
davy.ai
El mensaje de error sugiere que se están enviando encabezados varias veces, lo que podría estar causando que el envío del correo electrónico falle. Una posible solución podría ser mover la línea
res.status(500)...
fuera del callbacktransport.sendMail()
, para que se ejecute solo una vez que se haya enviado el correo electrónico (o si hay un error al enviar el correo). Aquí tienes una versión actualizada del código:Esto asegurará que la respuesta se envíe solo una vez que se haya enviado el correo electrónico (o si hay un error).
Si esto aún no funciona, otra posible solución sería intentar usar Amazon SES directamente en lugar de un proveedor de correo electrónico de terceros. Aquí tienes un ejemplo de cómo usar SES con nodemailer:
Esto configura nodemailer para usar SES directamente, lo cual puede ayudar si hay problemas con Gmail u otros servicios de correo electrónico de terceros. Asegúrate de configurar correctamente AWS SES, incluyendo verificar tu dirección de correo electrónico como remitente y configurar cualquier rol y política IAM necesarios.