TypeError - invalid login - javascript

I wrote some code to implement nodemailer in my nodejs application to send mails.
i wrote this code:
var express = require("express");
var router = express.Router();
var nodemailer = require("nodemailer");
/* GET contact page. */
router.get("/", function (req, res, next) {
res.render("contact", { title: "Contact" });
});
router.post("/send", function (req, res, next) {
var transporter = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "MyEmailHere",
pass: "password",
},
tls: {
rejectUnauthorized: false
}
});
var mailOptions = {
from: "MyEmailHere",
to: "myOtherEmailId",
subject: "Website Submission",
text:
"You have a new submission with the following details...Name: " +
req.body.name +
" Email: " +
req.body.email +
" Message: " +
req.body.message,
html:
"<p> You got a new submission with the following details...</p><ul></ul><li>Name: " +
req.body.name +
"</li><li>Email: " +
req.body.email +
"</li><li>Message: " +
req.body.message +
"</li></ul>",
};
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log(error);
res.redirect("/");
} else {
console.log("Message Sent: " + info.response);
}
});
});
module.exports = router;
But I get an error saying: "Username and password not accepted." Am i supposed to use my real password? Does nodemailer also support Yahoomail besides Gmail? I am still learning and in dev mode by the way. A little help?

It worked flawlessly when I entered my own information correctly and turned on 'less secure apps', please try it this way
NOTE (critical): make sure the 'less secure apps' option is turned on
(If you don't know how to open, you can visit here)
NOTE: Make sure 2-step verification is turned off
var express = require("express");
var router = express.Router();
var nodemailer = require("nodemailer");
const myGmailAccount = {
mail: 'your_gmail_address', // MAIL
passw: 'your_gmail_password', // PASSW
};
/* GET contact page. */
router.get("/", function (req, res, next) {
res.render("contact", { title: "Contact" });
});
router.post("/send", function (req, res, next) {
var transporter = nodemailer.createTransport({
service: "Gmail",
auth: {
user: myGmailAccount.mail,
pass: myGmailAccount.passw,
},
tls: {
rejectUnauthorized: false
}
});
var mailOptions = {
from: myGmailAccount.mail,
to: 'emintayfur#icloud.com', // recipient mail
subject: "Website Submission",
text:
"You have a new submission with the following details...Name: " +
req.body.name +
" Email: " +
req.body.email +
" Message: " +
req.body.message,
html:
"<p> You got a new submission with the following details...</p><ul></ul><li>Name: " +
req.body.name +
"</li><li>Email: " +
req.body.email +
"</li><li>Message: " +
req.body.message +
"</li></ul>",
};
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
console.log(error);
res.redirect("/");
} else {
console.log("Message Sent: " + info.response);
}
});
});

Yes, you need to enter your real information and I recommend you to read this text.
Even though Gmail is the fastest way to get started with sending
emails, it is by no means a preferable solution unless you are using
OAuth2 authentication. Gmail expects the user to be an actual user not
a robot so it runs a lot of heuristics for every login attempt and
blocks anything that looks suspicious to defend the user from account
hijacking attempts. For example you might run into trouble if your
server is in another geographical location – everything works in your
dev machine but messages are blocked in production.
Additionally Gmail has came up with the concept of “Less Secure” apps which is
basically
anyone who uses plain password to login to Gmail, so you might end up
in a situation where one username can send mail (support for “less
secure” apps is enabled) but other is blocked (support for “less
secure” apps is disabled). You can configure your Gmail account to
allow less secure apps here. When using this method make sure to also
enable the required functionality by completing the “Captcha Enable”
challenge. Without this, less secure connections probably would not
work.
And make sure the 'less secure apps' option is turned on
If you don't know how to open, you can visit here
For more information I suggest you to review this page

Related

Nodemailer is not working on production with NodeJS and gmail [duplicate]

