Username and Password not accepted when using nodemailer?

I think that first you need to Allow less secure apps to access account setting in your google account - by default this settings is off and you simply turn it on. Also you need to make sure that 2 factor authentication for the account is disabled. You can check how to disable it here.

Then I use the following script to send emails from a gmail account, also tested with yahoo and hotmail accounts.

const nodemailer = require('nodemailer');

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    requireTLS: true,
    auth: {
        user: '[email protected]',
        pass: 'your.password'
    }
});

let mailOptions = {
    from: '[email protected]',
    to: '[email protected]',
    subject: 'Test',
    text: 'Hello World!'
};

transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log(error.message);
    }
    console.log('success');
});

If you put the previous code in send-email.js for example, open terminal and write:

node send-email

You should see in the console - success, if the email was send successfully or the error message returned by nodemailer

Don't forget to first do the setting - Allow less secure apps to access account.

I hope this code will be useful for you. Good Luck!


If you have enabled 2-factor authentication on your Google account you can't use your regular password to access Gmail programmatically. You need to generate an app-specific password and use that in place of your actual password.

Steps:

  • Log in to your Google account
  • Go to My Account > Sign-in & Security > App Passwords
  • (Sign in again to confirm it's you)
  • Scroll down to Select App (in the Password & sign-in method box) and choose Other (custom name)
  • Give this app password a name, e.g. "nodemailer"
  • Choose Generate
  • Copy the long generated password and paste it into your Node.js script instead of your actual Gmail password. (You don't need the spaces.)

Your script will now look like this:

var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: '[email protected]',
    pass: 'YOUR-GENERATED-APP-PASSWORD'
  }
});

I hope this helps someone.