Dimitri
Dimitri

Reputation: 11

Nodemailer does not send mail from Ubuntu server

Good day, I have simple Nodejs program that is using Nodemailer:

var syncSql = require('sync-mysql');             
var nodemailer = require('nodemailer');   

var syncCon = new syncSql(
{ 
    host:'localhost', 
    user:'_nodeuser', 
    password:'_password', 
    database:'mydatabase'
});

var transporter = nodemailer.createTransport(
{
    service: 'gmail',
    auth: 
    {
        user: '[email protected]',
        pass: '_gmailAppPass'
    },
    logger: true
});

...
resp2 = syncCon.query(sql);

var mailOptions =
            {
                from:   '[email protected]',
                to:      resp2.email,                       
                subject:'_email subject',     
                html:   '_email body'
            };

            transporter.sendMail(mailOptions, function(error, info) {
                if(error) {
                    console.log('remind_old_action(): '+ error);
                } else {
                    console.log('Email sent: ' + info.response);   
                }
            });

on my local Win 11 machine it works:

[2023-03-20 11:33:08] DEBUG Creating transport: nodemailer (6.9.0; +https://nodemailer.com/; SMTP/6.9.0[client:6.9.0])
[2023-03-20 11:33:09] DEBUG Sending mail using SMTP/6.9.0[client:6.9.0]
[2023-03-20 11:33:10] DEBUG [0FD44uxJ0] Resolved smtp.gmail.com as 173.194.76.108 [cache miss]
[2023-03-20 11:33:10] INFO  [0FD44uxJ0] Secure connection established to 173.194.76.108:465
[2023-03-20 11:33:11] DEBUG [0FD44uxJ0] SMTP handshake finished
[2023-03-20 11:33:11] INFO  [0FD44uxJ0] User "[email protected]" authenticated
[2023-03-20 11:33:11] INFO  Sending message <[email protected]> to <_target_email>
[2023-03-20 11:33:12] INFO  [0FD44uxJ0] <501 bytes encoded mime message (source size 498 bytes)>
[2023-03-20 11:33:13] DEBUG [0FD44uxJ0] Closing connection to the server using "end"
Email sent: 250 2.0.0 OK  1679311993 v15-20020a05600c444f00b003edddce5b00sm4292772wmn.12 - gsmtp
[2023-03-20 11:33:13] INFO  [0FD44uxJ0] Connection closed

but when I run this program on Ubuntu 22.04 server, it does not work from there:

[2023-03-20 11:40:27] DEBUG Creating transport: nodemailer (6.9.1; +https://nodemailer.com/; SMTP/6.9.1[client:6.9.1])
[2023-03-20 11:40:27] DEBUG Sending mail using SMTP/6.9.1[client:6.9.1]
[2023-03-20 11:40:27] DEBUG [jZWnAXUE78U] Resolved smtp.gmail.com as 172.253.63.108 [cache miss]
[2023-03-20 11:42:27] ERROR [jZWnAXUE78U] Connection timeout
[2023-03-20 11:42:27] DEBUG [jZWnAXUE78U] Closing connection to the server using "destroy"
[2023-03-20 11:42:27] ERROR Send Error: Connection timeout
remind_old_action(): Error: Connection timeout

It seems the problem is not with Nodemailer itself. I have also tried from express server (app) - same situation. The express app and sending mails both work from local machine. Express app itself works from Ubuntu server, but sending mails is not. I'm also using Nginx as a reverse proxy for express app, played with config, switched it on/off - sending emails does not work in either case. Nodemailer can't connect to smtp.gmail.com, gives an error after 120 sec of waiting. What else could I check?

UPD: I have enabled 2FA on google account and created a "less secure" 16-char apps password. It works correctly from local win machine, no problem with authentication, but time outs on ubuntu server.

SOLVED: "It's a trap!" (c)

The issue was that the ports 25/465 were blocked by cloud provider (Hetzner) and I unfortunately couldn't imagine this and thought the problem was on my side.

Upvotes: 0

Views: 1372

Answers (3)

Maksym Dudyk
Maksym Dudyk

Reputation: 1163

If your emails fail due to blocked ports (25/465), please, do not write to support team asking to open the ports, like @Dimitri did. Instead make changes to Nodemailer settings, using port 587 with STARTTLS instead of SSL.

const transporter = nodemailer.createTransport({
  host: "smtp.gmail.com",
  port: 587, // Use port 587 instead of 465
  secure: false, // Must be false for STARTTLS
  auth: {
    user: "[email protected]",
    pass: "your-app-password", // Use an App Password, not your real password!
  },
});


Upvotes: 0

BerenBoden
BerenBoden

Reputation: 81

Check your Ubuntu 22.04 server's firewall settings, and allow SMTP and DNS traffic.

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow out 25/tcp
sudo ufw allow out 25/udp
sudo ufw reload

After allowing those ports nodemailer started working for me. Also try disabling your firewall completely to see if it will send any emails.

Upvotes: 0

Nikhil Nirwan
Nikhil Nirwan

Reputation: 141

You are use gmail service for send mail, so you can create 16 digit password of your Gmail and this password is use

var transporter = nodemailer.createTransport(
{
    service: 'gmail',
    auth:
    {
        user: '[email protected]',
        pass: '16 digit _gmailAppPass'
    },
    logger: true
});

Upvotes: 0

Related Questions