🐞📧Solving smtp email dan Internal server error notifikasi Midtrans (Mengubah kiriman email menjadi queue/antrian jobs di Laravel)

1. Persiapan Database (Tabel Antrean)

Sebelum mengaktifkan sistem, pastikan tabel database untuk menampung antrean sudah tersedia.

  • Tujuan: Laravel membutuhkan tabel fisik untuk menyimpan data email yang sedang menunggu giliran kirim.

  • Langkah Verifikasi: Pastikan tabel jobs dan failed_jobs sudah ada di database Anda melalui phpMyAdmin.

  • Perintah Pembuatan: Jika belum ada, jalankan:

  • Catatan: Jobs baru akan masuk ke tabel jobs, dan jika berhasil maka data jobs akan terhapus. Namun jika jobs gagal akan masuk ke table failed_jobs.

    Bash

    php artisan queue:table
    php artisan queue:failed-table
    php artisan migrate
    

2. Konfigurasi Environment (.env) / Mengubah dari config Mailgun ke Smtp hosting

Path: /.env Mengatur koneksi dari Mailgun (API) ke SMTP Hosting (Niagahoster) dengan pengaturan keamanan yang ketat.

  • QUEUE_CONNECTION=database: Mengaktifkan sistem antrean berbasis database.

  • MAIL_HOST=srv143.niagahoster.com: Menggunakan hostname asli server untuk menghindari masalah SSL dan DNS.

  • MAIL_PORT=465 & MAIL_ENCRYPTION=ssl: Standar keamanan untuk pengiriman email hosting.

  • MAIL_FROM_ADDRESS=mail@wotbatu.id: Harus identik dengan MAIL_USERNAME untuk menghindari error spoofing.

3. Perubahan Kode Pengiriman (MidtransController / Payment notification)

Path: /app/Http/Controllers/MidtransController.php (atau Controller yang menangani notifikasi Midtrans) Mengubah cara pengiriman agar tidak membebani performa saat transaksi berlangsung.

  • Perubahan: Mengubah Mail::to(...)->send(...) menjadi Mail::to(...)->queue(...).

  • Hasil: Respon sukses (200 OK) langsung dikirim ke Midtrans, sementara email dikirim di latar belakang.

4. Optimasi Lampiran PDF (Mailable)

Path: /app/Mail/TicketOrderMail.php Menghindari error permission pada sistem antrean saat memproses file fisik.

  • Perubahan: Menghapus kode file_put_contents yang menulis file ke folder publik.

  • Solusi: Menggunakan metode attachData() untuk mengirim PDF langsung dari memori server (RAM).

    PHP

    return $this->view('emails.ticket_order')
                ->attachData($dompdf->output(), 'Ticket.pdf', ['mime' => 'application/pdf']);
    

5. Prosedur Maintenance (Terminal)

Langkah-langkah teknis wajib setiap kali ada perubahan konfigurasi agar sistem mengenali data terbaru:

  1. Stop Worker: Matikan proses php artisan queue:work yang sedang jalan (Ctrl + C).

  2. Clear Config: Jalankan php artisan config:clear untuk memuat ulang .env.

  3. Clear Cache: Jalankan php artisan cache:clear untuk membersihkan sisa data lama.

  4. Start Worker: Jalankan kembali php artisan queue:work.

  5. Retry Jobs: Jalankan php artisan queue:retry all untuk mengirim ulang email yang sebelumnya gagal masuk ke failed_jobs.

6. Verifikasi Akhir

Sistem dinyatakan pulih jika terminal menunjukkan status hijau: Processed: App\Mail\TicketOrderMail.