Mengirim email langsung dari aplikasi web adalah salah satu kebutuhan paling dasar namun krusial bagi developer modern. Baik itu untuk formulir kontak, notifikasi sistem, atau manajemen pengguna, kemampuan mengirim email secara andal menentukan kualitas interaksi aplikasi dengan pengguna.
Sayangnya, banyak developer mengalami kendala seperti email yang masuk folder spam, kegagalan autentikasi, atau error SSL/TLS yang membuat proses pengiriman gagal.
Salah satu cara paling aman dan fleksibel untuk mengatasi masalah tersebut adalah dengan membangun mail server sendiri menggunakan protokol SMTP dengan TLS. Dengan cara ini, kita memiliki kendali penuh atas konfigurasi server, autentikasi, dan keamanan email. Integrasi dengan PHP menggunakan library seperti PHPMailer membuat proses pengiriman email lebih stabil dan terstandarisasi, terutama saat digunakan untuk website atau aplikasi internal.
Panduan ini akan memandu Anda dari persiapan server, konfigurasi DNS, setup Postfix & Dovecot, hingga integrasi dengan PHP. Setiap langkah dijelaskan dengan detail, termasuk tips untuk menghindari email masuk spam dan trik debugging jika terjadi error. Setelah mengikuti panduan ini, Anda akan memiliki mail server yang aman, reliable, dan siap digunakan untuk aplikasi web Anda.
Contents
- 1 1. Persiapan Server
- 2 2. Konfigurasi DNS
- 3 3. Konfigurasi Postfix
- 4 4. Konfigurasi Dovecot untuk Otentikasi SMTP
- 5 5. Testing SMTP dengan Swaks
- 6 6. Install Sertifikat SSL/TLS dengan Let’s Encrypt
- 7 7. Integrasi PHP dengan PHPMailer
- 8 8. Menghindari Email Masuk Spam
- 9 9. Tips Debugging
- 10 10. Ringkasan Arsitektur
- 11 FAQ
1. Persiapan Server
Sebelum membangun mail server, pastikan server Linux Anda siap. Disarankan menggunakan Ubuntu 20.04 atau 22.04 karena stabilitas dan dukungan paket yang lengkap. Selain itu, memiliki subdomain khusus untuk mail (misal mail.seosatu.com) akan membantu reputasi email dan mempermudah konfigurasi DNS. IP publik server harus terbuka untuk port email standar (25, 465, 587) agar email bisa terkirim keluar tanpa diblokir.
Install Package Dasar
sudo apt update
sudo apt install postfix dovecot-core dovecot-imapd dovecot-pop3d -y
sudo apt install mailutils ufw fail2ban -y
- Postfix → Mail Transfer Agent (MTA) yang menangani pengiriman dan penerimaan email.
- Dovecot → Mail Delivery Agent (MDA) untuk autentikasi pengguna dan protokol IMAP/POP3.
- mailutils → Tools untuk menguji pengiriman email dari command line.
- ufw → Firewall untuk mengontrol akses port email.
- fail2ban → Perlindungan brute-force terhadap login email.
Aktifkan firewall dan buka port email:
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 465/tcp
sudo ufw enable
2. Konfigurasi DNS
DNS adalah bagian krusial agar email tidak masuk spam. Pastikan membuat beberapa record berikut:
A Record
mail.seosatu.com → 123.45.67.89
MX Record
seosatu.com MX 10 mail.seosatu.com
SPF Record
seosatu.com TXT "v=spf1 a mx ip4:123.45.67.89 ~all"
DKIM Record
mail._domainkey.seosatu.com TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqh..."
DMARC Record
_dmarc.seosatu.com TXT "v=DMARC1; p=quarantine; rua=mailto:admin@seosatu.com"
3. Konfigurasi Postfix
main.cf Minimal
myhostname = mail.seosatu.com
mydomain = seosatu.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydomain
home_mailbox = Maildir/
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.seosatu.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.seosatu.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
master.cf Minimal untuk Submission (Port 587)
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
4. Konfigurasi Dovecot untuk Otentikasi SMTP
conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login
Restart Services
sudo systemctl restart postfix dovecot
sudo systemctl enable postfix dovecot
5. Testing SMTP dengan Swaks
swaks --to test@example.com \
--from mail_user \
--server mail.seosatu.com \
--port 587 \
--auth LOGIN \
--auth-user mailuser \
--auth-password 'password_kamu' \
--tls
Jika berhasil, akan muncul Authentication successful.
6. Install Sertifikat SSL/TLS dengan Let’s Encrypt
sudo apt install certbot
sudo certbot certonly --standalone -d mail.seosatu.com
sudo systemctl reload postfix dovecot
7. Integrasi PHP dengan PHPMailer
File send_email.php
<?php
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';
require 'PHPMailer/Exception.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'mail.seosatu.com';
$mail->SMTPAuth = true;
$mail->Username = 'mail_user';
$mail->Password = 'password_kamu';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('admin@seosatu.com', 'SEOsatu Notif');
$mail->addAddress('abc@gmail.com', 'Admin');
$mail->addReplyTo($_POST['email'], $_POST['name']);
$mail->isHTML(true);
$mail->Subject = $_POST['subject'] ?? 'Message from website';
$mail->Body = nl2br($_POST['message'] ?? '');
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
8. Menghindari Email Masuk Spam
- Pastikan SPF, DKIM, DMARC benar.
- Gunakan subdomain khusus mail.
- Hostname FQDN sama dengan sertifikat.
- Hindari shared IP reputasi buruk.
- Hindari kata-kata spam di subject/body.
9. Tips Debugging
- Cek log Postfix:
tail -f /var/log/mail.log - Cek Dovecot auth:
doveadm auth test mailuser - Tes SMTP:
swaks ... --tls - Error SSL/TLS → pastikan sertifikat valid.
10. Ringkasan Arsitektur
Client (PHP Form) --> PHPMailer (SMTP TLS 587) --> Postfix (MTA) --> Internet
\
-> Dovecot (SASL Auth)
FAQ
Q1: Apakah harus pakai TLS?
Ya. TLS wajib untuk enkripsi dan menghindari error SSL di PHPMailer. Port 587 adalah standar untuk submission.
Q2: Bisa menggunakan port 465?
Bisa, tapi harus konfigurasi smtpd_tls_wrappermode=yes di Postfix. Port 587 lebih fleksibel untuk submission.
Q3: Bagaimana jika email masuk spam?
Periksa SPF, DKIM, DMARC, hostname FQDN, dan hindari konten spammy.
Q4: Bisakah menambahkan user baru?
Ya, cukup buat user system Linux baru (adduser mailuser2) dan test dengan doveadm auth test mailuser2.
Q5: Bagaimana cara update sertifikat Let’s Encrypt otomatis?
Gunakan cronjob:
0 3 * * * certbot renew --quiet && systemctl reload postfix dovecot