Nodemailer with gmail get ETIMEDOUT error - node.js

I just deploy my nodejs api on Scaleway and when I try to send a mail from it, i get the following error, while it works like a charm locally :
command: 'CONN'
code: 'ETIMEDOUT',
at processTimers (internal/timers.js:500:7) {
at listOnTimeout (internal/timers.js:557:17)
at Timeout.<anonymous> (/app/node_modules/nodemailer/lib/smtp-connection/index.js:229:22)
at SMTPConnection._onError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:760:20)
at SMTPConnection._formatError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:774:19)
Error: Connection timeout
I'm using the following nodemailer transporter configuration :
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.MAIL_ADRESS,
pass: process.env.MAIL_PASSWORD
}
});
So I try to use the debug option from nodemailer transporter and I figure out that the resolved IP addresses are different.
Locally, the resolved IP address is the following :
DEBUG [pfKLJKySPY] Resolved smtp.gmail.com as 142.251.5.108 [cache miss]
While in production, the resolved IP is the following :
DEBUG [vgPMKJtFZT] Resolved smtp.gmail.com as 74.125.140.108 [cache miss]
Also, I checked that the container my docker image is running on is not blocking port 456 used by SMTP and no firewall is enabled.
Do you have any idea ?

I figured out that for the service to work in production, from my server, I had to configure the transport as follows:
const transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
secure: false,
requireTLS: true,
logger: true,
debug: true,
auth: {
user: process.env.MAIL_ADRESS,
pass: process.env.MAIL_PASSWORD
},
});
Now i'm able to send mail from gmail through nodemailer from my server !
The port has to be configured on 587 and requireTLS has to be true. Now, the resolved IP address is the following :
DEBUG [PHpdgG5NDWI] Resolved smtp.gmail.com as 66.102.1.109 [cache miss]
And with this address I have no more timeout errors !!!

Related

How to send Node js mail from Nodemailer i gor error in nodemailer

How can i send mail from node js with the use of my domail mail like as : noreply#example.com
The connection setting was below using nodemailer
const transporter = nodemailer.createTransport({
host: 'https://example.com',
port: 465, // Port
secure: true, // this is true as port is 465
auth: {
user: 'noreply#example.com',
pass: 'mypassword'
}
});
If i send mail there is an error like below
Error: getaddrinfo ENOTFOUND https://example.com
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) {
errno: -3008,
code: 'EDNS',
syscall: 'getaddrinfo',
hostname: 'https://lvkart.com',
command: 'CONN'
}
I had this issue when I accedentally added a trailing space to the hostname. The problem seems to be the failing DNS lookup.
In your example: The https:// part is not part of the hostname. In fact, you use SMTP protocol, not https.
try
const transporter = nodemailer.createTransport({
host: 'example.com', // Whatever your true hostname is. Could also be smtp.example.com or similar.
port: 465, // Port
secure: true, // this is true as port is 465
auth: {
user: 'noreply#example.com',
pass: 'mypassword'
}
});
I think the problem might come from your SMTP.
check your configuration correct or wrong by using (outlook or google mail).

Nodemailer Error: connect ECONNREFUSED 127.0.0.1:587 (errno: -61), but I specified port: 465, secure: true

