NodeMailer keeps timing out - node.js

I'm building my first node project and I'm trying to send mails to users using nodemailer and OAuth2.0. It did work last night but suddenly started timing out this morning no matter what, it runs for a few minutes and then times out without sending the mail.
This is my code so far
const nodemailer = require("nodemailer");
const sendEmail = async (email, subject, text) => {
try {
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
type: 'OAuth2',
user: process.env.MAIL_USERNAME,
pass: process.env.MAIL_PASSWORD,
clientId: process.env.OAUTH_CLIENTID,
clientSecret: process.env.OAUTH_CLIENT_SECRET,
refreshToken: process.env.OAUTH_REFRESH_TOKEN
}
});
await transporter.sendMail({
from: 'user#gmail.com',
to: email,
subject: subject,
text: text,
});
console.log("email sent sucessfully");
} catch (error) {
console.log(error, "email not sent");
}
};
and I'm calling the function this way await sendEmail(email, "Password reset", link)
I get this error message after a few minutes
Error: connect ETIMEDOUT 173.194.76.108:465
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1187:16) {
errno: -60,
code: 'ESOCKET',
syscall: 'connect',
address: '173.194.76.108',
port: 465,
command: 'CONN'
} email not sent
I would appreciate any help as I'm really frustrated already

I fixed this by adding this to the transporter object
host: 'smtp.gmail.com',
port: 587,
secure: false,

Related

Nodemailer error: Error: connect ECONNREFUSED 127.0.0.1:587 suddenly appears

So I´m currently updating my JS backend to TS.
The project was written back in 2018 or 2019 and had some outdated stuff going on.
But it actually worked all well.
Now, for some reason, nodemailer wont work anymore and throws this error:
Error: connect ECONNREFUSED 127.0.0.1:587
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1157:16) { errno: -61, code: 'ESOCKET', syscall: 'connect', address:
'127.0.0.1', port: 587, command: 'CONN' }
I know there have been posts on this topic, but I don´t think my configuration is wrong, because it worked before totally fine and I didn´t really change anything, except for adding some types.
// defining transport to connect to mail host
const transport = nodemailer.createTransport({
host: process.env.EMAIL_PROVIDER,
port: 587,
tls: {
ciphers: 'SSLv3',
rejectUnauthorized: false,
},
debug: true,
auth: {
user: process.env.EMAILADDRESS_SENDER,
pass: process.env.EMAILPASSWORD,
},
});
export const sendOrderCreatedEmail = async (customer: Customer, paymentId: string) => {
const mailOptions: MailOptions = {
from: process.env.EMAILADDRESS_SENDER!,
to: process.env.EMAILADDRESS_RECEIVER!,
subject: `new Audit ${paymentId}`,
html: ...,
};
await sendEmail(mailOptions);
};
const sendEmail = async (mailOptions: MailOptions) => {
// send email with defined transport
transport.sendMail(mailOptions).catch(err => {
console.log(err);
});
};
"nodemailer": "^6.7.5",
any idea what could be wrong there? Cheers!

nodemailer && mailtrap -> connect ETIMEDOUT error

I'm Working on a Dummy Project in nextjs and trying to send a reset password message to the user email using mailtrap and nodemailer but i have a problem I can't find any solution for it when I send the request this error happen
Error: connect ETIMEDOUT 18.215.44.90:2525
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) {
errno: -4039,
code: 'ESOCKET',
syscall: 'connect',
address: '18.215.44.90',
port: 2525,
command: 'CONN'
}
and Here's my code
import nodemailer from "nodemailer";
async function SendEmail(options) {
const transport = nodemailer.createTransport({
host: "smtp.mailtrap.io",
port: 2525,
auth: {
user: "b4f46aa8ab49eb",
pass: "100f5d80facf4d",
},
});
const message = {
from: `${process.env.SMTP_FROM_NAME} <${process.env.SMTP_FROM_EMAIL}>`,
to: options.email,
subject: options.subject,
text: options.message,
};
await transport.sendMail(message, (error, info) => {
if (error) {
console.log(error);
} else {
console.log("Email sent: " + info.response);
}
});
}
export default SendEmail;
try changing the port, another solution is to try it on another internet network, sometimes in some way, the ip provided by the provider has been blocked, that same error happened to me and my solution was to change the internet network.

