Create Mail in Laravel 8

min read

Day 24 #100DaysOfCode

Hôm này mình đi tìm hiểu về cách tạo Mail trong Laravel 8, mình thấy rất rất là nhiều người dùng gửi Mail cho khách hàng, khi khách hàng đặt một sản phẩm trên website. Nên nay đi làm một ví dụ để sau này có gì xem lại

Đầu tiên cài đặt Laravel 8

composer create-project --prefer-dist laravel/laravel blog

Cấu hình tập tin .env

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=mail_of_you@gmail.com
MAIL_PASSWORD=password_of_you
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=mail_of_you@gmail.com
MAIL_FROM_NAME="${APP_NAME}"

Tạo một class Mail

php artisan make:mail OrderMail

Sau khi chạy lệnh trên ta sẽ được một class file App\Mail\OrderMail.php , ta hãy mở file đó lên và chỉnh sửa thông tin orders cần gửi cho khách hàng

<?php

namespace App\Mail;

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

class OrderEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    protected $order;
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
       // dd($this->order);
        //return $this->view('view.name');
        return $this->view('email.order-mail')->subject("Đơn Hàng Mới")->with(array("orders"=>$this->order));
    }
}

Bên trên mình cài đặt nhận đối tường $this->orders

 protected $order;
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

Sau đó để gửi mail ta sử dụng hàm build()

public function build()
    {
       // dd($this->order);
        //return $this->view('view.name');
        return $this->view('email.order-mail')->subject("Đơn Hàng Mới")->with(array("orders"=>$this->order));
    }

Bạn thấy trong hàm build() mình có return về View('email.order-mail'), chính vì thể ta hãy vào thư mục views/email , tạo file order-mail.blade.php, để hiển thị dữ liệu cần gửi mail cho khách hàng

<!DOCTYPE html>
<html>
<head>
    <title>hoanguyenit.com</title>
    <style>
        *{margin:0;padding:0}
       
        .dongdathang{
            width:100%;
            margin:0 auto;
            max-width:1000px;
        }
        .form{
            width:100%;
        }
        h3{color:red;width:100%;text-align:center;
        font-size:20px;padding:10px 0px;}
       
        strong{
            font-size:14px;
        }
        table#order {
             border-collapse: collapse;
             width:100%;
        }
        table#order tr td{
            padding:5px;
            text-align:center;
            box-sizing:border-box;
        }
        table.form-info tr td strong{
            padding-left:5px;
        }
    </style>
</head>
<body>
  <div class="dongdathang">
        <h3>ĐƠN ĐẶT HÀNG</h3>
        <div class="form">
               
                <table class="form-info">

                    <tr class="form-group">
                        <td><abel>Tên khách hàng:</label></td>
                        <td><strong>{{$orders->Name}}</strong></td>
                    </tr>
                    <tr class="form-group">
                       <td> <label>Ngày:</label></td>
                       <td> <strong>{{$orders->created_at}}</strong></td>
                    </tr>
                    <tr class="form-group">
                      <td>  <label>Số điện thoại: </label></td>
                       <td> <strong>{{$orders->Phone}}</strong></td>
                    </tr>
                    <tr class="form-group">
                       <td> <label>Mã đơn hàng:</label></td>
                       <td> <strong>{{$orders->id}}</strong></td>
                    </tr>
                    <tr class="form-group" style="width:100%">
                       <td> <label>Địa chỉ:</label></td>
                       <td> <strong> Quận 6, Tp.HCM</strong></td>
                    </tr>
                    

                </table>
                <div class="form-order">
                    <table border="1" id="order">
                        <tr>
                            <th>STT</th>
                            <th>Sản phẩm</th>
                            <th>Đơn vị</th>
                            <th>Số lượng</th>
                            <th>Đơn giá</th>
                            <th>Thành Tiền</th>
                        </tr>
                        @php 
                            $sumPrice = 0;
                        @endphp
                        @foreach($orders->products as $key=>$product)
                            @php
                                $sumPrice+=$product->pivot->TotalPrice;
                            @endphp
                            <tr>
                                <td>1</td>
                                <td>{{$product->Title}}</td>
                                <td>cái</td>
                                <td>{{$product->pivot->Quantity}}</td>
                                <td>{{number_format($product->pivot->Price)}} đ</td>
                                <td>{{number_format($product->pivot->TotalPrice)}} đ</td>
                            </tr>
                        @endforeach

                        <tr>
                            <td colspan="5">Tổng tiền:</td>
                            <td>{{number_format($sumPrice)}} đ</td>
                        </tr>

                    </table>
                </div>
                <table class="form-info">
                    <tr class="form-group" style="width:100%">
                       <td> <label>Ngày giao hàng:</label></td>
                        <td><strong>{{$orders->created_at}}</strong></td>
                    </tr>
                    <tr class="form-group" style="width:100%">
                       <td> <label>Địa điểm giao hàng:</label></td>
                       <td> <strong>Quận 6, Tp.HCM</strong></td>
                    </tr>
                </table>
                
        </div>
  </div>
</body>
</html>

Bên trên là code hiển thị dữ liệu trả về cho khách hàng biết, thông tin sản phẩm mua, giá tiền, tổng tiền

Ok giờ ta tạo hãy mở file Controller và thiết lập gọi hàm gửi mail thôi, ví dụ bạn cấu hình như dưới đây

use Illuminate\Support\Facades\Mail;
use App\Mail\OrderEmail; // including your class
public function store(Request $request){
	$orders = Order::findOrFail($request->id);
	//
	....
	///
	Mail::to('mail_of_you@gmail.com')->send(new OrderEmail($order));
	return 1;
}

Ok vậy là xong, bạn có thể gửi mail ok rồi đó, nếu bạn gửi mail bị lỗi thì hãy đăng nhập vào gmail, thiết lập password cho ứng dụng khác,  sau đó, cập nhật password đó trong file .env

Hãy vào link : https://myaccount.google.com/u/2/security ,

1. Thiếp lập mật khẩu ứng dụng

2. Chọn ứng dụng và thiết bị bạn muốn tạo mật khẩu ứng dụng -> chọn Khác(tùy chỉnh)->Nhập tên gì cũng được->sau đó bấm tạo

Create Mail in Laravel 8

3. Copy mật khẩu được sinh ra, copy nó, dáng vào file .env trong laravel

Create Mail in Laravel 8

Okay, vậy là xong, chúc các bạn thành công!