secure node example createtransport node.js email smtp nodemailer

example - El envío de correo electrónico a través de Node.js usando nodemailer no está funcionando



nodemailer ports (8)

Acabo de configurar mi dominio en: smtp.gmail.com y funciona. Estoy usando un VPS Vultr.

el código:

const nodemailer = require(''nodemailer''); const ejs = require(''ejs''); const fs = require(''fs''); let transporter = nodemailer.createTransport({ host: ''smtp.gmail.com'', port: 465, secure: true, auth: { user: ''[email protected]'', pass: ''xxx'' } }); let mailOptions = { from: ''"xxx" <[email protected]>'', to: ''[email protected]'', subject: ''Teste Templete ✔'', html: ejs.render( fs.readFileSync(''e-mail.ejs'', ''utf-8'') , {mensagem: ''olá, funciona''}) }; transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log(''Message %s sent: %s'', info.messageId, info.response); });

Mi plantilla de ejs (e-mail.ejs):

<html> <body> <span>Esse é um templete teste</span> <p> gerando com o EJS - <%=mensagem%> </p> </body> </html>

Asegurarse:

que tengas un buen día ;)

He configurado un servidor NodeJS básico (usando el módulo nodemailer) localmente ( http://localhost:8080 ) solo para poder probar si el servidor puede enviar correos electrónicos.

Si entiendo la opción SMTP correctamente (corríjame si me equivoco), puedo intentar enviar un correo electrónico desde mi servidor a la cuenta de correo electrónico de alguien directamente , o puedo enviar el correo electrónico, aún usando Node.js, pero a través de una cuenta de correo electrónico real (en este caso, mi cuenta personal de Gmail), es decir, mediante SMTP. Esta opción requiere que inicie sesión en esa cuenta de forma remota a través de NodeJS.

Entonces, en el servidor que aparece a continuación, estoy intentando usar NodeJs para enviar un correo electrónico desde mi cuenta de correo electrónico personal a mi cuenta de correo electrónico personal.

Aquí está mi servidor simple:

var nodemailer = require(''nodemailer''); var transporter = nodemailer.createTransport("SMTP", { service: ''Gmail'', auth: { user: ''*my personal Gmail address*'', pass: ''*my personal Gmail password*'' } }); var http = require(''http''); var httpServer = http.createServer(function (request, response) { transporter.sendMail({ from: ''*my personal Gmail address*'', to: ''*my personal Gmail address*'', subject: ''hello world!'', text: ''hello world!'' }); }).listen(8080);

Sin embargo, no está funcionando. Recibí un correo electrónico de Google diciendo:

Cuenta de Google: intento de inicio de sesión bloqueado Si era usted. Puede cambiar a una aplicación creada por Google como Gmail para acceder a su cuenta (recomendado) o cambiar su configuración en https://www.google.com/settings/security/lesssecureapps para que su cuenta ya no esté protegida por los estándares de seguridad modernos.

No pude encontrar una solución para el problema anterior en la página de GitHub de nodemailer. ¿Alguien tiene una solución / sugerencia?

¡Gracias! :-)


E instale el módulo smtp como dependencia:

npm install smtp

var nodemailer = require(''nodemailer''); var transporter = nodemailer.createTransport({ service: ''gmail'', type: "SMTP", host: "smtp.gmail.com", secure: true, auth: { user: ''[email protected]'', pass: ''YourGmailPassword'' } }); var mailOptions = { from: ''[email protected]'', to: ''[email protected]'', subject: ''Sending Email to test Node.js nodemailer'', text: ''That was easy to test!'' }; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log(''Email sent''); } });

Vaya a https://myaccount.google.com/lesssecureapps y cámbielo porque algunas aplicaciones y dispositivos utilizan una tecnología de inicio de sesión menos segura, lo que hace que su cuenta sea más vulnerable. Puede desactivar el acceso a estas aplicaciones, que recomendamos, o activar el acceso si desea usarlas a pesar de los riesgos.


Intenta este código su trabajo para mí.

