Email

Mengirim email dengan Nodemailer

Nodemailer adalah pustaka standar untuk mengirim email dari server Node.js. Anda membuat transport yang mengarah ke server SMTP, lalu memanggil sendMail dengan field pesan. Nodemailer menangani connection pooling, lampiran, dan body HTML. Kode di bawah adalah minimum yang Anda butuhkan untuk mengirim pesan sungguhan, ditambah trik pengujian yang sering terlewat.

Bagaimana cara menginstal dan mengonfigurasi Nodemailer?

Instal dari npm:

npm install nodemailer

Transport menyimpan detail koneksi SMTP Anda. Arahkan ke host dan port, lalu masukkan kredensial di bawah auth:

import nodemailer from "nodemailer";

const transporter = nodemailer.createTransport({
  host: "smtp.example.com",
  port: 587,
  secure: false, // true for port 465, false for 587 (STARTTLS)
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS,
  },
});

Port 587 dengan secure: false menggunakan STARTTLS, yang meng-upgrade koneksi ke TLS setelah handshake. Port 465 memerlukan secure: true. Simpan username dan password di environment variable, jangan pernah di source code.

Bagaimana cara mengirim pesan?

Panggil sendMail dengan envelope dan konten. Fungsi ini mengembalikan promise, jadi bungkus dalam async/await dengan try/catch agar pengiriman yang gagal tidak menghentikan proses:

async function main() {
  try {
    const info = await transporter.sendMail({
      from: '"Your App" <you@yourdomain.com>',
      to: "recipient@example.org",
      subject: "Your receipt",
      text: "Thanks for your order. This is the plain-text version.",
      html: "<p>Thanks for your order.</p>",
    });
    console.log("Sent:", info.messageId);
  } catch (err) {
    console.error("Send failed:", err);
  }
}

main();

Selalu kirim text dan html sekaligus. Beberapa klien merender bagian plain-text, dan pesan tanpa alternatif teks cenderung mendapat skor lebih buruk di filter spam.

Bagaimana cara menambahkan lampiran?

Masukkan array attachments. Setiap entri dapat membaca dari path, buffer, atau stream:

await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "recipient@example.org",
  subject: "Your invoice",
  text: "Invoice attached.",
  attachments: [
    {
      filename: "invoice.pdf",
      path: "./invoices/invoice-1042.pdf",
    },
    {
      filename: "note.txt",
      content: "Generated at runtime, no file needed.",
    },
  ],
});

Bagaimana cara menguji tanpa mengirim email sungguhan?

Nodemailer menyertakan Ethereal, layanan SMTP palsu yang menangkap pesan alih-alih mengirimnya. Anda mendapat URL pratinjau untuk setiap pengiriman, cocok untuk pengembangan lokal:

const testAccount = await nodemailer.createTestAccount();

const transporter = nodemailer.createTransport({
  host: "smtp.ethereal.email",
  port: 587,
  secure: false,
  auth: {
    user: testAccount.user,
    pass: testAccount.pass,
  },
});

const info = await transporter.sendMail({
  from: "you@yourdomain.com",
  to: "test@example.org",
  subject: "Preview only",
  text: "This never leaves Ethereal.",
});

console.log("Preview:", nodemailer.getTestMessageUrl(info));

Ethereal digunakan untuk memeriksa hasil yang Anda buat. Ethereal tidak memberi tahu apakah inbox sungguhan akan menerima pesan tersebut.

Kirim dengan Bird

SMTP berfungsi, tetapi menjalankannya di produksi berarti mengoperasikan mail server (atau menyewa satu), melakukan pemanasan IP, dan memantau reputasi sendiri. HTTP API mengambil alih semua itu. Tidak ada socket SMTP yang perlu dijaga tetap terbuka, dan provider mengelola infrastruktur deliverability. Dengan Bird email API, pengiriman yang sama cukup satu panggilan:

import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.email
  .send({
    from: "you@yourdomain.com",
    to: ["delivered@bird.dev"],
    subject: "Hello from Node",
    html: "<p>It works.</p>",
  })
  .safe();

Alamat sandbox delivered@bird.dev selalu menerima email, sehingga Anda dapat mengonfirmasi konfigurasi sebelum mengirim ke penerima sungguhan. Platform serverless adalah kasus paling jelas untuk pendekatan ini, karena runtime fungsinya sering tidak dapat mempertahankan koneksi SMTP tetap terbuka. Lihat cara mengirim email di Vercel untuk jalur tersebut, dan ikhtisar mengirim email dengan JavaScript yang lebih luas tentang di mana kode email seharusnya berada dalam stack Anda.

FAQ

Apakah Nodemailer berfungsi di browser?

Tidak. Nodemailer adalah pustaka sisi server dan bergantung pada modul jaringan Node. Browser tidak dapat membuka koneksi SMTP, dan menaruh kredensial di kode klien akan mengeksposnya. Kirim dari backend sebagai gantinya.

Mengapa mengirim teks dan HTML sekaligus?

Pesan multipart memungkinkan setiap klien memilih bagian yang dapat dirender, dan alternatif plain-text meningkatkan cara filter spam membaca pesan. Melewatkan text adalah alasan umum email masuk ke spam.

Haruskah saya menggunakan SMTP atau HTTP API?

SMTP cukup untuk volume rendah dan alat internal. Untuk pengiriman produksi berskala besar, HTTP API menghilangkan server yang seharusnya perlu Anda operasikan dan menyertakan penanganan deliverability. Banyak tim menggunakan Nodemailer saat pengembangan dan API di produksi.

Nodemailer adalah pilihan solid untuk berkomunikasi lewat SMTP dari Node. Jika Anda tidak ingin menjalankan mail server di belakangnya, baca panduan mengirim email untuk melihat alternatif API secara menyeluruh.

Bangun di jaringan yang sama.

Kunci API uji coba langsung tersedia untuk Anda. Akses produksi terbuka saat Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Ide Anda berikutnya.
Siap terhubung.