Missing credentials for "PLAIN" nodemailer
You have
auth: { user: 'user@gmail.com', password: 'password'}
But you should write this
auth: { user: 'user@gmail.com', pass: 'password'}
Just rename password to pass.
I was able to solve this problem by using number 3, Set up 3LO authentication, example from the nodemailer documentation (link: https://nodemailer.com/smtp/oauth2/). My code looks like this:
let transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, auth: { type: 'OAuth2', user: 'user@example.com', clientId: '000000000000-xxx0.apps.googleusercontent.com', clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0', refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx', accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x' }});
If you looked at the example in the link that I stated above, you can see there that there is a 'expires' property but in my code i didn't include it and it still works fine.
To get the clientId, clientSecret, refreshToken, and accessToken, I just watched this video https://www.youtube.com/watch?v=JJ44WA_eV8E .
I don't know if this is still helpful to you tho.
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" }});
And if you still want to use just plain text password, disable secure login on your google account and use as follows:
var email_smtp = nodemailer.createTransport({ host: "smtp.gmail.com", auth: { type: "login", // default user: "youremail@gmail.com", pass: "PASSWORD_HERE" }});