Cara Membangun Mail Server dengan Postfix di Ubuntu

Membangun Mail Server dengan Postfix di Ubuntu

Server gue mati jam 2 pagi. Email dari aplikasi tidak terkirim. Client marah. Dan gue baru sadar waktu itu bahwa selama ini gue terlalu bergantung pada layanan email pihak ketiga yang bisa down kapan saja tanpa pemberitahuan.

Dari situlah gue mulai serius belajar cara membangun mail server sendiri dengan Postfix di Ubuntu. Bukan karena ingin rumit, tapi karena ingin punya kendali penuh atas email yang dikirim dari aplikasi gue sendiri.

Artikel ini menyelesaikan satu masalah konkret: kamu punya server Ubuntu, kamu punya domain, dan kamu butuh server bisa kirim atau terima email, entah itu notifikasi dari aplikasi, konfirmasi registrasi user, atau kebutuhan lainnya. Mari kita mulai.

Apa Itu Ubuntu, dan Kenapa Gue Tidak Mau Pakai yang Lain?

Kalau kamu pernah main Lego, Ubuntu itu seperti baseplate-nya. Bukan pieces yang warna-warni, bukan instruksi bangunan yang mewah, tapi fondasi datar yang stabil tempat semua hal bisa dibangun di atasnya. Tanpa baseplate yang rata, tower setinggi apapun bakal goyah dari awal.

Gue pertama kali install Ubuntu 24.04 pas ngerjain freelance project di awal 2026. Sebelumnya gue pakai distro lain yang, jujur, lebih “seksi” di atas kertas tapi bikin gue debugging dependency hell tiap minggu. Pindah ke Ubuntu 24.04 LTS terasa seperti bernapas lagi. Bootnya lebih cepat, package managernya lebih stabil, dan yang paling penting: komunitas Ubuntu itu besar. Kalau error jam 3 pagi, hampir pasti ada yang pernah mengalami hal yang sama dan sudah menulis solusinya di Stack Overflow.

Gue tidak bilang Ubuntu sempurna. Debian lebih pure, Arch lebih cutting-edge, tapi untuk sysadmin yang butuh sesuatu yang just works tanpa drama, Ubuntu LTS adalah pilihan yang masuk akal. Terutama Ubuntu 24.04 yang punya support sampai 2029.

Apa yang Akan Kita Bangun?

Sebelum mulai ngetik perintah, penting banget untuk tahu dulu apa yang mau dibentuk. Bayangkan kamu deploy aplikasi Node.js (misalnya Express.js) dan butuh fitur “Lupa Password” yang kirim email reset ke user. Tanpa mail server sendiri, kamu harus bayar SendGrid atau Mailgun. Dengan Postfix yang dikonfigurasi dengan benar, kamu bisa kirim email langsung dari server kamu sendiri.

Stack yang kita bangun:

  • Postfix sebagai MTA (Mail Transfer Agent) untuk kirim dan routing email
  • Dovecot untuk IMAP/POP3 agar email bisa dibaca dari client seperti Thunderbird
  • SASL Authentication untuk keamanan koneksi SMTP

Prasyarat Sebelum Mulai

Pastikan ini sudah ada sebelum lanjut:

  • Server Ubuntu 24.04 LTS dengan akses sudo
  • RAM minimal 1GB, tapi 2GB lebih nyaman untuk produksi
  • Domain yang sudah pointing ke IP server (record A dan MX)
  • Port 25, 587, dan 993 tidak diblokir oleh hosting provider kamu

⚠️ Perhatian: Banyak cloud provider seperti AWS, GCP, atau Oracle Cloud memblokir port 25 secara default untuk mencegah spam. Sebelum lanjut, cek dulu ke support mereka apakah port 25 outbound sudah dibuka. Ini adalah kesalahan yang pernah gue buat: sudah konfigurasi Postfix sempurna, tapi email tetap tidak terkirim karena port 25 outbound diblokir di level network provider. Gue panik selama 3 jam sebelum sadar masalahnya bukan di konfigurasi, tapi di firewall provider.

Langkah 1: Update Sistem dan Set Hostname

Sebelum install apapun, pastikan sistem kamu bersih dan hostname sudah sesuai dengan domain yang akan dipakai.

Kenapa ini penting? Postfix menggunakan hostname server sebagai identitas saat berkomunikasi dengan SMTP server lain. Jika hostname tidak cocok dengan domain kamu, email bisa langsung ditolak atau masuk spam.

