ETIMEDOUT connect error using nodemailer in Nodejs Openshift application - node.js

I'm facing some problems using the nodemailer module in my node.js single gear non-scalable application in Openshift. As the documentation suggested, I initialized the transporter object and used the sendMail function. A simplified version of my code is
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'my.mail#gmail.com',
pass: 'mypassword'
}
});
var mail = {
from: 'my.mail#gmail.com',
to: 'test#mydomain.com',
subject: 'Test mail',
html: 'Test mail'
};
transporter.sendMail(mail, function(error, info) {
if(error){
console.log(error);
}else{
console.log(info);
}
});
This code works correctly when I run it on my local machine, but when I try to execute it on the server I got an ETIMEDOUT error, as if the application couln't connect to the smtp server.
{ [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' }
I've tried to increase the timeout connection parameter, but I got the same results.
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'my.mail#gmail.com',
pass: 'mypassword'
},
connectionTimeout: 5 * 60 * 1000, // 5 min
});
Is there any firewall or default Openshift settings or enviroment variable I'm missing?

I've to run a few more tests, but I think I figured out what the problem was. The authentication via username and password is a not-secure authentication method for Gmail. As written in the Nodemailer documentation
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.
I upgraded my authorization method using XOAuth2, as well explained in this guide and now the mails are correctly sent.

In my case the problem is with the port
I have changed port from 25 to 2525 and it worked.
try changing port

If you are trying to run this from the localhost.
Add the following line of code after the auth option
tls:{
rejectUnauthorized:false
}
It will work but you might consider upgrading to XOAuth2 as suggested by #matt.kiwi

const transporter = await nodemailer.createTransport(smtpTransport({
service: "Outlook365",
host: "smtp.office365.com",
port: "587",
tls: {
ciphers: "SSLv3",
rejectUnauthorized: false,
},
auth: {
user: '***',
pass: '***'
}
}));
It works for outlook

Related

Using Nodemailer with Hotmail/Node.js

I know there are a lot of posts about this and i've cycled through a good amount of them, none of them panning out. So here we go:
Trying to send an email via Nodemailer in NestJS application. Tested with the documentations's pre done eretheral test email and it worked fine. Now i'm trying to connect it to the hotmail account (which I have attained an app password) and no luck so far. Here's the function:
export async function sendEmail(createTicketDto: CreateTicketDto) {
const { username, email, ticket_body, issue_type } = createTicketDto;
const emailBody = `
User ${email} reporting issue regarding ${issue_type}:\n
\t${ticket_body}\n
\t\tActive username is: ${username}`;
const transporter = nodemailer.createTransport({
service: 'hotmail',
host: 'smtp-mail.outlook.com',
secure: false,
port: 587,
auth: {
user: 'xxx#hotmail.com',
pass: 'PASSWORD',
},
tls: {
ciphers: 'SSLv3',
},
});
console.log(emailBody);
const mailData = await transporter.sendMail({
from: '"XXXSUPPORT"<XXX#hotmail.com>',
to: 'YYY#gmail.com',
subject: issue_type,
text: emailBody,
});
Logger.log(`Email sent with ID: ${mailData.messageId}`);
return mailData;
}
The error being returned resembles:
[Nest] 22727 - 02/10/2023, 1:32:32 PM ERROR [ExceptionsHandler] Invalid login: 535 5.7.3 Authentication unsuccessful [MN2PR17CA0007.namprd17.prod.outlook.com 2023-02-10T18:32:32.130Z 08DB0B4DDC8F1521]
Feedback is appreciated, thank you!!
So problem has been resolved, however a few notes for myself (and anyone who stumbles across this):
const transporter = nodemailer.createTransport({
service: 'hotmail',
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
},
});
After that it was still failing, so based on a throwaway line in another forum post, I sent a test email to and from the hotmail account, and... it worked! So apparently, if you haven't sent any emails from the target send account, at least in the case of hotmail, it will not work.

sending email error:Error: Invalid login: 454 4.7.0 Too many login attempts, please try again later. b18sm2198190pgk.36 - gsmtp

I am getting this error while sending mail through my Node js application using gmail SMTP server.
I have not reached the daily limit to send mails, my config looks like this:
var transporter = nodemailer.createTransport({
service: 'Gmail',
pool: true,
port: 587,
auth: {
user: username,
pass: password
}
});
Kindly help.
Thanks

Nodemailer and Godaddy, I've tried every solution to no avail

