laravelmailnotifikasiMahir3 mnt baca

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:

bash
# .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

bash
php artisan make:mail PostPublished --markdown=emails.posts.published
php
// 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:

bash
php artisan make:notification KomentarBaru
php
// 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 ShouldQueue di Mailable atau Notification supaya dikirim lewat queue di background. Detailnya ada di modul Queue dan Job.