I try to use nodemailer to implement a contact form using NodeJS but it works only on local it doesn't work on a remote server...
My error message :
[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' }
My controller :
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('/');
}
});
}
I solved this by going to the following url (while connected to google with the account I want to send mail from):
https://www.google.com/settings/security/lesssecureapps
There I enabled less secure apps.
Done
See nodemailer's official guide to connecting Gmail:
https://community.nodemailer.com/using-gmail/
-
It works for me after doing this:
Enable less secure apps - https://www.google.com/settings/security/lesssecureapps
Disable Captcha temporarily so you can connect the new device/server - https://accounts.google.com/b/0/displayunlockcaptcha
Easy Solution:
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
host: 'smtp.gmail.com',
auth: {
user: 'somerealemail#gmail.com',
pass: 'realpasswordforaboveaccount'
}
}));
var mailOptions = {
from: 'somerealemail#gmail.com',
to: 'friendsgmailacc#gmail.com',
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);
}
});
Step 1:
go here https://myaccount.google.com/lesssecureapps and enable for less secure apps. If this does not work then
Step 2
go here https://accounts.google.com/DisplayUnlockCaptcha and enable/continue and then try.
for me step 1 alone didn't work so i had to go to step 2.
i also tried removing the nodemailer-smtp-transport package and to my surprise it works. but then when i restarted my system it gave me same error, so i had to go and turn on the less secure app (i disabled it after my work).
then for fun i just tried it with off(less secure app) and vola it worked again!
You should use an XOAuth2 token to connect to Gmail. No worries, Nodemailer already knows about that:
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()
}
}
};
You'll need to go to the Google Cloud Console to register your app. Then you need to retrieve access tokens for the accounts you wish to use. You can use passportjs for that.
Here's how it looks in my code:
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);
});
});
};
Worked fine:
1- install nodemailer, package if not installed
(type in cmd) : npm install nodemailer
2- go to https://myaccount.google.com/lesssecureapps and turn on Allow less secure apps.
3- write code:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'trueUsername#gmail.com',
pass: 'truePassword'
}
});
const mailOptions = {
from: 'any#any.com', // sender address
to: 'true#true.com', // 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- enjoy!
I had the same problem. Allowing "less secure apps" in my Google security settings made it work!
Non of the above solutions worked for me. I used the code that exists in the documentation of NodeMailer. It looks like this:
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: 'user#example.com',
serviceClient: '113600000000000000000',
privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
expires: 1484314697598
}
});
Same problem happened to me too. I tested my system on localhost then deployed to the server (which is located at different country) then when I try the system on production server I saw this error. I tried these to fix it:
https://www.google.com/settings/security/lesssecureapps Enabled it but it was not my solution
https://g.co/allowaccess I allowed access from outside for a limited time and this solved my problem.
I found the simplest method, described in this article mentioned in Greg T's answer, was to create an App Password which is available after turning on 2FA for the account.
myaccount.google.com > Sign-in & security > Signing in to Google > App Passwords
This gives you an alternative password for the account, then you just configure nodemailer as a normal SMTP service.
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: "username#gmail.com",
pass: "app password"
}
});
While Google recommend Oauth2 as the best option, this method is easy and hasn't been mentioned in this question yet.
Extra tip: I also found you can add your app name to the "from" address and GMail does not replace it with just the account email like it does if you try to use another address. ie.
from: 'My Pro App Name <username#gmail.com>'
It is resolved using nodemailer-smtp-transport module inside createTransport.
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '*******#gmail.com',
pass: '*****password'
}
}));
Many answers advice to allow less secure apps which is honestly not a clean solution.
Instead you should generate an app password dedicated to this use:
Log in to your Google account
Go to security
Under Signing in to Google enable 2-Step Verification
Under Signing in to Google click on App passwords.
You'll now generate a new password. Select the app as Mail and the device as Other (Custom name) and name it.
Save the app password
You can now use this app password instead of your log in password.
Try disabling captchas in your gmail account; probably being triggered based on IP address of requestor.
See: How to use GMail as a free SMTP server and overcome captcha
For me is working this way, using port and security (I had issues to send emails from gmail using PHP without security settings)
I hope will help someone.
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: 'xxxx#gmail.com', // sender address
to: 'yyyy#gmail.com', // 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);
}
all the config are listed here (including examples)
If you use Express, express-mailerwrapsnodemailervery nicely and is very easy to use:
//# 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>
For some reason, just allowing less secure app config did not work for me even the captcha thing. I had to do another step which is enabling IMAP config:
From google's help page: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin
In the top right, click Settings Settings.
Click Settings.
Click the Forwarding and POP/IMAP tab.
In the "IMAP Access" section, select
Enable IMAP.
Click Save Changes.
all your code is okay only the things left is just go to the link https://myaccount.google.com/security
and keep scroll down and you will found Allow less secure apps: ON and keep ON, you will find no error.
Just add "host" it will work .
host: 'smtp.gmail.com'
Then enable "lesssecureapps" by clicking bellow link
https://myaccount.google.com/lesssecureapps
Google has disabled the Less Secure App Access, Below is New Process to use Gmail in Nodejs
Now you have to enable 2 Step Verification in Google (How to Enable 2 Step Auth)
You need to generate App Specific Password. Goto Google My Account > Security
Click on App Password > Select Other and you will get App Password
You can use normal smtp with email and App password.
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: "mail#from.com",
to: to,
subject: subject,
html: HTML
}
, function (err, responseStatus) {
if(responseStatus)
console.log("checking dta", responseStatus.message);
callback(err, responseStatus)
});
});
}
You must add secureConnection type in you code.
I was using an old version of nodemailer 0.4.1 and had this issue. I updated to 0.5.15 and everything is working fine now.
Edited package.json to reflect changes then
npm install
Just attend those:
1- Gmail authentication for allow low level emails does not accept before you restart your client browser
2- If you want to send email with nodemailer and you wouldnt like to use xouath2 protocol there you should write as secureconnection:false like below
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: 'from#gmail.com',
to:'to#gmail.com',
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;
first install nodemailer
npm install nodemailer --save
import in to js file
const nodemailer = require("nodemailer");
const smtpTransport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "example#gmail.com",
pass: "password"
},
tls: {
rejectUnauthorized: false
}
});
const mailOptions = {
from: "example#gmail.com",
to: sending#gmail.com,
subject: "Welcome to ",
text: 'hai send from me'.
};
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
}
else {
console.log("mail sent");
}
});
working in my application
You may need to "Allow Less Secure Apps" in your Gmail account (it's all the way at the bottom). You also may need to "Allow access to your Google account".
You also may need to "Allow access to your Google account".
This is my Nodemailer configuration which worked after some research.
Step 1: Enable lesssecureapp
https://www.google.com/settings/security/lesssecureapps
Step 2: The Nodemailer configuration for Gmail
Setting up the transporter : A transporter is going to be an object that can send mail. It is the transport configuration object, connection URL, or a transport
plugin instance
let transporter = nodemailer.createTransport({
service: 'gmail', // the service used
auth: {
user: process.env.EMAIL_FROM, // authentication details of sender, here the details are coming from .env file
pass: process.env.EMAIL_FROM_PASSWORD,
},
});
Writing the message
const message = {
from: 'myemail#gmail.com', // sender email address
to: "receiver#example.com, receiver2#gmail.com", // reciever email address
subject: `The subject goes here`,
html: `The body of the email goes here in HTML`,
attachments: [
{
filename: `${name}.pdf`,
path: path.join(__dirname, `../../src/assets/books/${name}.pdf`),
contentType: 'application/pdf',
},
],
Sending the mail
transporter.sendMail(message, function (err, info) {
if (err) { // if error
console.log(err);
} else {
console.log(info); // if success
}
});
I also had issues with nodemailer email sending when running on Vercel lambda in production.
What fixed it in my case was to await for sendMail Promise to resolve.
I also added nodemailer-smtp-transport like suggested in this thread but I don't think it made a difference.
Here is my whole function:
const nodemailer = require('nodemailer');
const smtpTransport = require('nodemailer-smtp-transport');
const transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '***#gmail.com',
pass: process.env.SMTP_PASSWORD,
},
}));
async function contact(req: any, res: any) {
try {
const response = await transporter.sendMail({
from: '"*** <***gmail.com>', // sender address
to: "***#gmail.com", // list of receivers
subject: `***`, // Subject line
html: `${req.body.message}<br/><br/>${req.body.firstname} ${req.body.lastname} - <b>${req.body.email}</b>`, // html body
});
} catch (error: any) {
console.log(error);
return res.status(error.statusCode || 500).json({ error: error.message });
}
return res.status(200).json({ error: "" });
}
export default contact;
As pointed out by Yaach, as of May 30th, 2022, Google no longer supports Less Secure Apps, and instead switched over to their own Gmail API.
Here is the sample code for Gmail SMTP with nodemailer.
"use strict";
const nodemailer = require("nodemailer");
async function main() {
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
transportMethod: "SMTP",
secureConnection: true,
port: 465,
secure: true, // upgrade later with STARTTLS
auth: {
user: "yourEmail#gmail.com",
pass: "Your App Specific password",
},
});
let info = await transporter.sendMail(
{
from: "yourEmail#gmail.com",
to: "to#gmail.com",
subject: "Testing Message Message",
text: "I hope this message gets delivered!",
html: "<b>Hello world?</b>", // html body
},
(err, info) => {
if (err) {
console.log(err);
} else {
console.log(info.envelope);
console.log(info.messageId);
}
}
);
}
main();
Less secure option is not supported anymore by gmail.
For sending email from third party, gmail is also not allowing with its user password.
You should now use App Password to resolve this issue.
Hope this link will help to set your app password.
https://support.google.com/mail/answer/185833?hl=en
There is another option to use SendGrid for email delivery with no failure. A lot of the time, Nodemailer gives failure for mail which could happen frequently.
Nodemailer can be found in the link.