I bought a domain and an email adrees with GoDaddy with Office 365 Basic bundled with it.
I'm trying from a few days to send just an email with nodemailer from my node app without ever succeding because I always get a 535 Authentication Failed from user#domain.com.
I've scanned StackOverflow for days trying every solution, this is every setting I've tried to pass to nodemailer.createTransport:
const mailerConfig =
{
//First set of parameters tried
service: 'Godaddy',
host: "smtp.office365.com",
secureConnection: true,
port: 587,
auth:
{
user: "user#domain.com",
pass: "password"
}
//Second set of parameters tried
host: "smtp.office365.com",
secureConnection: false,
port: "587",
auth:
{
user : "user#domain.com",
pass : "password"
},
tls:
{
ciphers:'SSLv3'
}
//Third set of parameters tried
service: "outlook",
auth:
{
user: 'user#domain.com',
pass: 'password'
}
}
None of these three settings worked, someone has any idea?
Thanks.
There is a godaddy FAQ entry called "Manually configure email set up on Thunderbird" (which seems to be only accessible via WaybackMachine).
It mentions the following configuration:
Incoming (IMAP): imap.secureserver.net 993 SSL Normal password
Outgoing (SMTP): smtpout.secureserver.net 465,587 SSL Normal password
and
Username: Workspace Email address
Using the above, especially smtpout.secureserver.net as SMTP Host works for me – tested with godaddy email in 2021.
If anyone is still having issues, this config is working for me actually in Sept 2021:
var transporter = nodemailer.createTransport({
host: "smtpout.secureserver.net",
port: 587, // port for secure SMTP
auth: {
user: "youremailaddress",
pass: "yourpassword",
},
});
You need to enable all access
and don't forget to disable the sms/call confirmation for the login
by the way this code i used on firebase cloud function/nodemailer
cors(req, res, async () => {
var transporter = nodemailer.createTransport({
host: "smtp.office365.com",
port: 587, // port for secure SMTP
auth: {
user: "user#domain.com",
pass: "password",
},
tls: {
ciphers: 'SSLv3'
}
});
if (req.method === 'POST') {
var mailOptions = {
from:req.body.from,
to: req.body.email, // list of receivers
subject: req.body.subject, // Subject line
text: req.body.text,
};
return transporter.sendMail(mailOptions).then(() => {
res.status(200).send('Email has been sent to mr/ms : ' + req.body.email); return ("mail sent")
});
}
})
You must enable SMTP login for the O365 mailbox or user in the admin settings
If the user has multifactor turned on, then you need to use "app password", normal password won't work if MFA is enabled.
https://learn.microsoft.com/en-us/azure/active-directory/user-help/multi-factor-authentication-end-user-app-passwords
You need to disable security defaults or adjust Conditional Access policies.
https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
Also, you can debug issue using sign-in logs in azure user account.

Sending emails using nodemailer in node.js

I've got an authorisation problem while sending emails via my own email address. Here is my code:
var transporter = nodemailer.createTransport({
host: 'serverDomain',
port: 25,
secure: 'false',
tls: {ciphers: "SSLv3"},
auth: {
user: 'myEmailAddress',
pass: 'myPassword'
}
});
transporter.sendMail({
from: 'myEmailAddress',
to: 'someAddress',
subject: 'Subject',
html: 'Some HTML code here'
}, function(error, info){
if(error){
console.log(error);
}
});
And the error is as follows:
{ [Error: Invalid login: 535 authorization failed (#5.7.0)]
code: 'EAUTH',
response: '535 authorization failed (#5.7.0)',
responseCode: 535 }
I'm sure the credentials are correct. I get the same error also on ports 465 and 587.
Any help will be appreciated. Thanks.
This can be issue with giving access rights in your email account. So can you make sure those setups you did properly.
Need to Allow Less Secure Apps in case of using Gmail service
If you are using 2FA in that case you would have to create an Application specific password. Because your normal password wont work.

Error sending email using nodemailer via Office365 smtp (MEANjs scaffold)

I'm trying to use Office365 SMTP to send email using Nodemailer (in a MEANjs scaffold), but I get the following error:
[Error: 140735277183760:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:../deps/openssl/openssl/ssl/s23_clnt.c:795:]
I'm using the following Nodemailer options:
{
host: 'smtp.office365.com',
port: '587',
auth: { user: 'xxxx', pass: 'xxxx' },
secure: 'false',
tls: { ciphers: 'SSLv3' }
}
Removing the tls field doesn't make a difference. What am I missing?
The solution was simple. The 'secure' field should be 'secureConnection'. The MEANjs scaffold that generated the configs created mailer options with the 'secure' field. The rest of the options are fine. For anyone that needs a working Office365 SMTP nodemailer options block, the following should work:
{
host: 'smtp.office365.com',
port: '587',
auth: { user: 'xxxx', pass: 'xxxx' },
secureConnection: false,
tls: { ciphers: 'SSLv3' }
}
I know this is old but if anyone looks this up in 2019, you can just add
service: "Outlook365"
and you won't have to specify connection options.
Node Mailer Docs
let transporter = nodemailer.createTransport({
service: "Outlook365",
auth: {
user: 'FROMUSER#office365.com',
pass: 'FROMUSERPASS'
},
})
let info = transporter.sendMail({
from: 'FROMUSER#office365.com',
to: 'TOUSER#office365.com',
subject: 'Test',
text: 'hello world',
html: '<h1>TEST</h1>'
})
This nodemailer documentation https://nodemailer.com/2-0-0-beta/setup-smtp/ indeed states options.secure and not options.secureConnection. It also suggests, in an example, that options.secure is expecting a boolean value true or false and not a string value 'true' or 'false'. Removing the '' from around 'false' works for me.
My problem was that the username and password were spelled correctly but I did not login in the Account after creation. So I used a mail program (Thunderbird) to login once and had to change my password and then I had access over Nodemailer.

Resources