Menghantar Emel Menggunakan Laravel

June 13, 2019

laravel 5.8

Persediaan

Apa yang kita perlu buat, buka cmd/terminal dan gunakan composer untuk install guzzle (ini library API kita gunakan untuk bercakap dengan mailtrap).

composer require guzzlehttp/guzzle

Sementara menunggu library didownload dan diinstall pada app kita…

Untuk memudahkan test dan tidak terhantar email kepada pengguna, kita gunakan servis mailtrap.io yang percuma. Mailtrap akan menjadi server email sementara development. Ia tidak akan menghantar emel tetapi memerangkap emel2 yang dihantar dan memaparkannya dalam inboxnya. Jadi kita 1) tidak perlu risau terhantar kepada bos notifikasi cubaan dari sistem dan 2) dapat melihat bagaimana rupa email yang dihantar.

Untuk mendapatkan konfigurasi email untuk digunakan bersama mailtrap, mereka menyediakan konfigurasi untuk kita kopipes.

Selepas register dan login ke dalam mailtrap, kita akan lihat page dibawah:

selepas register dan login

Inbox adalah dimana emel2 yang diterima mailtrap disimpan. Dari page ‘My Inboxes’ ini, klik ‘Demo Inbox’.

mailtrap inbox

Daripada sini pilih laravel pada drop-down Integration untuk mendapatkan konfigurasi bagi Laravel

mailtrap integration configuration

Copy part yang ditanda pada gambar atas dan paste ke dalam .env file pada bahagian MAIL_*

Sebagai langkah berjaga-jaga, run command bawah ini

php artisan config:clear

Sekarang ini app Laravel sudah bersedia untuk menghantar emel.

Mengarang Emel

Sepertimana terdapat Class Controller dan Model, untuk emel ada jenis Class khas iaitu jenis Mailable. Untuk satu2 email kita buatkan satu class yang inherit daripada Mailable ini. Cara paling mudah ialah dengan menggunakan artisan.

php artisan make:mail LaporanDijana

Disini artisan menjanakan file app/Mail/LaporanDijana.php yang mengandungi kod berikit:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class LaporanDijana extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.laporandijana'); // <-- selalu jumpa ni kan?
    }
}

Jika dilihat pada function build(), kita akan melihat satu yang biasa dijumpai dalam mana2 Controller yang dikod sebelum ini. build() memanggil view yang akan digunakan sebagai kandungan mesej emel.

Buatkan satu file view untuk kandungan emel di resources/views/emails/ dan namakan file itu laporandijana.blade.php

//kandungan file resources/views/emails/laporandijana.blade.php
hello world!

Buka kembali kandungan app/Mail/LaporanDijana.php dan update

Menghantar Emel

Sebagai contoh, email akan dihantar apabila satu laporan baru dijana. Controller yang akan digunakan ialah LaporanController.php pada function store(). Disini dianggap ada pengguna yang login, jadi $request->user() akan mendapatkan maklumat pengguna tersebut. Dari sini email pengguna akan digunakan.

// file app/Http/Controllers/LaporanController.php
use App\Mail\LaporanDijana;
use Illuminate\Support\Facades\Mail;

class LaporanController extends Controller

 public function store(Request $request)
{
    // jana laporan

    // hantar email
    Mail::to($request->user())->send(new LaporanDijana());

}

Apa bila function ini di-run, email akan dihantar dan jika tiada masalah, emel itu akan muncul pada inbox mailtrap.

Memasukkan maklumat tambahan kedalam emel

Langkah2 di atas akan menjanakan wording emel sama. Tentu dapat diagak kita hanya perlu memasukkan maklumat lain kepada view emel tersebut seperti kita biasa lakukan pada controller untuk memaparkan maklumat.

Katakan kita hendak memasukkan nama laporan yang dijana kedalam emel tadi. Buka file app/Mail/LaporanDijana.php dan tukarkan menjadi seperti berikut:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class LaporanDijana extends Mailable
{
    use Queueable, SerializesModels;

    //jadikan laporan dan user property class
    public $laporan;
    public $user;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($laporan, $user)
    {
        //set property pada constructor class 
        $this->laporan = $laporan;
        $this->user = $user;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.laporandijana', compact([
                                                    'laporan' => $this->laporan,
                                                    'user' => $this->user
                                                    ]
                                                    )); 
    }
}

Untuk file controller pula disuaikan dengan perubahan pada file app/Mail/LaporanDijana.php :

// file app/Http/Controllers/LaporanController.php
use App\Mail\LaporanDijana;
use Illuminate\Support\Facades\Mail;

class LaporanController extends Controller

 public function store(Request $request)
{
    // kononnya dapatkan laporan dijana
    $laporan = Laporan::first();

    // hantar email
    Mail::to($request->user())->send(new LaporanDijana($laporan, $request->user()));

}

Pada file resources/views/emails/laporandijana.blade.php pula, kita letakkan maklumat yang akan dihantar kepada penerima

Hello, {{ $user->username }}

<p>Laporan yang anda minta ( {{ $laporan->name }} )  telah siap dijanakan. </p>

Apabila laporan dijana dan LaporanController::store() dijalankan, emel akan dihantar dan kita akan dapat melihatnya dalam mailtrap.io

Sekian.

comments powered by Disqus