Belajar Mailserver - Mailbox, Maildir & LMTP Delivery
Episode 9 of 23

Belajar Mailserver - Mailbox, Maildir & LMTP Delivery

Membedah tempat tinggal email: perbedaan mbox dan Maildir, anatomi direktori cur, new, dan tmp, konfigurasi mail_location di Dovecot, lalu menghubungkan Postfix ke LMTP lewat virtual_transport agar setiap pesan diserahkan dengan benar ke mailbox.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

Setelah webmail hidup di episode 8, saatnya turun ke level penyimpanan: di mana email sebenarnya tinggal? Jawabannya di mailbox — dan cara mailbox disusun menentukan keandalan, kecepatan, dan kemudahan backup.

Episode ini membedah Maildir, format penyimpanan modern yang dipakai arsitektur kita, membandingkannya dengan mbox, lalu menyambungkan Postfix ke Dovecot lewat LMTP agar setiap pesan masuk diletakkan di mailbox yang benar. Di akhir episode, kalian bisa melacak satu email dari antrian Postfix sampai ke file di disk.

mbox vs Maildir: Dua Gaya Menyimpan Email

Ada dua format penyimpanan mailbox yang dominan:

  • mbox — semua email dalam satu folder disimpan dalam satu file teks besar. Satu file per folder. Sederhana, tapi satu email rusak bisa mengganggu isi seluruh folder, dan akses bersamaan dari banyak proses rawan korupsi.
  • Maildir — setiap email menjadi file terpisah dalam direktori. Tidak ada file raksasa yang bisa rusak bersama, aman diakses banyak proses sekaligus, dan backup cukup dengan menyalin direktori.

Maildir adalah pilihan arsitektur modern. Backup, migrasi, dan akses IMAP bersamaan semuanya lebih aman. Dovecot dan Postfix sama-sama mendukungnya secara native.

Anatomi Maildir

Sebuah Maildir adalah direktori berisi tiga subdirektori dengan peran tegas:

Struktur Maildir
Maildir/
├── new/    <- pesan baru, belum dibaca klien
├── cur/    <- pesan sudah "dilihat" klien, menyimpan flag
└── tmp/    <- area penulisan sementara, anti korupsi

Alur hidup sebuah pesan: ditulis ke tmp/ dengan nama unik → dipindahkan ke new/ → setelah klien membacanya (dalam konteks IMAP, setelah melihat daftar), dipindah ke cur/ dengan penanda status seperti :2, di akhir nama file. Penanda itu adalah alasan kenapa nama file Maildir selalu diakhiri titik dua dan angka — jangan pernah "merapikan" nama file ini secara manual.

Konfigurasi mail_location

Di episode 4 kita menetapkan lokasi mailbox. Sekarang kita sempurnakan untuk virtual users:

Atur mail_location untuk virtual users
doveadm config set mail_location 'maildir:/var/mail/vhosts/%d/%n'
sudo dovecot reload

Perintah doveadm config set adalah cara resmi mengubah konfigurasi tanpa mengedit file — setara postconf -e di Postfix. Nilai di atas menempatkan Maildir tiap user di bawah /var/mail/vhosts/<domain>/<user>/. Verifikasi nilai aktif:

Verifikasi mail_location
doveconf mail_location

Pastikan direktori induk punya kepemilikan yang benar — semuanya dipegang user vmail:

Koreksi kepemilikan direktori mailbox
sudo chown -R vmail:vmail /var/mail/vhosts
sudo chmod 700 /var/mail/vhosts

Permission 700 berarti hanya user vmail yang masuk — klien tidak pernah mengakses file langsung, hanya lewat IMAP.

LMTP: Penyerahan Antar Proses

LMTP (Local Mail Transfer Protocol) adalah saudara SMTP yang dirancang khusus untuk penyerahan lokal. Perbedaannya dengan SMTP biasa:

  • LMTP memberi jawaban per pesan — kalau ada satu pesan gagal dalam satu batch, yang lain tetap sukses. SMTP hanya menjawab per sesi.
  • LMTP tidak melewati antrian panjang — cocok untuk penyerahan langsung ke Dovecot.

Dovecot menyediakan layanan LMTP lewat Unix socket, dan Postfix memanggilnya untuk setiap pesan masuk. Aktifkan listener di konfigurasi Dovecot (conf.d/20-lmtp.conf):

plaintext
protocol lmtp {
  mail_plugins = sieve
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

Perhatikan: socket diletakkan di dalam direktori chroot Postfix (/var/spool/postfix/private/), sehingga Postfix bisa mengaksesnya tanpa melepas chroot. Ini pola yang wajib diingat.

Menghubungkan Postfix ke LMTP

Di episode 7 kita memakai virtual_transport = virtual, yang berarti Postfix menyerahkan via program internal virtual. Sekarang kita ganti ke LMTP:

Arahkan delivery ke Dovecot LMTP
sudo postconf -e 'virtual_transport = lmtp:unix:private/dovecot-lmtp'
sudo postconf -e 'mailbox_transport = lmtp:unix:private/dovecot-lmtp'
sudo postfix check
sudo postfix reload

Penjelasan dua parameter:

  • virtual_transport — transport untuk email ke domain virtual; kini lewat LMTP.
  • mailbox_transport — transport untuk user sistem (fallback), juga diarahkan ke LMTP agar semua jalur konsisten.

Info

Nama private/dovecot-lmtp bersifat relatif terhadap direktori antrian Postfix. Jika socket Dovecot ditempatkan di tempat lain, sesuaikan jalur di kedua sisi — kalibrasi yang salah membuat status deferred di antrian.

Setelah reload, kirim email uji ke akun virtual dan amati hasilnya:

Kirim uji dan periksa log
echo "hello lmtp" | mail -s "LMTP test" admin@example.com
journalctl -u postfix --since "1 minute ago"

Cari baris berisi status=sent dan lmtp di log. Lalu periksa hasilnya di disk:

Lihat pesan tiba di Maildir
ls -la /var/mail/vhosts/example.com/admin/Maildir/new/

Jika satu file email muncul, jalur Postfix → LMTP → Maildir bekerja sempurna.

Menelusuri Satu Email dari A sampai Z

Sekarang mari ikuti satu email secara utuh, karena kemampuan ini akan menyelamatkan kalian berkali-kali:

Baca header email yang baru tiba
cat /var/mail/vhosts/example.com/admin/Maildir/new/* | grep -E '^Received:'

Output Received: berantai menceritakan perjalanan pesan: klien → server kalian → (via LMTP) → server tujuan. Membaca rantai header ini adalah keterampilan debugging paling berharga di dunia mail server — episode 19 akan memakainya lebih dalam.

Penutup

Episode 9 selesai. Inti yang harus dibawa pulang:

  • Maildir menyimpan satu email per file di new/, cur/, dan tmp/ — aman dan mudah di-backup.
  • mail_location = maildir:/var/mail/vhosts/%d/%n adalah kunci lokasi mailbox virtual.
  • LMTP memberi jawaban per pesan dan menyerahkan langsung ke Dovecot via Unix socket.
  • virtual_transport = lmtp:unix:private/dovecot-lmtp menghubungkan Postfix ke Dovecot.
  • Socket LMTP harus berada di dalam direktori chroot Postfix.

Penyimpanan sudah rapi. Di episode 10 kita mengelola alamat: Alias, Forwarding & Mailing List Dasar — dari alias per-user, forward email ke tujuan lain, sampai menangani penerima yang tidak dikenal. Sampai jumpa di episode 10!

Belajar Mailserver - Mailbox, Maildir & LMTP Delivery | Belajar Mailserver