tutorial node example javascript node.js nodemailer

javascript - example - nodemailer promise



Nodemailer con Gmail y NodeJS (21)

Intento usar nodemailer para implementar un formulario de contacto usando NodeJS pero funciona solo en local, no funciona en un servidor remoto ...

Mi mensaje de error:

[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX [website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC [website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX [website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r [website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again. [website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787 [website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp] [website.fr-11 (out) 2013-11-09T15:40:26] name: ''AuthError'', [website.fr-11 (out) 2013-11-09T15:40:26] data: ''534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX/r/n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC/r/n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX/r/n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r/r/n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again./r/n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787/r/n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp'', [website.fr-11 (out) 2013-11-09T15:40:26] stage: ''auth'' }

Mi controlador

exports.contact = function(req, res){ var name = req.body.name; var from = req.body.from; var message = req.body.message; var to = ''*******@gmail.com''; var smtpTransport = nodemailer.createTransport("SMTP",{ service: "Gmail", auth: { user: "******@gmail.com", pass: "*****" } }); var mailOptions = { from: from, to: to, subject: name+'' | new message !'', text: message } smtpTransport.sendMail(mailOptions, function(error, response){ if(error){ console.log(error); }else{ res.redirect(''/''); } }); }


Bien trabajado

1- instale nodemailer , paquete si no está instalado (escriba cmd): npm install nodemailer

2- vaya a https://myaccount.google.com/lesssecureapps y active Permitir aplicaciones menos seguras .

3- escribir código:

var nodemailer = require(''nodemailer''); var transporter = nodemailer.createTransport({ service: ''gmail'', auth: { user: ''[email protected]'', pass: ''truePassword'' } }); const mailOptions = { from: ''[email protected]'', // sender address to: ''[email protected]'', // list of receivers subject: ''test mail'', // Subject line html: ''<h1>this is a test mail.</h1>''// plain text body }; transporter.sendMail(mailOptions, function (err, info) { if(err) console.log(err) else console.log(info); })

4- disfrutar!



Debería usar un token XOAuth2 para conectarse a Gmail. No te preocupes, Nodemailer ya lo sabe:

var smtpTransport = nodemailer.createTransport(''SMTP'', { service: ''Gmail'', auth: { XOAuth2: { user: smtpConfig.user, clientId: smtpConfig.client_id, clientSecret: smtpConfig.client_secret, refreshToken: smtpConfig.refresh_token, accessToken: smtpConfig.access_token, timeout: smtpConfig.access_timeout - Date.now() } } };

Tendrá que ir a Google Cloud Console para registrar su aplicación. Luego, necesita recuperar tokens de acceso para las cuentas que desea usar. Puedes usar el pasaporte para eso.

Así es como se ve en mi código:

var passport = require(''passport''), GoogleStrategy = require(''./google_oauth2''), config = require(''../config''); passport.use(''google-imap'', new GoogleStrategy({ clientID: config(''google.api.client_id''), clientSecret: config(''google.api.client_secret'') }, function (accessToken, refreshToken, profile, done) { console.log(accessToken, refreshToken, profile); done(null, { access_token: accessToken, refresh_token: refreshToken, profile: profile }); })); exports.mount = function (app) { app.get(''/add-imap/:address?'', function (req, res, next) { passport.authorize(''google-imap'', { scope: [ ''https://mail.google.com/'', ''https://www.googleapis.com/auth/userinfo.email'' ], callbackURL: config(''web.vhost'') + ''/add-imap'', accessType: ''offline'', approvalPrompt: ''force'', loginHint: req.params.address })(req, res, function () { res.send(req.user); }); }); };


El mismo problema me pasó a mí también. Probé mi sistema en localhost y luego lo implementé en el servidor (que está ubicado en un país diferente), luego, cuando probé el sistema en el servidor de producción, vi este error. Intenté estos para arreglarlo:

  1. https://www.google.com/settings/security/lesssecureapps habilitó pero no fue mi solución
  2. https://g.co/allowaccess Permití el acceso desde el exterior por un tiempo limitado y esto resolvió mi problema.

Encontré que el método más simple, descrito en https://community.nodemailer.com/using-gmail/ mencionado en la respuesta de Greg T , era crear una Contraseña de aplicación que esté disponible después de activar 2FA para la cuenta.

myaccount.google.com> Inicio de sesión y seguridad> Iniciar sesión en Google> Contraseñas de aplicaciones

Esto le da una contraseña alternativa para la cuenta, luego simplemente configura nodemailer como un servicio SMTP normal.

var smtpTransport = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, auth: { user: "[email protected]", pass: "app password" } });

Aunque Google recomienda Oauth2 como la mejor opción, este método es fácil y aún no se ha mencionado en esta pregunta.

Consejo adicional: también descubrí que puede agregar el nombre de su aplicación a la dirección "de" y GMail no la reemplaza con el correo electrónico de la cuenta como lo hace si intenta usar otra dirección. es decir.

from: ''My Pro App Name <[email protected]>''


Estaba usando una versión anterior de nodemailer 0.4.1 y tuve este problema. Actualicé a 0.5.15 y todo está funcionando bien ahora.

Edite package.json para reflejar los cambios entonces

npm install



Ninguna de las soluciones anteriores funcionó para mí. Usé el código que existe en la documentación de NodeMailer . Se parece a esto:

let transporter = nodemailer.createTransport({ host: ''smtp.gmail.com'', port: 465, secure: true, auth: { type: ''OAuth2'', user: ''[email protected]'', serviceClient: ''113600000000000000000'', privateKey: ''-----BEGIN PRIVATE KEY-----/nMIIEvgIBADANBg...'', accessToken: ''ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'', expires: 1484314697598 } });


Para mí, está funcionando de esta manera, usando el puerto y la seguridad (tuve problemas para enviar correos electrónicos desde Gmail usando PHP sin la configuración de seguridad)

Espero que ayude a alguien.

var sendEmail = function(somedata){ var smtpConfig = { host: ''smtp.gmail.com'', port: 465, secure: true, // use SSL, // you can try with TLS, but port is then 587 auth: { user: ''***@gmail.com'', // Your email id pass: ''****'' // Your password } }; var transporter = nodemailer.createTransport(smtpConfig); // replace hardcoded options with data passed (somedata) var mailOptions = { from: ''[email protected]'', // sender address to: ''[email protected]'', // list of receivers subject: ''Test email'', // Subject line text: ''this is some text'', //, // plaintext body html: ''<b>Hello world ✔</b>'' // You can choose to send an HTML body instead } transporter.sendMail(mailOptions, function(error, info){ if(error){ return false; }else{ console.log(''Message sent: '' + info.response); return true; }; }); } exports.contact = function(req, res){ // call sendEmail function and do something with it sendEmail(somedata); }

toda la configuración se enumeran here (incluyendo ejemplos)


Por alguna razón, el solo hecho de permitir una configuración de aplicación menos segura no me funcionó, ni siquiera lo de captcha. Tuve que hacer otro paso que es habilitar la configuración IMAP:

De la página de ayuda de google: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • En la parte superior derecha, haga clic en Configuración Configuración.
  • Haga clic en Configuración.
  • Haga clic en la pestaña Reenvío y POP / IMAP.
  • En la sección "Acceso IMAP", seleccione Habilitar IMAP.
  • Haga clic en Guardar cambios.


Se resuelve utilizando el módulo "nodemailer-smtp-transport" dentro de createTransport.

var smtpTransport = require(''nodemailer-smtp-transport''); var transport = nodemailer.createTransport(smtpTransport({ service: ''gmail'', auth: { user: ''*******@gmail.com'', pass: ''*****password'' } }));


Si usa Express, express-mailer nodemailer envuelve a nodemailer muy bien y es muy fácil de usar:

//# config/mailer.js module.exports = function(app) { if (!app.mailer) { var mailer = require(''express-mailer''); console.log(''[MAIL] Mailer using user '' + app.config.mail.auth.user); return mailer.extend(app, { from: app.config.mail.auth.user, host: ''smtp.gmail.com'', secureConnection: true, port: 465, transportMethod: ''SMTP'', auth: { user: app.config.mail.auth.user, pass: app.config.mail.auth.pass } }); } }; //# some.js require(''./config/mailer.js)(app); app.mailer.send("path/to/express/views/some_view", { to: ctx.email, subject: ctx.subject, context: ctx }, function(err) { if (err) { console.error("[MAIL] Email failed", err); return; } console.log("[MAIL] Email sent"); }); //#some_view.ejs <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title><%= subject %></title> </head> <body> ... </body> </html>



Solo tiene que atenderlos: 1- La autenticación de Gmail para permitir correos electrónicos de bajo nivel no se acepta antes de reiniciar el navegador del cliente 2- Si desea enviar un correo electrónico con nodemailer y no desea usar el protocolo xouath2, debe escribir como secureconnection: falso, como a continuación

const routes = require(''express'').Router(); var nodemailer = require(''nodemailer''); var smtpTransport = require(''nodemailer-smtp-transport''); routes.get(''/test'', (req, res) => { res.status(200).json({ message: ''test!'' }); }); routes.post(''/Email'', (req, res) =>{ var smtpTransport = nodemailer.createTransport({ host: "smtp.gmail.com", secureConnection: false, port: 587, requiresAuth: true, domains: ["gmail.com", "googlemail.com"], auth: { user: "your gmail account", pass: "your password*" } }); var mailOptions = { from: ''[email protected]'', to:''[email protected]'', subject: req.body.subject, //text: req.body.content, html: ''<p>''+req.body.content+'' </p>'' }; smtpTransport.sendMail(mailOptions, (error, info) => { if (error) { return console.log(''Error while sending mail: '' + error); } else { console.log(''Message sent: %s'', info.messageId); } smtpTransport.close(); }); }) module.exports = routes;




todo su código está bien, solo lo que queda es ir al enlace https://myaccount.google.com/security

y siga desplazándose hacia abajo y encontrará Permitir aplicaciones menos seguras: ENCENDIDO y en ON, no encontrará ningún error.


Solución fácil:

var nodemailer = require(''nodemailer''); var smtpTransport = require(''nodemailer-smtp-transport''); var transporter = nodemailer.createTransport(smtpTransport({ service: ''gmail'', host: ''smtp.gmail.com'', auth: { user: ''[email protected]'', pass: ''realpasswordforaboveaccount'' } })); var mailOptions = { from: ''[email protected]'', to: ''[email protected]'', subject: ''Sending Email using Node.js[nodemailer]'', text: ''That was easy!'' }; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log(''Email sent: '' + info.response); } });

Paso 1:

vaya aquí https://myaccount.google.com/lesssecureapps y habilite para aplicaciones menos seguras. Si esto no funciona entonces

Paso 2

vaya aquí https://accounts.google.com/DisplayUnlockCaptcha y habilite / continúe y luego intente.

para mí el paso 1 solo no funcionó, así que tuve que ir al paso 2.

También intenté quitar el paquete nodemailer-smtp-transport y para mi sorpresa funciona. pero cuando reinicié mi sistema, me dio el mismo error, así que tuve que ir y encender la aplicación menos segura (la deshabilité después de mi trabajo).

Luego, por diversión, lo probé con la aplicación off (menos segura) y ¡funcionó de nuevo!


primero instala nodemailer

npm install nodemailer --save

importar en un archivo js

const nodemailer = require("nodemailer"); const smtpTransport = nodemailer.createTransport({ service: "Gmail", auth: { user: "[email protected]", pass: "password" }, tls: { rejectUnauthorized: false } }); const mailOptions = { from: "[email protected]", to: [email protected], subject: "Welcome to ", text: ''hai send from me''. }; smtpTransport.sendMail(mailOptions, function (error, response) { if (error) { console.log(error); } else { console.log("mail sent"); } });

trabajando en mi aplicación


exports.mailSend = (res, fileName, object1, object2, to, subject, callback)=> { var smtpTransport = nodemailer.createTransport(''SMTP'',{ //smtpTransport host: ''hostname, port: 1234, secureConnection: false, // tls: { // ciphers:''SSLv3'' // }, auth: { user: ''username'', pass: ''password'' } }); res.render(fileName, { info1: object1, info2: object2 }, function (err, HTML) { smtpTransport.sendMail({ from: "[email protected]", to: to, subject: subject, html: HTML } , function (err, responseStatus) { if(responseStatus) console.log("checking dta", responseStatus.message); callback(err, responseStatus) }); }); }

Debe agregar el tipo de conexión segura en su código.