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:
Inbox adalah dimana emel2 yang diterima mailtrap disimpan. Dari page ‘My Inboxes’ ini, klik ‘Demo Inbox’.
Daripada sini pilih laravel pada drop-down Integration untuk mendapatkan konfigurasi bagi Laravel
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.