nodemailer and gmail APIs

Im trying to get nodemailer working using Google GMail API.
I've got my Google project set up - using their oauth sandbox for redirect,
I've got a clientID, secret and refresh token from my developers console.
The Code
const nodemailer = require('nodemailer');
const xoauth2 = require('xoauth2');
// create reusable transporter
let transporter = nodemailer.createTransport( {
service: 'gmail',
xoauth2: xoauth2.createXOAuth2Generator({
user: 'me#myDomain.com',
clientid: 'blahblahblah.apps.googleusercontent.com',
clientSecret: 'k33p-gUeSsINg',
refreshToken: '123BritneyIsTheBest'
}),
tls: {
rejectUnauthorized: false
}
} );
// setup email data
let mailOptions = {
from: 'me#myDomain.com',
to: 'me#yahoo.com',
subject: 'Hello there Google API...',
text: 'Hello Google API',
html: '<b>Hello Google API</b>'
};
// send mail with defined transport object
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Message sent: ', info.messageId);
});
The Error.
{
Error: Mail command failed: 530-5.5.1 Authentication Required. Learn more at 530 5.5.1 https://support.google.com/mail/?p=WantAuthError l24sm4075119ywk.21 - gsmtp
at SMTPConnection._formatError (C:\abc\index.js:591:19)
at SMTPConnection._actionMAIL (C:\abc\index.js:1350:34)
at SMTPConnection._responseActions.push.str (C:\abc\index.js:840:18)
at SMTPConnection._processResponse (C:\abc\index.js:747:20)
at SMTPConnection._onData (C:\abc\index.js:543:14)
at TLSSocket._socket.on.chunk (C:\abc\index.js:495:47)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
code: 'EENVELOPE',
response: '530-5.5.1 Authentication Required. Learn more at\n530 5.5.1 https://support.google.com/mail/?p=WantAuthError l24sm4075119ywk.21 - gsmtp',
responseCode: 530,
command: 'MAIL FROM'
}
I have tried this - and it works, but it's my understanding that this is very unsecured and NOT acceptable for production.
const nodemailer = require('nodemailer');
// create reusable transporter object
let transporter = nodemailer.createTransport( {
host: 'smtp.gmail.com',
port: 587,
secure: false,
auth: {
user: 'me#myDomain.com',
pass: 'Seriously?'
}
});
... all the rest is the same, removed for brevity...
The existing posts solutions have not helped.
Thank You
How about this modification?
From :
let transporter = nodemailer.createTransport( {
service: 'gmail',
xoauth2: xoauth2.createXOAuth2Generator({
user: 'me#myDomain.com',
clientid: 'blahblahblah.apps.googleusercontent.com',
clientSecret: 'k33p-gUeSsINg',
refreshToken: '123BritneyIsTheBest'
}),
tls: {
rejectUnauthorized: false
}
} );
To :
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
type: 'oauth2',
user: 'me#myDomain.com',
clientId: 'blahblahblah.apps.googleusercontent.com', // This key is "clientId".
clientSecret: 'k33p-gUeSsINg',
refreshToken: '123BritneyIsTheBest'
},
tls: {
rejectUnauthorized: false
}
});
Note :
Please confirm whether https://mail.google.com/ was included in the scope, when you retrieved the refresh token.
Please confirm whether gmail API is enabled.
It may be required to turn on "Allow less secure apps: ON" at https://myaccount.google.com/lesssecureapps.
Reference :
nodemailer OAuth2
In my environment, I confirmed that this works fine. But if this was not useful for you, I'm sorry.

nodemailer and zoho email issue '530 Must issue a STARTTLS command first.'

