How to Test Sending SMTP Email locally with Nodemailer

tanut aran
2 min readMar 21, 2023

--

The local SMTP service with SMTP4Dev

Thanks to this repos https://github.com/rnwood/smtp4dev

This can receive and see the email content.

You can easily spin the service up with docker and go to localhost for the web admin.

docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev

There are two service :2525 is the SMTP service and :8090 on the web admin.

Nodemailer code

We use nodemailer to connect to the SMTP service.

const htmlMail = ... HTML string ...

const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: false, // upgrade later with STARTTLS
tls: { rejectUnauthorized: false },
auth: {
user: process.env.SMTP_USERNAME,
pass: process.env.SMTP_PASSWORD,
},
});

await transporter.sendMail({
from: 'test@example.com',
to: 'test@example.com',
subject: 'Test message title',
html: htmlMail,
});

You can test it as script or bind it to GET /my-test-path to run it.

Then open the console to check the result

Bonus: Isolate testing of mock SMTP

How to know that SMTP is up and running?


$ telnet localhost 2525
Trying ::1...
Connected to localhost.
Escape character is '^]'.

220 419e193661e8 smtp4dev ready
HELO any-name
250 Nice to meet you
MAIL FROM:<foo@bar.com>
250 New message started
RCPT TO:<bar@baz.com>
250 Recipient accepted
DATA
354 End message with period
SUBJECT: This is subject
Hello,
Foo Bar Baz
Best regards,
Foo
.
250 Mail accepted
QUIT
221 Goodbye
Connection closed by foreign host.

CERT_HAS_EXPIRED Error: certificate has expired

Using normal unencrypted port need either

Globally set

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

Or better set locally at Nodemailer

const transporter = nodemailer.createTransport({
...
tls: { rejectUnauthorized: false }, <--- HERE
...
});

Hope this help !

--

--

tanut aran
tanut aran

Written by tanut aran

Co-founder and Coder at work !

Responses (1)