var http = require(''http''); var nodemailer = require(''nodemailer''); http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/plain''}); var fromEmail = ''[email protected]''; var toEmail = ''[email protected]''; var transporter = nodemailer.createTransport({ host: ''domain'', port: 587, secure: false, // use SSL debug: true, auth: { user: ''[email protected]'', pass: ''userpassword'' } }); transporter.sendMail({ from: fromEmail, to: toEmail, subject: ''Regarding forget password request'', text: ''This is forget password response from your app'', html: ''<p>Your password is <b>sample</b></p>'' }, function(error, response){ if(error){ console.log(''Failed in sending mail''); console.dir({success: false, existing: false, sendError: true}); console.dir(error); res.end(''Failed in sending mail''); }else{ console.log(''Successful in sending email''); console.dir({success: true, existing: false, sendError: false}); console.dir(response); res.end(''Successful in sending email''); } }); }).listen(8000); console.log(''Server listening on port 8000'');

respuesta:

Successful in sending email { success: true, existing: false, sendError: false } { accepted: [ ''[email protected]'' ], rejected: [], response: ''250 2.0.0 uAMACW39058154 Message accepted for delivery'', envelope: { from: ''[email protected]'', to: [ ''[email protected]'' ] }, messageId: ''[email protected]'' }


La respuesta está en el mensaje de google.

Para la segunda parte del problema, y ​​en respuesta a

En realidad, simplemente estoy siguiendo los pasos de la página de github de nodemailer para que no haya errores en mi código

Lo referiré a la página de github de nodemailer, y este pedazo de código:

var transporter = nodemailer.createTransport({ service: ''Gmail'', auth: { user: ''[email protected]'', pass: ''userpass'' } });

Difiere ligeramente de su código, ya que tiene: nodemailer.createTransport("SMTP" . Elimine el parámetro SMTP y funciona (solo se probó). Además, ¿por qué encapsularlo en un servidor http? Funciona lo siguiente:

var nodemailer = require(''nodemailer''); var transporter = nodemailer.createTransport({ service: ''Gmail'', auth: { user: ''xxx'', pass: ''xxx'' } }); console.log(''created''); transporter.sendMail({ from: ''[email protected]'', to: ''[email protected]'', subject: ''hello world!'', text: ''hello world!'' });


Para aquellos que realmente quieren usar OAuth2 / no quieren que la aplicación sea "menos segura", puede lograrlo al

  1. Busca "API de Gmail" en la consola de Google API y haz clic en "Activar"
  2. Siga los pasos en https://developers.google.com/gmail/api/quickstart/nodejs . En el archivo quickstart.js, cambiando la var SCOPES de [''https://www.googleapis.com/auth/gmail.readonly''] a [''https://mail.google.com/''] en el inicio rápido js archivo provisto como se sugiere en la solución de problemas en https://nodemailer.com/smtp/oauth2/
  3. Después de seguir los pasos en (2), el archivo JSON generado contendrá los acessToken , refreshToken y refreshToken necesarios en los https://nodemailer.com/smtp/oauth2/

De esta manera puede utilizar la autenticación OAuth2 como la siguiente

let transporter = nodemailer.createTransport({ service: ''Gmail'', auth: { type: ''OAuth2'', user: ''[email protected]'', clientId: ''000000000000-xxx0.apps.googleusercontent.com'', clientSecret: ''XxxxxXXxX0xxxxxxxx0XXxX0'', refreshToken: ''1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx'', accessToken: ''ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'', expires: 1484314697598 } });

en lugar de almacenar su contraseña de gmail en texto plano y degradar la seguridad de su cuenta.


Para fines de depuración, es útil implementar una función de devolución de llamada (nunca lo hacen en la página de github de nodemailer) que muestra el mensaje de error (si existe).

transporter.sendMail({ from: from, to: to, subject: subject, html: text }, function(err){ if(err) console.log(err); })

Me ayudó a resolver mi problema ... Resulta que las versiones más nuevas no funcionan correctamente:

"Parece que nodemailer 1.0 tiene cambios importantes, por lo que se debe usar 0.7 en su lugar: http://www.nodemailer.com/

Mensaje publicado en nodemailer a partir del 12/17/15:

No actualice Nodemailer de 0.7 o inferior a 1.0 ya que hay cambios importantes. Puedes seguir usando la rama 0.7 todo el tiempo que quieras. Vea la documentación para 0.7 here ".

Encontré esta respuesta here


Si bien las respuestas anteriores funcionan, me gustaría señalar que puede disminuir la seguridad de Gmail siguiendo los DOS PASOS siguientes.

PASO 1

Cuenta de Google: intento de inicio de sesión bloqueado Si era usted. Puede cambiar a una aplicación creada por Google como Gmail para acceder a su cuenta (recomendado) o cambiar su configuración en https://www.google.com/settings/security/lesssecureapps para que su cuenta ya no esté protegida por los estándares de seguridad modernos.

PASO 2

Además de habilitar Permitir aplicaciones menos seguras, es posible que también deba navegar a https://accounts.google.com/DisplayUnlockCaptcha y haga clic en continuar.


Solo necesita la contraseña de la aplicación para google auth, luego reemplace su contraseña de google en su código. vaya aquí https://myaccount.google.com/apppasswords

Código de muestra:

const nodemailer = require(''nodemailer''); var transporter = nodemailer.createTransport({ service: "Gmail", auth: { user: ''[email protected]'', pass: ''app password here'' } }); transporter.sendMail(option, function(error, info){ if (error) { console.log(error); } else { console.log(''Email sent: '' + info.response); } });