Laravel tutorial: Mengirim notifikasi user menggunakan gmail

Salah satu fitur unggulan Laravel yang menjadi favorit saya adalah kemampuan bawaanya untuk mengirim email. Fitur ini bisa dikembangkan lebih lanjut untuk berbagai keperluan seperti mengirim link lupa password, notifikasi pembaruan sistem atau promosi produk.

Sebagai permulaan, mari kita belajar membuat fitur sederhana untuk mengirim pesan email sederhana untuk mengetahui konsep dasar nya. Hal pertama yang perlu disiapkan adalah 2 alamat email yang valid untuk kita melakukan uji coba. Pada kesempatan ini Saya menggunakan 2 alamat gmail yang masing-masing berperan sebagai sender dan receiver.

  1. Sender: myofficespot25@gmail.com
  2. Receiver: ahyasw@gmail.com

Persiapan

Jika Anda menggunakan provider gmail sebagai sender, jangan lewati step ini. Yang perlu diketahui, gmail menerapkan fitur keamanan yang cukup ketat sehingga ada beberapa konfigurasi yang perlu disesuaikan pada akun gmail Anda agar dapat kita terapkan sebagai mail server.

Aktifkan 2-step Verification

Login kedalam akun gmail yang akan Anda gunakan sebagai sender/pengirim. Selanjutnya pada menu profile, klik Manage your Google Account atau kunjungi tautan berikut ini.

Perhatikan pada daftar menu disebelah kiri. Klik pada opsi Security dan perhatikan 2-step Verification sudah diaktifkan. Untuk mengaktifkan menu ini Anda akan diminta memasukan nomor handphone. Ikuti langkah-langkah nya hingga muncul tnanda centang seperti pada gambar dibawah ini.

Buat App Passwords

App password ini merupakan semacam jalur khusus yang diperlukan agar aplikasi Laravel yang dibuat dapat berinteraksi dengan layanan gmail, sehingga memerlukan authentikasi tambahan agar dapat terhubung satu sama lain.

Anda dapat mengakses halaman ini melalui alamat berikut ini.

Setelah itu masukan nama aplikasi ang ingin dibuatkan password secara spesifik. Saya memakai nama “Tutorial mengirim email dengan Laravel”. Klik tombol Create untuk men-generate password, lalu akan muncul pop-up yang berisikan 16 karakter password. Jangan lupa untuk segera mencatat password tersebut karena pop-up hanya muncul satu kali saja. Password inilah yang nantinya akan dimasukan kedalam konfigurasi Laravel. Ingat,

Setelah tergenerate akan muncul 16 digit karakter password seperti berikut ini:

dehj sair jzxy depl

Pengembangan

Untuk pembuatan project email sender ini saya menggunakan Laravel versi 7.4. Cara instalasi selengkapnya bisa Anda baca pada artikel berikut.

Buat Routes

Buka file routes/web.php dan tambahkan kode dibawah ini:

Route::group(['middleware'=>'auth'], function(){
    Route::get('/email', 'SendingEmailController@index');
    Route::post('/email/send', 'SendingEmailController@send')->name('email.send');
});

Buat class Mailable

php artisan make:mail SendingEmailNotification

Perintah diatas akan membuat file baru pada direktori App\Mail\SendingEmailNotification.php Buka file tersebut kemudian tambahkan kode berikut ini:

<?php

namespace App\Mail;

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

class SendingEmailNotification extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public $details;
    
    public function __construct($details)
    {
        $this->details = $details; //variable yang dikirim dari controller
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        //masukan subject email yang diperlukan
        //email menggunakan template yang sudah kita buat
        return $this->subject('Testing mengirim email dengan Laravel')->view('email.template');
    }
}

Buat Template email

Template email ini bermanfaat agar tampilah email yang dikirim lebih menarik bagi pembaca sehingga tidak terkesan kaku dan monoton.

Buat file baru pada resources/views/email dan beri nama template.blade.php. Selanjutnya buka file tersebut dan tambahkan kode dibawah ini:

<!doctype html>
<html lang="en">
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Simple Transactional Email</title>
    <style media="all" type="text/css">
    /* -------------------------------------
    GLOBAL RESETS
------------------------------------- */
    
    body {
      font-family: Helvetica, sans-serif;
      -webkit-font-smoothing: antialiased;
      font-size: 16px;
      line-height: 1.3;
      -ms-text-size-adjust: 100%;
      -webkit-text-size-adjust: 100%;
    }
    
    table {
      border-collapse: separate;
      mso-table-lspace: 0pt;
      mso-table-rspace: 0pt;
      width: 100%;
    }
    
    table td {
      font-family: Helvetica, sans-serif;
      font-size: 16px;
      vertical-align: top;
    }
    /* -------------------------------------
    BODY & CONTAINER
------------------------------------- */
    
    body {
      background-color: #f4f5f6;
      margin: 0;
      padding: 0;
    }
    
    .body {
      background-color: #f4f5f6;
      width: 100%;
    }
    
    .container {
      margin: 0 auto !important;
      max-width: 600px;
      padding: 0;
      padding-top: 24px;
      width: 600px;
    }
    
    .content {
      box-sizing: border-box;
      display: block;
      margin: 0 auto;
      max-width: 600px;
      padding: 0;
    }
    /* -------------------------------------
    HEADER, FOOTER, MAIN
------------------------------------- */
    
    .main {
      background: #ffffff;
      border: 1px solid #eaebed;
      border-radius: 16px;
      width: 100%;
    }
    
    .wrapper {
      box-sizing: border-box;
      padding: 24px;
    }
    
    .footer {
      clear: both;
      padding-top: 24px;
      text-align: center;
      width: 100%;
    }
    
    .footer td,
    .footer p,
    .footer span,
    .footer a {
      color: #9a9ea6;
      font-size: 16px;
      text-align: center;
    }
    /* -------------------------------------
    TYPOGRAPHY
------------------------------------- */
    
    p {
      font-family: Helvetica, sans-serif;
      font-size: 16px;
      font-weight: normal;
      margin: 0;
      margin-bottom: 16px;
    }
    
    a {
      color: #0867ec;
      text-decoration: underline;
    }
    /* -------------------------------------
    BUTTONS
------------------------------------- */
    
    .btn {
      box-sizing: border-box;
      min-width: 100% !important;
      width: 100%;
    }
    
    .btn > tbody > tr > td {
      padding-bottom: 16px;
    }
    
    .btn table {
      width: auto;
    }
    
    .btn table td {
      background-color: #ffffff;
      border-radius: 4px;
      text-align: center;
    }
    
    .btn a {
      background-color: #ffffff;
      border: solid 2px #0867ec;
      border-radius: 4px;
      box-sizing: border-box;
      color: #0867ec;
      cursor: pointer;
      display: inline-block;
      font-size: 16px;
      font-weight: bold;
      margin: 0;
      padding: 12px 24px;
      text-decoration: none;
      text-transform: capitalize;
    }
    
    .btn-primary table td {
      background-color: #0867ec;
    }
    
    .btn-primary a {
      background-color: #0867ec;
      border-color: #0867ec;
      color: #ffffff;
    }
    
    @media all {
      .btn-primary table td:hover {
        background-color: #ec0867 !important;
      }
      .btn-primary a:hover {
        background-color: #ec0867 !important;
        border-color: #ec0867 !important;
      }
    }
    
    /* -------------------------------------
    OTHER STYLES THAT MIGHT BE USEFUL
------------------------------------- */
    
    .last {
      margin-bottom: 0;
    }
    
    .first {
      margin-top: 0;
    }
    
    .align-center {
      text-align: center;
    }
    
    .align-right {
      text-align: right;
    }
    
    .align-left {
      text-align: left;
    }
    
    .text-link {
      color: #0867ec !important;
      text-decoration: underline !important;
    }
    
    .clear {
      clear: both;
    }
    
    .mt0 {
      margin-top: 0;
    }
    
    .mb0 {
      margin-bottom: 0;
    }
    
    .preheader {
      color: transparent;
      display: none;
      height: 0;
      max-height: 0;
      max-width: 0;
      opacity: 0;
      overflow: hidden;
      mso-hide: all;
      visibility: hidden;
      width: 0;
    }
    
    .powered-by a {
      text-decoration: none;
    }
    
    /* -------------------------------------
    RESPONSIVE AND MOBILE FRIENDLY STYLES
------------------------------------- */
    
    @media only screen and (max-width: 640px) {
      .main p,
      .main td,
      .main span {
        font-size: 16px !important;
      }
      .wrapper {
        padding: 8px !important;
      }
      .content {
        padding: 0 !important;
      }
      .container {
        padding: 0 !important;
        padding-top: 8px !important;
        width: 100% !important;
      }
      .main {
        border-left-width: 0 !important;
        border-radius: 0 !important;
        border-right-width: 0 !important;
      }
      .btn table {
        max-width: 100% !important;
        width: 100% !important;
      }
      .btn a {
        font-size: 16px !important;
        max-width: 100% !important;
        width: 100% !important;
      }
    }
    /* -------------------------------------
    PRESERVE THESE STYLES IN THE HEAD
------------------------------------- */
    
    @media all {
      .ExternalClass {
        width: 100%;
      }
      .ExternalClass,
      .ExternalClass p,
      .ExternalClass span,
      .ExternalClass font,
      .ExternalClass td,
      .ExternalClass div {
        line-height: 100%;
      }
      .apple-link a {
        color: inherit !important;
        font-family: inherit !important;
        font-size: inherit !important;
        font-weight: inherit !important;
        line-height: inherit !important;
        text-decoration: none !important;
      }
      #MessageViewBody a {
        color: inherit;
        text-decoration: none;
        font-size: inherit;
        font-family: inherit;
        font-weight: inherit;
        line-height: inherit;
      }
    }
    </style>
  </head>
  <body>
    <table role="presentation" border="0" cellpadding="0" cellspacing="0" class="body">
      <tr>
        <td> </td>
        <td class="container">
          <div class="content">

            <!-- START CENTERED WHITE CONTAINER -->
            <span class="preheader">This is preheader text. Some clients will show this text as a preview.</span>
            <table role="presentation" border="0" cellpadding="0" cellspacing="0" class="main">

              <!-- START MAIN CONTENT AREA -->
              <tr>
                <td class="wrapper">
                    <h3>{{$details['title']}}</h3>
                    <p>{{$details['body']}}</p>
                    
                    <p>Good luck! Hope it works.</p>
                </td>
              </tr>

              <!-- END MAIN CONTENT AREA -->
              </table>

            <!-- START FOOTER -->
            <div class="footer">
              <table role="presentation" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td class="content-block">
                    <span class="apple-link">Ahyas Widyatmaka Company Inc, 7-11 Commercial Ct, Belfast BT1 2NB</span>.
                  </td>
                </tr>
                <tr>
                  <td class="content-block powered-by">
                    Powered by <a href="ahyasw.com">ahyasw.com</a>
                  </td>
                </tr>
              </table>
            </div>

            <!-- END FOOTER -->
            
        </div>
        </td>
        <td> </td>
      </tr>
    </table>
  </body>
