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.

Transfiera el archivo de flujo de node-fetch a nodemailer y, luego, nodemailer lo envía como adjunto.

Estoy intentando enviar un archivo junto con otros campos en el estado en Nextjs utilizando node-fetch. El objetivo no es almacenar el archivo en el servidor (incluso temporalmente), sino transmitirlo desde el navegador web mientras el usuario envía el formulario a Nodemailer, y luego enviarlo por correo electrónico desde Nodemailer como un adjunto junto con otra información.

cliente:

const handleFile = (e) => {
  let file = e.target.files[0];
  let attachment = new FormData();
  attachment.append("file", file);

  fetch(`ruta`, {
    method: "POST",
    headers: {},
    body: attachment,
  })
    .then((response) => {
      if (response.ok) console.log("Subido");
      else console.log("Error");
    })
    .catch((error) => {
      console.log(error);
    });
};

SMTP:

const nodemailer = require("nodemailer");

async function main(subject, html, to, file) {
  let transporter = nodemailer.createTransport({
    // configuración del servidor de correo
  });

  let attachment = [];
  if (file) {
    attachment = [
      {
        filename: file.file[0].originalFilename,
        path: file.file[0].path,
      },
    ];
  }

  const mailOptions = {
    from: from,
    to: to,
    subject: subject,
    html: html,
    attachments: attachment,
  };

  try {
    let info = await transporter.sendMail(mailOptions);
    console.log(info);
  } catch (error) {
    console.error(error, "error al enviar el correo electrónico");
  }
}

API:

const express = require("express");
const router = express.Router();
const multiparty = require("multiparty");
const sendEmail = require("../../utilities/SMTP");

router.post("/ruta", (req, res) => {
  var form = new multiparty.Form();
  form.parse(req, function (err, fields, files) {
    sendEmail(
      "Adjunto de carrera",
      contactEmail(fields),
      "to@mail.com",
      files
    );
    res.send("Su solicitud se envió correctamente");
  });
});

Editar: Puedo transmitir el archivo como un adjunto con el código anterior. – Necesita mejoras.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es genial ver que puedes transmitir el archivo desde el navegador web cuando el usuario envía el formulario a Nodemailer y enviarlo como archivo adjunto junto con otra información utilizando node-fetch, nodemailer y node-multiparty.

    Sin embargo, hay algunas mejoras que podrías hacer en el código:
    – Actualmente no estás enviando ninguna cabecera con la solicitud en el código del “cliente”. Se recomienda enviar la cabecera apropiada de tipo de contenido (“Content-Type”) en la solicitud para el archivo adjunto, por ejemplo: headers: {'Content-Type': 'multipart/form-data'}
    – También se recomienda manejar cualquier error que pueda ocurrir durante el proceso de carga del archivo o envío del correo electrónico. Podrías añadir el manejo de errores utilizando bloques try-catch o devolviendo respuestas de error al cliente.
    – En el código de “SMTP”, actualmente estás comprobando si file existe como un valor verdadero (“truthy”). Esto podría no funcionar como se espera, ya que file podría potencialmente existir pero ser un array vacío, lo que resultaría en el envío de un correo electrónico con un archivo adjunto vacío. Podrías comprobar la existencia de la clave file en el objeto files en su lugar, por ejemplo: if (files.file && files.file.length > 0) { ... }
    – Además, se recomienda sanitizar cualquier entrada de usuario, como las direcciones de correo electrónico que se utilizan en tu código, para evitar posibles vulnerabilidades de seguridad.

Comments are closed.