Cannot POST /contact - but no where in my code do I request that post

I'm trying to create a contact box with nodemailer and everything worked at first. I console.logged(error) or "success" and received the email where it was supposed to go and also received my console "success" message. However, when I go to render a physical "success" message that the user can see, I receive the error cannot POST /contact. The weird thing is I don't have the post request going to /contact. I've been looking at the code for a while so it could be something simple, but I'm at a loss. I appreciate any help.
I've tried to render the homepage, declared a variable and put that variable onto the webpage to display for the user then I just tried displaying the home page and still receiving the same error. *I've left some critical information blank as I'm doing this on my local system before I push it to Heroku.
app.post('/', function(req, res) {
let mailOpts, smtpTrans;
smtpTrans = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: '',
pass: ''
}
});
mailOpts = {
from: req.body.name + ' <' + req.body.email + '>',
to: '',
subject: 'New message from contact form',
text: `${req.body.name} (${req.body.email} ${req.body.nbr}) says: ${req.body.msg}`
};
smtpTrans.sendMail(mailOpts, function (error, response) {
if (error) {
console.log(error);
} else {
res.render('/');
}
});
});
Change / to /contact:
app.post('/contact', function(req, res) {...});

NodeJs and nodemailer - hide query parameters in the Email-Link and URL?

