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_:

dotenv
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:

php
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:

text
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: 2525

Baris 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:

php
'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:

php
'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 #

MailerKegunaanPerlu kredensial?
logPengembangan lokal — email ditulis ke logTidak
arrayPengujian ringan — pesan hanya hidup di memoriTidak
smtpServer email apa pun (Gmail, Mailtrap, sendiri)Ya
ses, postmark, resendLayanan API pihak ketigaYa
sendmailDelegasi ke binary sendmail di serverTidak
failoverDaftar mailer cadangan bila utama gagalBergantung 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:

dotenv
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:

php
'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:

php
Config::set('mail.default', 'array');
echo 'default_setelah_set: ' . config('mail.default') . "\n";

Output yang Dihasilkan:

text
default_setelah_set: array

Untuk 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 .