I'm trying to use Nodemailer in Node.js with Google OAuth2, using port: 465, secure: true. But I'm receiving the error message below:
Error: connect ECONNREFUSED 127.0.0.1:587
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1137:16) {
errno: -61,
code: 'ESOCKET',
syscall: 'connect',
address: '127.0.0.1',
port: 587,
command: 'CONN'
}
As you can see... Port 587 is coming in the error message, but it wasn't defined anywhere in my app.
In my previous configuration, I was using Nodemailer with Node.js, port: 587, secure: false, rejectUnauthorized: false. And it worked like a charm.
However, Nodemailer is defaulting to 587 for some reason. It may be my fault, but I'm declaring port: 465 with secure: true. And, according to their documentation, it only defaults to 587 if you type secure: false.
Here's my configuration:
async function sendEmail() {
try {
const REDIRECT_URI = config.redirect_uri;
const oAuth2Client = new google.auth.OAuth2(config.mailClientID,
config.mailClientSecret, REDIRECT_URI);
oAuth2Client.setCredentials({refresh_token: config.refresh_token});
const accessToken = await oAuth2Client.getAccessToken();
let smtpConfigWithToken = nodemailer.createTransport({
service: 'Gmail',
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
user: config.email,
clientId: config.mailClientID,
clientSecret: config.mailClientSecret,
refreshToken: config.refresh_token,
accessToken: accessToken
}
});
let transporter = nodemailer.createTransport(smtpConfigWithToken);
let HelperOptions = {
from: '<birthmet#themetropolitanschool.com>',
to: emailRecipients,
bcc: '<lgranados#themetropolitanschool.com>',
subject: "New Birthday Cake request",
html: output
};
const result = transporter.sendMail(HelperOptions);
return result;
} catch(err) {
return err;
}
}
sendEmail().then(result => console.log('Email sent...', result)).catch(err => console.log(err));
I can always go back, but I'm putting a good effort into making my apps more secure. I very much prefer not to enable "Less Secure Apps".
Note: the URI is also verified by Google.
As a troubleshoot step, I've run the sample code from Google and I can get the labels, as well as token.json. See this link for Node.js code. My app also needs access to Spreadsheets, but that part is working flawlessly (using the same token credentials).
Can you help me with a solution on this wrong port error?
Thank you in advance for taking your time reading this.
I think port: 465 is no longer in use for SMTP
instead use either port: 587, or port: 2525,
Of course... It was my own fault.
I declared nodemailer.createTransport in smtpConfigWithToken and in transporter.
Looks like I've been staring at the screen for too long.
No wonder why Nodemailer went crazy with an error message that I've never seen before.
Well, at least it's documented. If you see an error -61 with Nodemailer, then please check that you don't have multiple instances of nodemailer.createTransport.
It's all working now.

Nodemailer queryA EREFUSED localhost when using Firebase Cloud Functions

I'm trying to send email to admin account whenever there's a new Order created in Firebase Database. I'm using Cloud Functions and Nodemailer for this, but I got below error:
Error: queryA EREFUSED localhost
at QueryReqWrap.onresolve [as oncomplete] (dns.js:213:19)
And this is the code:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const nodemailer = require('nodemailer');
admin.initializeApp();
/**
* Here we're using Gmail to send
*/
let transporter = nodemailer.createTransport({
service: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: 'myemail#gmail.com',
pass: 'mypass'
}
});
exports.sendMail = functions.database.ref('/Order/{orderId}').onCreate((snapshot, context) =>{
const dest = 'destination#gmail.com';
const mailOptions = {
from: 'Risal Fajar <noreply#bukakata.com>',
to: dest,
subject: 'I\'M A PICKLE!!!',
html: `<p style="font-size: 16px;">Pickle Riiiiiiiiiiiiiiiick!!</p>
<br />
<img src="https://images.prod.meredith.com/product/fc8754735c8a9b4aebb786278e7265a5/1538025388228/l/rick-and-morty-pickle-rick-sticker" />
`
};
// returning result
return transporter.sendMail(mailOptions).then(() => {
console.log('Mail sent to ', dest);
});
});
I don't know why the error showed localhost even though I've entered smtp.gmail.com
EDIT: I've added transport.verify() and this is the result
{ Error: queryA EREFUSED localhost
at QueryReqWrap.onresolve [as oncomplete] (dns.js:213:19)
errno: 'EREFUSED',
code: 'EDNS',
syscall: 'queryA',
hostname: 'localhost',
command: 'CONN' }
FIXED IT
I fixed it by changing the transporter configuration (change service name) to:
let transporter = nodemailer.createTransport({
service: 'gmail',
port: 465,
secure: true,
auth: {
user: 'myemail#gmail.com',
pass: 'mypass'
}
});
You can see the document: https://nodemailer.com/usage/using-gmail/
The gmail has another problem, but about this problem, same as I,
I got this Error:
Error: { Error: queryA EREFUSED smtp.163.com
at QueryReqWrap.onresolve [as oncomplete] (dns.js:199:19)
But when I try to run the same code at my mobile using termux, it works, maybe the free smtp services was so bad.
If the accepted answer doesn't work for you, you can also try to check your DNS configuration and ensure a nslookup on the hostname works well.
Run:
nslookup 'hostname'
If this results in error go to your network parameters and change your current DNS to 8.8.8.8 and try again to if the error persists.
.Or run directly:
nslookup 'hostname' 8.8.8.8
Additionally if the error happens only in your Cloud/ Docker container or VM ensure the nameserver configuration is correct.
Note: I had this error because work wifi's primary DNS wasn't resolving 'smtp.office3.com' but the secondary did and it seems nodemailer has no process in place to resolve the hostname using secondary DNS or entry in the OS host. You can read more about how to fix is error in the Nodemailer faq here.

I'm using Nodemailer (Node js) to send Email via Gmail but i'm getting error

I want to send email via Gmail or other email provider like office 365 using Nodemailer as my module Node.js.
I wanna ask also if there's a proxy or firewall setting to disable so that I can send email using gmail or office 365.
Or maybe there is something wrong with my code ?
const nodemailer = require("nodemailer");
const smtpTransport = require('nodemailer-smtp-transport');
function sendEmail(to, subject, html){
nodemailer.createTestAccount((err, account) => {
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: 'philip#gmail.com',
pass: 'sercretpass'
}
});
let mailOptions = {
from: '"Admin" ',
to: to,
subject: subject,
html: html
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log('Error', error);
}
else{
console.log('Success', info);
}
});
});
}
module.exports.sendEmail = sendEmail;
MY ERROR :
Error { Error: connect ETIMEDOUT 74.125.203.108:465
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1121:14)
errno: 'ETIMEDOUT',
code: 'ECONNECTION',
syscall: 'connect',
address: '74.125.203.108',
port: 465,
command: 'CONN' }
Are you able to telnet to smtp.gmail.com from the machine on port 465 ?
Also try with Port 587, with 587, you should see some other error as it works on STARTTLS.
TESTED WORKING ON GMAIL 2022 March
STEP 1- Enable the "Less Secure App Access" from Security Page of the Google Account
. Google says It's no longer supported but turn On
the feature anyway.
STEP 2-Turn Off the google CAPTCHA.
STTEP 3- Configuring Port And HOST
**Do not use google as the host.Refer the following.
host: "smtp.gmail.com"
if port 587 is not working, try port 465. Make sure to make secure:true for port 465
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
user: 'youremail#gmail.com',
pass: 'password',
},
// enable below only if u are running on local host
tls: { rejectUnauthorized: true }
});
I always used nodemailer for sending emails, suddenly I started having the above error. So I thought what was new on the computer and found that the antivirus was causing the problem. So disabling the antivirus and windows firewall is a good start to solve the problem.