How can I hide the query-string parameters in the URL when sending an email to user with link and be able in the same time to read grab them when page is loaded in the browser?
Using: NodeJs, Angular1, MongoDb.
Code:
exports.newPass = function (req, res) {
User.findOne({
email: req.body.email
}, function (err, email) {
console.log('Email: ' + email);
if (err) throw err;
if (!email) {
console.log('Email: ' + email);
return res.json({ message: 'This Email does not exist!' });
}
var transport = mailer.createTransport({
host:'localhost',
port: 25,
secure: false,
auth: {
user: "userName",
pass: "passWord"
}
});
var mail = {
from: "DevOps <dev#localhost>",
to: "dev#localhost",
subject: "Set New Password",
text: "To set new Password: ",
html: '<strong>To set new Password: </strong>'
+ ' <a href="http://localhost:4000/endPoint#!/signup?m='
+ email.email
+ '&fn='
+ email.fullName
+ '&_id='
+ email._id
+ '">Restore Password</a>'
}
transport.sendMail(mail, function(error, response){
if(error){
console.log( 'Server Error: ' + error );
}else{
console.log( 'Message sent: ' + JSON.stringify(response.messageId) );
}
transport.close();
});
return res.json({ Ok: 'New Password will be send to you... please check your Emails' });
});
};
I'm able to manage this in the Angular Controller by adding the following:
$location.search({});
but the parameters and the values are still visible in the email-link.
They disappear after the user clicks on the email-link and goes to browser.
I would like to hide them also in the email which being sent to the recipient.
If safety is not a concern, you could create an object with the data you need, stringify it and then encode it in base 64. You can easily decode this back to the JSON string.
You'd do something like this in Node:
var data = { email: email.email, fn: email.fullName, _id: email._id };
data = JSON.stringify(data);
data = Buffer.from(data).toString('base64');
var mail = {
from: "DevOps <dev#localhost>",
to: "dev#localhost",
subject: "Set New Password",
text: "To set new Password: ",
html: '<strong>To set new Password: </strong>'
+ ' Restore Password'
}
Note that anyone can decode this back.
Depending on where you want to get this data back, you'd have to check different ways on how to decode this data. It's pretty similar in Node:
Buffer.from(b64string, 'base64');
However, if you don't want people to be able to decode this, then you'd have to take a different approach.
What I would do is generate a random hash, and store it in the database somewhere, indicating that it's connected to some user that wants a password change. You can then send that hash to the user, and look it up when the URL you sent is requested.

