Mail dan Notification
Kirim email dengan Mailable dan notifikasi multi-channel (mail, database) yang rapi.
Setup driver mail
Untuk development, pakai driver log supaya email ditulis ke storage/logs/laravel.log tanpa benar-benar terkirim:
# .env
MAIL_MAILER=log
MAIL_FROM_ADDRESS="[email protected]"
MAIL_FROM_NAME="Blogku"Untuk production pakai smtp (Mailtrap, Mailgun, atau SMTP hosting). Untuk testing tampilan, Mailtrap atau Mailhog sangat membantu.
Mailable: email terstruktur
php artisan make:mail PostPublished --markdown=emails.posts.published// app/Mail/PostPublished.php
namespace App\Mail;
use App\Models\Post;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class PostPublished extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public Post $post) {}
public function build(): static
{
return $this->subject('Postingan barumu terbit!')
->markdown('emails.posts.published');
}
}
// Kirim
use Illuminate\Support\Facades\Mail;
Mail::to($user->email)->send(new PostPublished($post));Template markdown-nya memakai component Blade siap pakai (x-mail::button, x-mail::panel).
Notification: multi-channel
Kalau pesan perlu dikirim ke banyak channel (email + notifikasi database untuk lonceng di navbar), pakai Notification:
php artisan make:notification KomentarBaru// app/Notifications/KomentarBaru.php
public function via(object $notifiable): array
{
return ['mail', 'database'];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject('Komentar baru di postinganmu')
->line('Ada yang berkomentar di postinganmu.')
->action('Lihat Komentar', url('/posts/'.$this->post->id));
}
public function toArray(object $notifiable): array
{
return ['post_id' => $this->post->id, 'pesan' => 'Komentar baru masuk'];
}
// Kirim ke user
$user->notify(new KomentarBaru($post));
// Baca notifikasi database
$user->unreadNotifications; // collection
$notif->markAsRead();Catatan teknis: Pengiriman email itu lambat (bisa 1-3 detik per email). Di dalam request HTTP, kirim email secara sinkron bikin user menunggu loading. Solusinya: implementasikan
ShouldQueuedi Mailable atau Notification supaya dikirim lewat queue di background. Detailnya ada di modul Queue dan Job.