I am using the latest version of nodemailer version 4.1.0. I tried using the sample code available here
https://nodemailer.com/smtp/
Here is my code
let transporter = nodemailer.createTransport({
host: 'smtp.zoho.com',
port:587,
secure: false,
auth: {
user: this.user,
pass: this.password
}
});
var mailOptions: nodemailer.SendMailOptions = {
from: ****#***.com,
to: test#abc.com,
subject: 'Hello ✔',
text: 'Hello world ✔',
html: '<b>Hello world ✔</b>'
};
transporter
.sendMail(mailOptions)
.then(
(info) => {
// console.log(info);
resolve({status: info.messageId})
}
)
.catch(err => {
// console.log(err);
reject({status: err.toString()})
})
I get the following error. I have set the secure flag as false, and have also used ignodeTLS. The previous version of nodemailer 0.7.1 did not have any issues. Am I missing out on any specific configuration?
{ Error: Invalid login: 530 Must issue a STARTTLS command first.
at SMTPConnection._formatError
(C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:577:19)
at SMTPConnection._actionAUTHComplete (C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:1306:34)
at SMTPConnection._responseActions.push.str (C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:349:26)
at SMTPConnection._processResponse (C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:733:20)
at SMTPConnection._onData (C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:529:14)
at Socket._socket.on.chunk (C:\Project\NotificationService\node_modules\nodemailer\lib\smtp-connection\index.js:481:47)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:548:20)
code: 'EAUTH',
response: '530 Must issue a STARTTLS command first.',
responseCode: 530,
command: 'AUTH PLAIN' }
you can also use this without these tls parameter default value is false.
you got the error because of you don't pass service:'zoho' in nodemailer
let transporter = nodemailer.createTransport({
service:'Zoho',
host: this.service,
port:587,
secure: false,
auth: {
user: this.user,
pass: this.password
}
});
After going through the typings( "#types/nodemailer") file I added the following flags
1) service :'Zoho'
2) requireTLS :false
it is working now :)
let transporter = nodemailer.createTransport({
service:'Zoho',
host: this.service,
port:587,
secure: false,
ignoreTLS:true,
requireTLS:false,
auth: {
user: this.user,
pass: this.password
}
});
In the year 2022, I got this on the official documentation https://nodemailer.com/smtp/well-known/
let transporter = nodemailer.createTransport({
service: 'SendPulse', // no need to set host or port etc.
auth: {
user: 'account.email#example.com',
pass: 'smtp-password'
}
});
transporter.sendMail(...)
So, for Zoho just simply:
let transporter = nodemailer.createTransport({
service: 'Zoho', // no need to set host or port etc.
auth: {
user: 'account.email#example.com',
pass: 'smtp-password'
}
});
transporter.sendMail(...)
Just test it and works. I believe it doesn't need to put any setting if we use "Well-known services"
Hope this helps someone drop by in this thread :).

How to send mail with nodemailer (node.js) by direct method?

I try to write simple mailer just to send some text (for testing purposes) with nodemailer. If I understood well it may sent a mail by smtp or direct. At first I want to sent with DIRECT method.
The next code very simple:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({direct:true,
host: 'smtp.yandex.ru',
port: 465,
auth: {
user: 'login#yandex.ru',
pass: 'password' },
secure: true
});
var mailOptions = {
from: 'nworksheet#gmail.com',
to: 'sky-bell#mail.ru',
subject: 'Hello',
text: 'This is auto mail sending'
};
transporter.sendMail(mailOptions, function (error, info) {
if(error) {
return console.log(error);
}
console.log("Message sent "+info.response)
});
But I have the next error:
{ Error: Sending failed
at QueryReqWrap.asyncCallback [as callback] (dns.js:65:16)
at QueryReqWrap.onresolve [as oncomplete] (dns.js:216:10)
errors:
[ { Error: queryMx ENOTFOUND mail.ru
at errnoException (dns.js:28:10)
at QueryReqWrap.onresolve [as oncomplete] (dns.js:216:19)
code: 'ENOTFOUND',
errno: 'ENOTFOUND',
syscall: 'queryMx',
hostname: 'mail.ru' } ] }
What does it mean? How to fix it? Node not see 'mail.ru'? Why?
The best way to achieve this is
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'Yandex',
auth: {
user: 'your_yandex_email',
pass: 'your_password_for_email' },
});
var mailOptions = {
from: 'your_yandex_email',
to: 'sky-bell#mail.ru',
subject: 'Hello',
text: 'This is auto mail sending'
};
transporter.sendMail(mailOptions, function (error, info) {
if(error) {
return console.log(error);
}
console.log("Message sent "+info.response)
});
Whenever you specify the service command, it automatically sets the port and secures the email.
Also remember to put and fetch the credentials from a config file.
Looks like it can't find an MX record for mail.ru. It seems to exist however. https://toolbox.googleapps.com/apps/dig/#MX/mail.ru
Does this machine have DNS set up properly? Can you dig it from that machine?

Resources