# Update dan upgrade semua package yang ada
sudo apt update && sudo apt upgrade -y
# Set hostname ke FQDN (Fully Qualified Domain Name) kamu
sudo hostnamectl set-hostname mail.domainmu.com
# Verifikasi hostname sudah benar
hostname -f

Outputnya harus menampilkan mail.domainmu.com, bukan hanya mail.

Selanjutnya, edit file /etc/hosts agar hostname resolve secara lokal:

sudo nano /etc/hosts
# Tambahkan atau edit baris ini, sesuaikan IP dan domain kamu
127.0.1.1    mail.domainmu.com    mail
203.0.113.10 mail.domainmu.com    mail

💡 Tips dari Pengalaman: Gunakan IP publik server kamu, bukan 127.0.0.1, di bagian hosts. Waktu pertama kali gue setup ini, gue pakai 127.0.0.1 dan email internal jalan, tapi email ke luar server gagal terus karena HELO greeting tidak cocok dengan IP yang terlihat dari luar.

Langkah 2: Install Postfix dan Paket Pendukung

Ini bagian intinya. Kita install Postfix bersama sasl2-bin untuk autentikasi.

Kenapa SASL? Tanpa autentikasi, siapa saja yang punya akses ke server bisa menggunakan SMTP kamu untuk kirim spam. SASL memastikan hanya user yang sudah terverifikasi yang bisa mengirim email melalui server kamu.

# Install Postfix dan library SASL untuk autentikasi
sudo apt install -y postfix sasl2-bin

Saat instalasi, akan muncul wizard konfigurasi. Pilih “Internet Site” dan masukkan domain kamu (contoh: domainmu.com).

⚠️ Perhatian: Jangan pilih “No Configuration” kecuali kamu sudah sangat paham apa yang mau dikonfigurasi manual. Kalau pilih ini, kamu mulai dari file kosong dan harus konfigurasi semua dari nol. Untuk pemula, “Internet Site” sudah cukup sebagai titik mulai.

Setelah instalasi selesai, backup file konfigurasi original sebelum kamu edit:

# Backup konfigurasi default, ini kebiasaan yang menyelamatkan gue berkali-kali
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

Langkah 3: Konfigurasi main.cf Postfix

File /etc/postfix/main.cf adalah jantung dari setup ini. Edit dengan nano atau editor favoritmu:

sudo nano /etc/postfix/main.cf

Berikut konfigurasi yang perlu kamu sesuaikan. Gue cantumkan setiap direktif beserta penjelasannya agar kamu paham apa yang terjadi, bukan sekadar copy-paste buta:

# Identitas server — wajib sesuai domain kamu
myhostname = mail.domainmu.com
mydomain = domainmu.com
myorigin = $mydomain

# Interface yang didengarkan Postfix — "all" artinya semua interface, termasuk publik
inet_interfaces = all
inet_protocols = ipv4

# Domain tujuan yang diterima server ini
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# Network yang dipercaya untuk kirim email tanpa autentikasi (hanya lokal)
mynetworks_style = subnet
mynetworks = 127.0.0.0/8

# Format penyimpanan email — Maildir lebih modern daripada mbox
home_mailbox = Maildir/

# Banner yang ditampilkan ke SMTP server lain — hapus info versi untuk keamanan
smtpd_banner = $myhostname ESMTP

# Ukuran maksimal email: 10MB
message_size_limit = 10240000

# Keamanan dasar
disable_vrfy_command = yes
smtpd_helo_required = yes

# Konfigurasi SASL untuk autentikasi SMTP
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

# Aturan penerimaan email
smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_unauth_destination

💡 Tips dari Pengalaman: Direktif smtpd_recipient_restrictions itu ibarat bouncer di depan pintu. Urutan rule-nya penting banget — Postfix membaca dari atas ke bawah. Kalau kamu taruh reject_unauth_destination di posisi pertama, semua email akan ditolak sebelum sempat dicek rule berikutnya. Gue pernah bikin server tidak bisa terima email sama sekali gara-gara urutan ini salah.

Langkah 4: Install dan Konfigurasi Dovecot

Dovecot bertugas sebagai IMAP/POP3 server sekaligus menyediakan mekanisme autentikasi SASL yang digunakan Postfix.

# Install Dovecot core, IMAP, dan POP3
sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d

Edit konfigurasi autentikasi Dovecot:

sudo nano /etc/dovecot/conf.d/10-auth.conf
# Izinkan plain text auth — aman karena kita akan gunakan TLS nantinya
disable_plaintext_auth = no
auth_mechanisms = plain login

Lalu konfigurasi lokasi penyimpanan mail agar cocok dengan setting Postfix:

sudo nano /etc/dovecot/conf.d/10-mail.conf
# Harus sama dengan home_mailbox di Postfix
mail_location = maildir:~/Maildir

Terakhir, aktifkan socket autentikasi yang digunakan Postfix:

sudo nano /etc/dovecot/conf.d/10-master.conf

Cari blok service auth dan tambahkan Unix socket:

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

⚠️ Perhatian: Path socket /var/spool/postfix/private/auth harus persis sama dengan nilai smtpd_sasl_path di main.cf Postfix. Perbedaan satu karakter saja menyebabkan Postfix tidak bisa connect ke Dovecot untuk autentikasi dan semua login akan gagal.

Langkah 5: Konfigurasi Firewall dan Restart Service

# Buka port yang diperlukan
sudo ufw allow 25/tcp    # SMTP
sudo ufw allow 587/tcp   # SMTP Submission
sudo ufw allow 993/tcp   # IMAPS
sudo ufw allow 110/tcp   # POP3 (opsional)
sudo ufw reload
# Restart kedua service dan aktifkan otomatis saat boot
sudo systemctl restart postfix dovecot
sudo systemctl enable postfix dovecot

Bagaimana Cara Verifikasi Mail Server Sudah Jalan dengan Benar?

Sebagian besar tutorial berhenti di systemctl status postfix. Tapi itu tidak cukup. Status “active (running)” hanya berarti service berjalan, bukan berarti email bisa terkirim.

Verifikasi Standar

# Cek status service
sudo systemctl status postfix
sudo systemctl status dovecot
# Cek Postfix sedang listen di port yang benar
sudo ss -tlnp | grep master

Outputnya harus menampilkan Postfix listen di port 25 dan 587.

Verifikasi yang Jarang Disebutkan Tutorial Lain

Test koneksi SMTP langsung via telnet — ini cara paling raw untuk tahu apakah server kamu benar-benar menerima koneksi SMTP:

# Install telnet jika belum ada
sudo apt install -y telnet

# Uji koneksi ke port 25 dari localhost
telnet localhost 25

Kalau berhasil, kamu akan melihat banner seperti ini:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domainmu.com ESMTP

Kirim email test dari command line:

# Install mailutils untuk perintah mail
sudo apt install -y mailutils

# Kirim email test ke akun yang ada di server
echo "Test dari Postfix" | mail -s "Test Email" [email protected]

Cek mail queue apakah kosong:

# Kalau ada email stuck di queue, ini yang muncul
mailq

# Jika output-nya "Mail queue is empty", konfigurasi kirim sudah beres

Cek log untuk konfirmasi email terkirim:

# Ini bagian paling jujur — lihat langsung apa yang terjadi
sudo tail -f /var/log/mail.log

Cari baris dengan kata status=sent. Kalau yang muncul adalah status=deferred atau status=bounced, ada masalah yang harus diselesaikan.

Troubleshooting: 4 Masalah Nyata yang Sering Gue Temui

1. Email Terkirim tapi Masuk Spam

Gejala: Email sampai ke tujuan, tapi ada di folder Spam/Junk, bukan Inbox.

Root cause: Server kamu tidak punya SPF record, DKIM, atau DMARC. Server penerima (Gmail, Yahoo) tidak bisa memverifikasi bahwa email itu benar-benar dari domain kamu.

Solusi:

# Install OpenDKIM
sudo apt install -y opendkim opendkim-tools

# Generate DKIM key untuk domain kamu
sudo opendkim-genkey -t -s mail -d domainmu.com

Lalu tambahkan TXT record berikut ke DNS kamu:

  • SPF: v=spf1 ip4:IP_SERVER_KAMU ~all
  • DKIM: Isi dari file mail.txt yang dihasilkan perintah di atas
  • DMARC: v=DMARC1; p=none; rua=mailto:[email protected]

Tip pencegahan: Setup SPF, DKIM, dan DMARC sejak hari pertama sebelum kirim email pertama. Reputasi IP itu dibangun dari awal, bukan diperbaiki setelah kena mark spam.

2. Connection refused saat Telnet ke Port 25

Gejala: telnet localhost 25 langsung muncul “Connection refused”.

Root cause: Postfix tidak berjalan, atau ada konflik konfigurasi yang mencegahnya start.

Solusi:

# Cek detail error saat Postfix start
sudo journalctl -xe | grep postfix

# Validasi konfigurasi tanpa restart
sudo postfix check

# Restart ulang
sudo systemctl restart postfix

