Estaba funcionando y luego no. Envié algunos correos y después de un tiempo dejó de funcionar. Recibo "Mensaje enviado: Indefinido" (nodo: 9048) Advertencia de rechazo de promesa no controlada: Error: generar ENOENT de sendmail en Process.ChildProcess._handle.onexit (internal/child_process.js:269:19)
No tengo ni idea de porqué.
Frontend: la consola de Axios registra los datos de respuesta, por lo tanto, el servidor y el frontend funcionan. Es solo el problema con el Nodemailer.
Cualquier ayuda es apreciada. ¡Gracias!
const express = require("express"); const app = express(); const cors = require("cors"); const nodemailer = require("nodemailer"); const path = require("path"); const fs = require("fs"); const readData = path.join(__dirname, "../email_take2/data.json"); const { v4: uuidv4 } = require("uuid"); app.use(express.json()); app.use(cors()); const port = process.env.PORT || 5000; app.listen(5000, () => console.log(`Listening at port ${port}`)); if (process.env.NODE_ENV === "production") { // Set static folder app.use(express.static("../client/build")); app.get("*", (req, res) => { res.sendFile(path.join(__dirname, "../client", "build", "index.html")); }); } function listUserData() { const data = fs.readFileSync(readData); return JSON.parse(data); } app.post("/sendEmail", function (req, res) { console.log(req.body); const emailInfo = { id: uuidv4(), email: req.body.email, cc: req.body.cc, message:req.body.message, }; const dataArray = listUserData(); dataArray.push(emailInfo); fs.writeFileSync(readData, JSON.stringify(dataArray)); res.send(emailInfo); console.log("SentBody", emailInfo); let transporter = nodemailer.createTransport({ sendmail:true, host: "smtp.outlook.com", port: 587, secure: false, // true for 465, false for other ports tls: { ciphers: "SSLv3", }, auth: { user: "memail@outlook.com", // generated ethereal user pass: "mypw", // generated ethereal passwordAccount.pass, }, }); // send mail with defined transport object let info = transporter.sendMail({ from: '"Fred Foo 👻" <foo@example.com>', // sender address to: "garbageacc7878@outlook.com", // list of receivers subject: "Hello ✔", // Subject line text: "Hello world?", // plain text body html: "<b>Hello world?</b>", // html body }); console.log("Message sent: %s", info.messageId); return emailInfo; });
transporter.sendMail
devuelve una promesa, es por eso que el registro de su consola tiene undefined
. Entonces adjunte un .then
y .catch
.
transporter.sendMail(...) .then((data)=>{console.log('Mail sent', data)}) .catch(err => {console.error('Failure',err)})
O haga que su controlador de solicitudes sea una función asíncrona y use async await
await y use tryCatch
.
try{ let data = await transporter.sendMail(...) console.log('Mail sent', data) } catch (err) { console.error('Failure',err) }