unable to send html text using nodemailer

I am unable to send html text in mail using nodemailer.
exports.send = function(req, res) {
console.log(req.query);
var mailOptions = {
to: req.query.email,
subject: req.query.sub,
text: 'Date of Interview: ' + req.query.dateOfInterview+ 'Time of Interview: ' + req.query.timeOfInterview + '' + req.query.assignedTechnicalPerson + '' + req.query.typeOfInterview + '' + req.query.interviewLocation
}
smtpTransport.sendMail(mailOptions, function(error, response) {
if (error) {
console.log(error);
res.end("error");
} else {
console.log("Message sent: " + response.message);
res.end("sent");
}
});
};
I am getting mail as continuous text without any line space
How can i send the same text using html tags in it i have also tried keeping html and end up getting lots of errors
Please say me correct syntax
Any help is appreciated
Here is the working code with nodemailer latest version.
var smtpTransport = require('nodemailer-smtp-transport');
var transporter = nodeMailer.createTransport(
smtpTransport({
service: 'gmail',
auth: {
user: <Your gmail>,
pass: '*****'//ur password
}
})
);
transporter.sendMail({
from: 'sender#gmail.com',
to: "recipient#mail.id",
subject: 'hello world!',
//text:"one"
html: '<html><body>Hello World....</body></html>'
}, function(error, response) {
if (error) {
console.log(error);
} else {
console.log('Message sent');
}
});
Note: To give access for smtp do the following:
For Gmail you may need to configure "Allow Less Secure Apps" in your
Gmail account. Click here
You also may need to unlock your account with "Allow access to your
Google account" to use SMTP.
If you are using 2FA in that case you would have to create an
Application specific password.

nodemailer email login invalid

{ [Error: Invalid login: 535 5.0.0 Authentication Failed] code:
'EAUTH', response: '535 5.0.0 Authentication Failed',
responseCode: 535 }
It keeps giving me this error, tried several times with different tutorials and still not working....
Also I know it will be hard to access to gmail's authentication and on top of that my gmail has two steps secure validation, so I decided to use Hotmail instead...
Here is code for my index.html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script><script>
<script>
$(document).ready(function(){
var from,name,email,subject,text;
$("#submit").click(function(){
name=$("#name").val();
email=$("#email").val();
subject=$('#subject').val();`enter code here`
text=$("#message").val();
$("#messages").text("Sending E-mail...Please wait");
$.get("http://localhost:8000/send",{name:name,email:email,subject:subject,text:text},function(data){
if(data=="sent")
{
$("#messages").empty().html("
Email is been sent at "+to+" . Please check inbox !
");
}
});
});
});
</script>
below is my server.js code
var express = require('express');
var path = require('path');
var app = express();
var nodemailer = require("nodemailer");
app.use(express.static('assets'));
var smtpTransport = nodemailer.createTransport({
service: 'Hotmail',
auth: {
user: 'myemail.com',
pass: 'something'
}
});
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
app.get('/send', function(req, res){
var mailOptions={
from: "ME <my#hotmail.com>",
name : req.query.name,
To: req.query.email,
subject: req.query.subject,
text: req.query.message
};
console.log(mailOptions);
smtpTransport.sendMail(mailOptions, function(error, response){
if(error){
console.log(error);
res.end("error");
}else{
console.log("Message sent: " + response.message);
res.end("sent");
}
});
});
app.listen(8000, function(){`enter code here`
});
Hotmail might block connections from unexpected geographical locations, check your account security overview to see if you need to confirm any login attempts.
Additionally, if you use 2-factor auth for Hotmail then you need application specific password for Nodemailer, you can't use your account password in this case.

Categories