Tip pencegahan: Selalu jalankan sudo postfix check setelah setiap perubahan di main.cf sebelum restart. Ini akan menangkap typo sebelum service crash.

3. Email Terjebak di Queue dengan Status deferred

Gejala: mailq menampilkan daftar email dengan tanda ! di depannya.

Root cause: Paling sering karena port 25 outbound diblokir oleh provider, atau DNS MX record server tujuan tidak bisa di-resolve.

Solusi:

# Cek detail kenapa email deferred
sudo postcat -vq [QUEUE_ID]

# Test apakah port 25 outbound terbuka ke server lain
telnet gmail-smtp-in.l.google.com 25

# Paksa retry email yang stuck
sudo postqueue -f

Tip pencegahan: Sebelum deploy ke produksi, test port 25 outbound dengan perintah telnet di atas. Kalau langsung “Connection refused” atau timeout, hubungi provider kamu.

4. Relaying Denied untuk Email Legitimate (Yang Jarang Dibahas Tutorial Lain)

Gejala: Aplikasi kamu mencoba kirim email via SMTP, tapi muncul error “554 5.7.1 Relay access denied”.

Root cause: Ini terjadi ketika aplikasi mencoba kirim email tanpa autentikasi SASL, dan IP-nya tidak ada di mynetworks. Banyak tutorial tidak menyebut ini karena mereka test dari localhost, sedangkan di produksi aplikasi kamu mungkin berjalan di container atau IP yang berbeda.

Solusi:

# Tambahkan IP aplikasi ke mynetworks di main.cf
sudo nano /etc/postfix/main.cf
# Tambahkan IP container/aplikasi ke mynetworks
mynetworks = 127.0.0.0/8, 172.17.0.0/16

Atau lebih baik, konfigurasi aplikasimu untuk kirim email dengan autentikasi SMTP (port 587 dengan username/password), sehingga tidak perlu whitelist IP manual.

Tip pencegahan: Jangan pernah set mynetworks = 0.0.0.0/0. Ini membuat server kamu menjadi open relay yang akan dieksploitasi untuk kirim spam dalam hitungan jam.

Perintah Postfix yang Wajib Dihafal

Perintah Fungsi Kapan Dipakai
sudo systemctl restart postfix Restart Postfix Setelah mengubah main.cf
sudo systemctl status postfix Cek status service Awal troubleshooting
sudo postfix check Validasi konfigurasi Sebelum restart setelah edit config
mailq Lihat email queue Ketika email terasa lambat terkirim
sudo postqueue -f Paksa retry queue Ketika ada email deferred yang ingin dicoba ulang
sudo postsuper -d ALL Hapus semua email di queue Ketika queue penuh dengan email gagal yang tidak perlu
sudo tail -f /var/log/mail.log Monitor log real-time Saat debug pengiriman email live
sudo postconf -n Tampilkan config yang berbeda dari default Saat perlu audit konfigurasi aktif
sudo postcat -vq [ID] Lihat isi email di queue Saat ingin tahu email mana yang stuck

FAQ Singkat

Apakah Postfix bisa dipakai untuk kirim email dari aplikasi Laravel/Node.js?
Bisa. Arahkan SMTP host aplikasimu ke IP server dengan port 587, gunakan autentikasi username/password yang sudah dikonfigurasi di Dovecot.

Berapa lama MX record DNS propagasi setelah diatur?
Biasanya antara 15 menit sampai 48 jam tergantung TTL yang kamu set dan registrar domain yang dipakai. Cek propagasi dengan dig MX domainmu.com.

Apakah perlu SSL/TLS untuk Postfix?
Untuk lingkungan produksi, ya. Tanpa TLS, password autentikasi SMTP berjalan dalam plaintext. Gunakan Certbot untuk dapat sertifikat Let’s Encrypt gratis dan konfigurasi di main.cf dengan smtpd_tls_cert_file dan smtpd_tls_key_file.

Beda apa SMTP port 25 vs 587?
Port 25 untuk komunikasi antar SMTP server (server-to-server). Port 587 untuk aplikasi atau mail client yang submit email ke server kamu (client-to-server) dengan autentikasi. Jangan ekspos port 25 ke sembarang client.

Kalau kamu sampai di sini dan mail server kamu sudah running, selamat. Gue ingat pertama kali berhasil setup ini, gue kirim email test ke akun pribadi dan nunggu 10 detik sampai notifikasi masuk. Kepuasan yang beda rasanya dibanding pakai layanan siap pakai.

Leave a Reply

Your email address will not be published. Required fields are marked *