Kirim Email dengan PHP: mail() vs PHPMailer
Mengirim email adalah kebutuhan yang sangat umum di aplikasi web. Contohnya:
- form kontak
- email reset password
- notifikasi pesanan
- email verifikasi akun
Di PHP, ada dua pendekatan yang paling sering ditemui:
- memakai fungsi bawaan
mail() - memakai library seperti PHPMailer
Untuk belajar, kamu sebaiknya memahami keduanya. Tetapi untuk project sungguhan, PHPMailer + SMTP biasanya jauh lebih stabil.
Kenapa mail() Sering Membingungkan?
Di komputer local, banyak pemula menulis kode mail() lalu mengira semuanya benar karena fungsi tersebut mengembalikan true. Padahal emailnya tidak pernah benar-benar terkirim.
Itu terjadi karena:
- server local belum punya mail server yang terkonfigurasi
- header email kurang lengkap
- provider email menolak email yang tidak lolos autentikasi
Karena itu, anggap mail() sebagai pengenalan konsep. Untuk penggunaan nyata, lebih aman memakai SMTP melalui PHPMailer.
1. Membuat Form Kontak Sederhana
Buat file contact.php:
Sebelum email benar-benar dikirim, validasi inputnya dulu. Jangan langsung percaya isi $_POST.
2. Opsi Pertama: Mengirim dengan mail()
Contoh paling dasar:
Kode di atas berguna untuk memahami alur dasar:
- ambil data dari form
- susun subject dan isi email
- kirim ke alamat tujuan
Tetapi ada keterbatasan besar:
- sulit debug kalau gagal
- tidak nyaman untuk email HTML
- bergantung penuh pada konfigurasi mail server
3. Opsi yang Direkomendasikan: PHPMailer + SMTP
Kalau kamu ingin hasil yang lebih konsisten, gunakan PHPMailer.
Install dulu package-nya:
Lalu buat file kirim-email.php:
Kenapa SMTP Lebih Baik?
Dengan SMTP, kamu berbicara langsung ke server pengirim email yang jelas. Keuntungannya:
- autentikasi lebih rapi
- error lebih mudah dibaca
- lebih mudah dipakai untuk email HTML
- cocok untuk notifikasi aplikasi yang benar-benar dipakai user
4. Menyimpan Konfigurasi Email dengan Lebih Aman
Jangan hardcode username dan password SMTP langsung di source code production.
Contoh sederhana:
Nanti setelah belajar file konfigurasi, kamu bisa pindahkan nilai ini ke .env. Ini jauh lebih aman daripada menulis password langsung di file PHP.
5. Mengirim Email HTML
Kalau kamu ingin email lebih rapi, PHPMailer mendukung HTML:
Tetap buat AltBody untuk jaga-jaga kalau client email penerima tidak mendukung HTML.
6. Kapan Pakai mail() dan Kapan Pakai PHPMailer?
Kalau project kamu sudah mulai dipakai orang lain, PHPMailer hampir selalu lebih aman dipilih.
Error Umum
mail() mengembalikan sukses, tapi inbox kosong
Biasanya bukan karena kode PHP salah, tetapi karena server belum bisa mengirim email keluar atau email masuk ke spam.
SMTP Error: Could not authenticate
Penyebab paling umum:
- username/password salah
- belum memakai app password
- provider email memblokir login biasa
Class "PHPMailer\PHPMailer\PHPMailer" not found
Biasanya package belum di-install atau vendor/autoload.php belum di-include.
Karakter aneh saat menampilkan email HTML
Pastikan encoding benar:
Pesan user tampil mentah di email HTML
Kalau isi form langsung dimasukkan ke HTML email tanpa htmlspecialchars(), user bisa menyisipkan HTML liar. Selalu escape data dari user.
Tips Praktis
- Validasi email dengan
filter_var(..., FILTER_VALIDATE_EMAIL). - Pakai
htmlspecialchars()saat menampilkan input user ke email HTML. - Simpan kredensial SMTP di konfigurasi, bukan di source code.
- Gunakan
try-catchsupaya error lebih mudah dibaca. - Untuk local development, pertimbangkan mail catcher seperti Mailpit agar tidak benar-benar mengirim email ke inbox asli.