Setiap aplikasi yang tumbuh pasti sampai pada momen “kita perlu mengirim email” — konfirmasi pendaftaran, reset password, atau struk pesanan. Sebelum Laravel bisa mengirim satu email pun, framework harus tahu tiga hal: transport apa yang dipakai (SMTP? layanan API? sekadar log?), kredensial apa yang boleh dipakai, dan alamat pengirim apa yang tampil di kotak masuk penerima. Semua jawaban itu hidup di dua tempat: berkas .env untuk nilai per lingkungan, dan config/mail.php untuk definisi mailer. Pada chapter ini kita bedah kedua berkas tersebut memakai proyek sandbox yang sudah berjalan, dan membuktikan bahwa mailer log — bawaan instalasi — justru sahabat terbaik kita selama masa pengembangan.
Mailer Default: log #
Buka berkas .env bawaan Laravel dan cari baris-baris berawalan MAIL_:
MAIL_MAILER=log
MAIL_SCHEME=null
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"Baris MAIL_MAILER=log menentukan bahwa setiap Mail::send() tidak akan menyentuh jaringan sama sekali. Laravel cukup menulis pesan mentah (header MIME plus isi) ke log aplikasi di storage/logs/laravel.log. Kita bisa “mengirim” ratusan email selama pengembangan tanpa takut email sungguhan terkirim ke orang lain — pesan tinggal dibaca di berkas log.
Nilai-nilai tersebut dibaca oleh config/mail.php lewat helper env(). Runner kecil berikut mem-bootstrap aplikasi lalu mencetak konfigurasi yang efektif setelah .env diproses:
use Illuminate\Support\Facades\Config;
echo 'default_mailer: ' . config('mail.default') . "\n";
echo 'from_address: ' . config('mail.from.address') . "\n";
echo 'from_name: ' . config('mail.from.name') . "\n";
echo 'mailers_terdaftar: ' . implode(', ', array_keys(config('mail.mailers'))) . "\n";
echo 'smtp_host: ' . config('mail.mailers.smtp.host')
. ' port: ' . config('mail.mailers.smtp.port') . "\n";Output yang Dihasilkan:
default_mailer: log
from_address: [email protected]
from_name: Laravel
mailers_terdaftar: smtp, ses, postmark, resend, sendmail, log, array, failover, roundrobin
smtp_host: 127.0.0.1 port: 2525Baris pertama membuktikan env('MAIL_MAILER') benar-benar sampai ke config('mail.default'). Baris mailers_terdaftar menunjukkan sembilan mailer yang sudah didefinisikan di config/mail.php — semuanya siap dipakai hanya dengan mengganti MAIL_MAILER.
Membaca config/mail.php #
Berkas config/mail.php terdiri dari tiga bagian utama. Bagian 'default' memilih mailer aktif:
'default' => env('MAIL_MAILER', 'log'),Perhatikan nilai cadangannya: jika MAIL_MAILER tidak ada di .env, Laravel tetap memilih log — bukan SMTP. Kebijakan ini aman secara default karena aplikasi baru tidak akan pernah mencoba membuka koneksi SMTP yang tidak ada.
Bagian kedua adalah array 'mailers' yang mendefinisikan tiap transport:
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'scheme' => env('MAIL_SCHEME'),
'url' => env('MAIL_URL'),
'host' => env('MAIL_HOST', '127.0.0.1'),
'port' => env('MAIL_PORT', 2525),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN',
parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)),
],
'log' => [
'transport' => 'log',
'channel' => env('MAIL_LOG_CHANNEL'),
],
'array' => [
'transport' => 'array',
],
// ... mailer lain: ses, postmark, resend, sendmail, failover, roundrobin
],Kunci dari tiap entri adalah 'transport' — nama driver yang dikenali mail manager Laravel. Entri smtp membaca semua nilai dari env() sehingga satu kode yang sama bisa jalan dengan kredensial berbeda di tiap lingkungan. Entri log punya opsi channel untuk mengarahkan email ke log channel tertentu, misalnya channel khusus mail agar email tidak tercampur dengan log aplikasi.
Kapan Memakai Mailer Mana #
| Mailer | Kegunaan | Perlu kredensial? |
|---|---|---|
log | Pengembangan lokal — email ditulis ke log | Tidak |
array | Pengujian ringan — pesan hanya hidup di memori | Tidak |
smtp | Server email apa pun (Gmail, Mailtrap, sendiri) | Ya |
ses, postmark, resend | Layanan API pihak ketiga | Ya |
sendmail | Delegasi ke binary sendmail di server | Tidak |
failover | Daftar mailer cadangan bila utama gagal | Bergantung isi |
Mailer failover layak diperhatikan: entri bawaannya berisi ['smtp', 'log'], artinya jika SMTP mati, email “jatuh” ke log alih-alih hilang — pola yang berguna untuk masa transisi produksi.
Konfigurasi SMTP dan Alamat From #
Saat tiba waktunya mengirim email sungguhan, kita cukup mengisi variabel SMTP di .env tanpa menyentuh config/mail.php sama sekali — contoh template untuk SMTP provider fiktif:
MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=smtp.tokomail.example
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=YOUR_SMTP_PASSWORD
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="Toko Latihan"Bagian ketiga config/mail.php mengatur alamat pengirim global:
'from' => [
'address' => env('MAIL_FROM_ADDRESS', '[email protected]'),
'name' => env('MAIL_FROM_NAME', env('APP_NAME', 'Laravel')),
],Konfigurasi ini dipakai setiap kali kita mengirim email tanpa menetapkan from secara eksplisit. Alamat MAIL_FROM_ADDRESS sebaiknya berasal dari domain yang sama dengan aplikasi agar lolos pemeriksaan SPF/DKIM milik penyedia email penerima — domain fiktif example.com di atas aman untuk latihan.
Ganti Mailer Saat Runtime #
Adakalanya satu request perlu mailer berbeda, misalnya email transaksional lewat SMTP tapi email laporan lewat Postmark. Helper Config::set() mengganti mailer default di tengah jalan:
Config::set('mail.default', 'array');
echo 'default_setelah_set: ' . config('mail.default') . "\n";Output yang Dihasilkan:
default_setelah_set: arrayUntuk penggantian per-kiriman, method Mail::mailer('nama') mengembalikan mailer spesifik tanpa mengubah konfigurasi global — kita akan pakai pola ini di chapter Mengirim Email
.
Dengan konfigurasi yang sudah dipahami, kita siap mengirim email pertama dan membuktikannya lewat isi berkas log. Daftar lengkap opsi transport bisa dirujuk di dokumentasi Mail Laravel .