Issues configuring Nodemailer 4.6.3 with Exchange 2010 (Node.js)

My issue is with properly configuring Nodemailer with an Exchange 2010 email server on a Node.js application.
Because I'm not getting an authentication issue, which I do when using well-known services like Outlook365, I'm assuming the problem is with the host and/or security and port settings - I don't think I connect in the first place.
My config below -
let transporter = nodemailer.createTransport({
host: 'https://email.<COMPANYNAME>.com/owa',
port: '587',
secure: false,
auth: {
user: <USERNAME>,
pass: <PASSWORD>
},
tls: {
rejectUnauthorized: false
}
});
It errors here on my Node app -
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log('Send error: ', error);
res.sendStatus(500);
} else {
console.log('Email sent!');
res.sendStatus(200);
}
});
Here is the error from AWS EC2 logs -
getaddrinfo ENOTFOUND https://email.<COMPANYNAME>.com/owa https://email.<COMPANYNAME>.com/owa:587
at errnoException (dns.js:28:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
code: 'ECONNECTION',
errno: 'ENOTFOUND',
syscall: 'getaddrinfo',
hostname: 'https://email.<COMPANYNAME>.com/owa',
host: 'https://email.<COMPANYNAME>.com/owa',
port: '587',
command: 'CONN'
Nodemailer docs specify that the host "is the hostname or IP address to connect to (defaults to ‘localhost’)"
When I try more the conventional mail.COMPANYNAME.com my requests time out. Using the address clearly hits my server and returns errors in the verification/ sending steps that I've specified.
Again, the issue seems to be with my transporter configuration with Exchange 2010. Any help is greatly appreciated!
I was searching for this question too. But I found the solution myself.
const transporter = nodemailer.createTransport({
host: 'smtp.office365.com',
port: 587,
secure: false,
auth: {
user: 'USER_NAME',
pass: 'PASSWORD'
}
});
I used this configuration for sending email using node mailer from exchange or Office 365 server.

Resources