Setting Up Email Sending via SMTP Server
SMTP is the basic transport protocol for email. Used when you don't want to pay for an ESP or when an application runs inside corporate infrastructure with its own mail server (Postfix, Exim, Microsoft Exchange).
Sending via Nodemailer
npm install nodemailer
npm install -D @types/nodemailer
import nodemailer from 'nodemailer';
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST, // smtp.gmail.com, smtp.yandex.ru, etc.
port: Number(process.env.SMTP_PORT ?? 465),
secure: true, // true for 465, false for 587
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
// For corporate SMTP with self-signed certificates
tls: {
rejectUnauthorized: process.env.NODE_ENV === 'production',
},
});
// Check connection at server startup
await transporter.verify();
console.log('SMTP ready');
Sending Email
async function sendEmail(params: {
to: string | string[];
subject: string;
html: string;
text?: string;
attachments?: nodemailer.Attachment[];
}) {
const info = await transporter.sendMail({
from: `"Acme Support" <[email protected]>`,
to: params.to,
subject: params.subject,
html: params.html,
text: params.text,
attachments: params.attachments,
headers: {
'X-Mailer': 'Acme App v2',
},
});
return info.messageId;
}
// Example with PDF attachment
await sendEmail({
to: '[email protected]',
subject: 'Your Invoice #INV-2026-042',
html: invoiceHtml,
attachments: [
{
filename: 'invoice-2026-042.pdf',
content: pdfBuffer,
contentType: 'application/pdf',
},
],
});
Connection Pool for High Load
When sending many emails, create a pool instead of one transport:
const poolTransporter = nodemailer.createTransport({
pool: true,
maxConnections: 5, // parallel connections
maxMessages: 100, // messages per connection before reconnect
host: process.env.SMTP_HOST,
port: 465,
secure: true,
auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS },
});
Popular SMTP Providers
| Provider | SMTP Host | Port | Limit |
|---|---|---|---|
| Gmail | smtp.gmail.com | 465/587 | 500/day |
| Yandex | smtp.yandex.ru | 465 | 500/day |
| Mail.ru | smtp.mail.ru | 465 | 500/day |
| Mailgun | smtp.mailgun.org | 587 | per plan |
| Brevo | smtp-relay.brevo.com | 587 | 300/day free |
Timeline
SMTP setup with Nodemailer — 1–2 days.







