I am trying to send a mail in my email id which is present in the database but I didn't receive it.
Mail in my email id when I am hitting API and got error `Missing credentials for "PLAIN"??.
forgotpassword: async (req, res) => {
let { model } = req.body
let email = req.body.email
let emailsend = (email,firstName,token)=>{
let trans = nodeemail.createTransport({
host: "smtp.gmail.com",
port: 465,
secure:false,
requireTLS: true,
auth:{
user:config.emailUser,
pass:config.emailPassword
}
})
let mailoptions = {
form: config.emailUser,
to: email,
subject: "for reset password",
html: '<p>hii' + firstName+ ', please copy the link <a href= "http//:localhost:5001/resetpassword?token='+token+''>"</a>reset your password"
}
trans.sendMail(mailoptions , (err, data) => {
if(err){
console.log(err)
}else{
console.log("mail is sent",data.response)
}
})
}
let mailoptions = {
form: config.emailUser,
to: email,
subject: "for reset password",
html: '<p>hii' + firstName+ ', please copy the link <a href= "http//:localhost:5001/resetpassword?token='+token+''>"</a>reset your password"
}
trans.sendMail(mailoptions , (err, data) => {
if(err){
console.log(err)
}else{
console.log("mail is sent",data.response)
}
})
}
Out as a like receive mail in my gmail id but didn't. Can anyone tell where I am mistaken?
maybe you are using the wrong SMTP email and password. your mail password and SMTP password are not the same. I'm using nodemaler like this with Gmail SMTP. and its working fine.
import nodemailer from "nodemailer";
async function sendEmail(to, subject, message, htmlMessage){
const transporter = nodemailer.createTransport({
host: "your_smtp_host", port: 'smtp_port', secure: true, auth: {
user: 'smtp_mail', pass: 'smtp_pass'
},
});
await transporter.sendMail({
from: "from_email_address",
to,
subject,
text: message,
html: htmlMessage,
});
}
Related
I am trying to send a email through my server so anyone will enter his/her email to my app instantly get an welcome email i'm using nodemailer but i'm getting error in my console click the link to see the error and please explain what does this error means? enter image description here
let transporter = nodemialer.createTransport({
service : 'gmail',
auth: {
user: 'gauravrajpoot452#gmail.com',
pass: 'sonu#12345'
}
});
app.post('/', (req, res) => {
let email = req.body.userEmail;
let mailOptions = {
from: 'gauravrajpoot452#gmail.com',
to: email,
subject: 'Node tutorials',
text: `Hey gaurav you're a software engineer.`
}
transporter.sendMail(mailOptions, (error, info) => {
if(error){
console.log(error);
}
else{
console.log('Email sent' + info.response);
}
});
});
I've got an assignment, and they have asked me to obtain user credentials using OAuth 2.0 and save it in a database (say MongoDB). I was able to complete this step.
The second task is to have an API endpoint to execute send emails using the credentials previous stored. (Using Gmail REST API). I am struggling with this second task and have been searching all over the internet.
PS: I'm doing it in Nodejs
Documentation : https://developers.google.com/gmail/api/quickstart/nodejs
Setup Gmail REST API and get your clientId and client secret
write a function to send email
i have used nodemailar in example, should be similar to gmail
var nodemailer = require('nodemailer');
var crypto = require('crypto');
let transporter = nodemailer.createTransport({
host: 'smtp.sendgrid.net',
port: 465,
auth: {
user: 'apikey',
pass: 'Your Key'
}
});
function generateVerificationToken() {
return crypto.randomBytes(16).toString('hex');
}
exports.addUserEmail = function (req, res) {
Users.find({ email: req.body.email }, (err, users) => {
if (err) { res.send("Err"); return }
if (users.length == 0) {
var user = new Users(req.body);
user.verification.verification_token = generateVerificationToken();
user.save(function (err, email) {
if (err)
res.send(err);
sendVerificationEmail(req, user.verification.verification_token, email.email, (err) => {
if (err) { console.log(err); return res.status(500).send({ msg: err.message }); }
res.status(200).send({
'A verification email has been sent to ' : email.email
});
});
});
}
else {
res.status(400).send({ Error : 'Invalid Request',
Error : 'This email is already Registered'
});
}
});
};
function sendVerificationEmail(req, token, email, cb) {
let emailText = 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/user\/verify\/?token=' + token + '&email=' + email + '.\n';
var mailOptions = {
from: 'donotreply#Express-Server.com',
to: email,
subject: 'Account Verification Token',
text: emailText
};
transporter.sendMail(mailOptions, function (err) {
cb(err);
});
}
In your route
app.route('/user/register')
.post(users.addUserEmail);
I want to use nodemailer to send the email to the users but I caught en error about ETIMEDOUT but I am not sure what is going on inside the nodemailer module,
const nodemailer = require('nodemailer');
const sendEmail = async (options) => {
// 1-) Create a transporter
const transporter = nodemailer.createTransport({
host: process.env.EMAIL_HOST,
port: process.env.EMAIL_PORT,
auth: {
user: process.env.EMAIL_USERNAME,
pass: process.env.EMAIL_PASSWORD,
},
});
// 2-) Define the email options
const mailOptions = {
from: 'Ogun AÇIĞ <MyEmail> ',
to: options.email,
subject: options.subject,
text: options.message,
//html
};
//3-) Actually send the email
await transporter.sendMail(mailOptions);
};
module.exports = sendEmail;
I have used the EMAIL_HOST,EMAIL_PORT,EMAIL_USERNAME and EMAIL_PASSWORD with my Mailtrap account credentials, if I get the concept of the subject, the message will be send to that Mailtrap account for now. I will change the properties MAIL_HOST,MAIL_PORT,EMAIL USERNAME and EMAIL PASSWORD with information of real user but I need to send a message first.
try {
await sendEmail({
email: user.email,
subject: 'Your password reset token (vaild for 10 minute)',
message,
});
res.status(200).json({
status: 'succes',
message: 'Token sent to email',
});
} catch (error) {
user.passwordResetExpires = undefined;
user.passwordResetToken = undefined;
await user.save({ validateBeforeSave: false });
return next(
new AppError(error.message, 500);
);
}
This is where I got this error. I will be appreciative for your help if you warn me about my mistake.
i want to use gmail smtp server to send welcome email when user create an account . welcome email must be send through my gmail id without providing my Email , password in auth section. my code is here..
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: '*****#gmail.com',
pass: *****
}
});
var mailOptions = {
from: 'youremail#gmail.com',
to: 'myfriend#yahoo.com',
subject: 'Sending Email using Node.js',
text: 'That was easy!'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
You can provide your username and password through environment variables such as
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.NODEMAILER_USERNAME,
pass: process.env.NODEMAILER_PASSWORD
}
});
Which can be set before running your process in linux like
NODEMAILER_USERNAME=test#gmail.com&&NODEMAILER_PASSWORD=pass&&./node www/bin
Alternatively you might be able to use an API key (https://developers.google.com/gmail/api/quickstart/nodejs), but if you want to avoid storing it in your code it would be the same approach.
I'm using Nodemailer for sending a forget password mail with Gmail service.I tried to reach to the same error earlier in the StackOverflow, but I couldn't find the solution. Please help me, I have no idea why it is giving error like,
"TypeError: Cannot create property 'mailer' on string 'smtpTransport'"
Here is my code below-
var nodemailer = require('nodemailer');
app.post('/forgot', function(req, res, next) {
async.waterfall([
function(done) {
crypto.randomBytes(20, function(err, buf) {
var token = buf.toString('hex');
done(err, token);
});
},
function(token, done) {
User.findOne({ email: req.body.email }, function(err, user) {
if (!user) {
req.flash('error', 'No account with that email address exists.');
return res.redirect('/forgot');
}
user.resetPasswordToken = token;
user.resetPasswordExpires = Date.now() + 3600000; // 1 hour
user.save(function(err) {
done(err, token, user);
});
});
},
function(token, user, done) {
console.log(token, "Token");
console.log(user, "user")
var smtpTransport = nodemailer.createTransport('SMTP', {
service: 'gmail',
auth: {
user: 'abc#gmail.com',
pass: '123456'
}
});
var mailOptions = {
to: user.email,
from: 'myproducts#mailinator.com',
subject: 'My Products Password Reset',
text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
'http://' + req.headers.host + '/reset/' + token + '\n\n' +
'If you did not request this, please ignore this email and your password will remain unchanged.\n'
};
smtpTransport.sendMail(mailOptions, function(err) {
req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.');
done(err, 'done');
});
}
], function(err) {
if (err) return next(err);
res.redirect('/forgot');
});
});
And the error is something like this-
/home/cis/Desktop/myproducts/node_modules/mongodb/lib/utils.js:132
throw err;
^
TypeError: Cannot create property 'mailer' on string 'smtpTransport'
at Mail (/home/cis/Desktop/myproducts/node_modules/nodemailer/lib/mailer/index.js:45:33)
at Object.module.exports.createTransport (/home/cis/Desktop/myproducts/node_modules/nodemailer/lib/nodemailer.js:52:14)
at /home/cis/Desktop/myproducts/app.js:185:38
at nextTask (/home/cis/Desktop/myproducts/node_modules/async/dist/async.js:5310:14)
at next (/home/cis/Desktop/myproducts/node_modules/async/dist/async.js:5317:9)
at /home/cis/Desktop/myproducts/node_modules/async/dist/async.js:958:16
at /home/cis/Desktop/myproducts/app.js:177:11
at /home/cis/Desktop/myproducts/node_modules/mongoose/lib/model.js:3913:16
at model.$__save.error (/home/cis/Desktop/myproducts/node_modules/mongoose/lib/model.js:342:7)
at /home/cis/Desktop/myproducts/node_modules/kareem/index.js:297:21
at next (/home/cis/Desktop/myproducts/node_modules/kareem/index.js:209:27)
at Kareem.execPost (/home/cis/Desktop/myproducts/node_modules/kareem/index.js:217:3)
at _cb (/home/cis/Desktop/myproducts/node_modules/kareem/index.js:289:15)
at $__handleSave (/home/cis/Desktop/myproducts/node_modules/mongoose/lib/model.js:280:5)
at /home/cis/Desktop/myproducts/node_modules/mongoose/lib/model.js:208:9
at args.push (/home/cis/Desktop/myproducts/node_modules/mongodb/lib/utils.js:404:72)
[nodemon] app crashed - waiting for file changes before starting...
The Nodemailer structure has been changed, try use this :
smtpTransport = nodemailer.createTransport({
service: 'Gmail',
auth: {
xoauth2: xoauth2.createXOAuth2Generator({
user: 'youremail#gmail.com',
//and other stuff here
});
}
});
var nodemailer = require("nodemailer");
var smtpTransport = nodemailer.createTransport({
service: "Yahoo", // sets automatically host, port and connection security settings
auth: {
user: "xxxxxxxxxx95#yahoo.com",
pass: "xxxxxxxxxxxx"
}
});
function mail(messageBody) {
let messageBodyJson = JSON.stringify(messageBody)
smtpTransport.sendMail({ //email options
from: "xxxxxxxxxx95#yahoo.com", // sender address. Must be the same as authenticated user if using Gmail.
to: "xxxxxxxxxx95#gmail.com", // receiver
subject: "Emailing with nodemailer", // subject
text: messageBodyJson // body
}, function(error, response){ //callback
if(error){
console.log("error",error);
}else{
console.log(response);
}
// smtpTransport.close(); // shut down the connection pool, no more messages. Comment this line out to continue sending emails.
});
}
mail("your mail message");
Try this.
Link to a similar question
Gmail / Google app email service requires OAuth2 for authentication. PLAIN text password will require disabling security features manually on the google account.
To use OAuth2 in Nodemailer, refer: https://nodemailer.com/smtp/oauth2/
Sample code:
var email_smtp = nodemailer.createTransport({
host: "smtp.gmail.com",
auth: {
type: "OAuth2",
user: "youremail#gmail.com",
clientId: "CLIENT_ID_HERE",
clientSecret: "CLIENT_SECRET_HERE",
refreshToken: "REFRESH_TOKEN_HERE"
}
});