</html>

Buat Controller

php artisan make:controller SendingEmailController

Setelah file controller berhasil dibuat dengan nama SendingEmailController.php, buka file tersebut dan tambahkan kode dibawah ini:

<?php

namespace App\Http\Controllers;

use App\Mail\SendingEmailNotification;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class SendingEmailController extends Controller
{
    public function index(){
        return view('email.index');
    }

    public function send(Request $request){
        $request->validate([
            'tujuan' => 'required|email',
            'message' => 'required'
        ],[
            'tujuan.required' => 'Tujuan tidak boleh kosong',
            'tujuan.email' => 'Alamat email tidak valid',
            'message.required' => 'Alamat email tidak valid',
        ]);

        $details = [
            'title' => 'Tutorial mengirim notifikasi email',
            'body' => $request->message
        ];

        Mail::to($request->tujuan)->send(new SendingEmailNotification($details));

        return redirect()->back()->with('success', 'Email berhasil dikirim');
    }
}

Uji coba

Buka halaman untuk mengirim email di <your_host>/email kemudian akan muncul tampilan seperti dibawah ini. Masukan tujuan alamat email(gmail) yang akan dikirim, selanjutnya masukan pesan yang diinginkan. Klik kirim dan pesan Anda akan dikirimkan ke email tujuan. Oh, iya pastikan saat mellakukan proses ini Anda terkoneksi dengan internet.

Masuk ke akun gmail Anda dan buka Inbox. Disana Anda akan menemukan email masuk yang baru saja dikirim.

Bagaimana, cukup mudah bukan membuatnya? Anda bisa mencobanya langsung melalui aplikasi demo dibawah ini:

DEMO

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *