es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

“`

Tags:  , , , ,

Answer

  1. Avatar for 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 callback transport.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:

    const transport = nodeMailer.createTransport({
      service: "gmail",
      port: 465,
      secure: true,
      auth: {
        user: process.env.DORENT_GMAIL,
        pass: process.env.DORENT_GMAIL_PASSWORD,
      },
    });
    
    const mailOption = {
      from: process.env.DORENT_GMAIL,
      to: user.userMail,
      subject: "Verificar dirección de correo electrónico",
      html: `Por favor, haz clic en este enlace para verificar tu dirección de correo electrónico: <a href="${url}">${url}</a>`,
    };
    
    transport.sendMail(mailOption, (err) => {
      if (err) {
        console.log("Error al enviar el correo electrónico:", err);
      } else {
        console.log("El correo ha sido enviado");
      }
    });
    
    // Enviar respuesta fuera del callback
    res.status(200).json({ message: "Correo electrónico enviado" });
    

    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:

    const aws = require("aws-sdk");
    const nodemailer = require("nodemailer");
    const ses = new aws.SES({ region: "us-east-1" });
    
    const transport = nodemailer.createTransport({
      SES: { ses, aws },
    });
    
    const mailOptions = {
      from: process.env.DORENT_GMAIL,
      to: user.userMail,
      subject: "Verificar dirección de correo electrónico",
      html: `Por favor, haz clic en este enlace para verificar tu dirección de correo electrónico: <a href="${url}">${url}</a>`,
    };
    
    transport.sendMail(mailOptions, (err) => {
      if (err) {
        console.log("Error al enviar el correo electrónico:", err);
      } else {
        console.log("El correo ha sido enviado");
      }
    });
    
    // Enviar respuesta fuera del callback
    res.status(200).json({ message: "Correo electrónico enviado" });
    

    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.

Comments are closed.