Gửi mail liên hệ trong Laravel

Gửi mail liên hệ trong Laravel hướng dẫn tạo chức năng liên hệ admin dành cho khách hàng. Bao gồm tạo form, tạo mailable, tạo app pass…


Mục lục


Cấu hình hộp thư gửi mail – Tạo app password

Đăng nhập vào hộp thư gmail mà bạn dự định dùng nó để gửi mail. Vào rồi thì nhắp Quản lý tài khoản Google của bạn (Manage your Google Account ), kế tiếp nhắp Bảo mật (Security), và nhắp vào Mật khẩu ứng dụng (App Password)

Nhập tên ứng dụng rồi nhắp nút Generate

Copy password của ứng dụng để dùng

Cấu hình thông số để gửi mail trong Laravel

Mở file .env và nhập các thông số sau:

  • MAIL_HOST : Địa chỉ server gửi thư , với hộp thư gmail thì là smtp.gmail.com
  • MAIL_PORT : Số hiệu port hoạt động của server gửi thư , với gmail dùng mã hóa ssl thì port là 465
  • MAIL_USERNAME: Username của hộp thư gửi mail, nhập địa chỉ hộp thư của bạn vừa cấu hình ở bước trên
  • MAIL_PASSWORD: Mật khẩu ứng dụng bạn đã tạo ở trên
  • MAIL_ENCRYPTION: Cách mã hóa mail, bạn nhập ssl (nếu dùng tsl thì port ở trên dùng 587 chứ không phải 465)
  • MAIL_FROM_ADDRESS: Địa chỉ from trong mail gửi đi
  • MAIL_FROM_NAME: tên người gửi trong hộp thư gửi đi

Tạo view form liên hệ

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" >
<form class="col-10 mx-auto p-3 border border-primary" method="post" action="/guilienhe">
<h4>LIÊN HỆ</h4> 
<div class="mb-3">
    <label>Họ tên</label> <input class="form-control" name="ht" required>
</div>
<div class="mb-3">
    <label>Email</label> <input class="form-control" name="em" type="email" required>
</div>
<div class="mb-3">
    <label>Nội dung</label> <textarea class="col-md-9 form-control" name="nd"></textarea>
</div>
<div class="mb-3"> @csrf
    <button type="submit" class="btn btn-warning p-2" >Gửi liên hệ</button>
</div>
</form> 

Routing hiện view form liên hệ

– Mở routes/web.php và code

Route::get("/lienhe", function(){ return view('lienhe'); });

– Test: nhập địa chỉ http://localhost:8000/lienhe phải hiện ra form liên hệ như hình

Tạo mailable class

Mailable class dùng để khai báo thông số cho mail sắp gửi.  Ví dụ bên dưới: khai báo view chứa nội dung thư  (viewMailLienHe) , tiêu đề thư (‘Mail liên hệ từ khách hàng ‘), khai báo các biến cần dùng trong view ($hoten, khách hàng, $email khách hàng, $noidung liên hệ của khách ) .  Mỗi file Mailable được lưu trong folder app/Mail

Tạo mailable class

Chạy lệnh sau trong folder project: 

php artisan make:mail GuiEmail

Cấu hình mailable class

Mở file mailable mới tạo : app/Mail/GuiMail.php và cấu hình thông số tiêu đề thư, view chứa nội dung thư và các biến bạn dự định dùng trong mailable class. Như trong code dưới dưới, khi ai dùng mailable class này phải truyền 3 giá trị cho $ht, $em, $nd

<?php //app/Mail/Guimail.php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class GuiEmail extends Mailable {
    use Queueable, SerializesModels;
    public $hoten="";
    public $email=""; 
    public $noidung=""; 
    public function __construct( $ht, $em, $nd ){
        $this->hoten = $ht;
        $this->email = $em;
        $this->noidung = $nd;
    }
    public function envelope() {
        return new Envelope(subject: 'Mail liên hệ từ khách hàng',);
    }
    public function content() { 
       return new Content( view: 'viewMailLienHe',);
    }
    public function attachments() { return []; }
}

Tạo file views/viewMailLienHe.blade.php và code

Chào Admin! Có người một khách hàng liên hệ từ website nè: <hr>
<p>Họ tên khách hàng {{$hoten}}</p>
<p>Nội dung khách liên hệ : <br>
{!! nl2br($noidung)!!}
<p>

Routing và thực hiện gửi mail

Khai báo routting để nhận dữ liệu do form gửi lên + nhận dữ liệu trong form, gọi hàm send để gửi thư cho admin + đưa cho hàm send thông số mail trong mailable GuiMail + chuyển đến trang thông báo

use App\Mail\GuiEmail;
Route::post("/guilienhe", function(Illuminate\Http\Request $request){
$arr = request()->post();
$ht = trim(strip_tags( $arr['ht'] ));
$em = trim(strip_tags( $arr['em'] ));
$nd = trim(strip_tags( $arr['nd'] ));
$adminEmail = 'địachỉAdmin@gmail.com'; //Gửi thư đến ban quản trị
Mail::mailer('smtp')->to( $adminEmail )
->send( new GuiEmail($ht, $em, $nd) );
$request->session()->flash('thongbao', "Đã gửi mail");
return redirect("thongbao");
});

Định nghĩa route thông báo

Route::get("/thongbao", function(Illuminate\Http\Request $request){ 
$tb = $request->session()->get('thongbao');
return view('thongbao',['thongbao'=> $tb]);
});

Tạo file views\thongbao.blade.php

<!-- views/thongbao.blade.php -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" >
<div class="alert alert-info p-3 h2 text-center">
{{$thongbao}}
</div>

Test: Vào địa chỉ http://localhost:8000/lienhe rồi nhập thông tin vào form

Nhắp nút Gửi liên hệ sẽ nhận được mail (nếu mọi chuyện ngon lành).

Còn nếu thấy lỗi gửi thư không được, có thể do nhiều nguyên nhân sau:

– Nếu gửi mail không được do gửi từ localhost thì mở file config/mail.php và cấu hình bổ sung như sau trong mục smtp sẽ gửi được

'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],

Nếu vẫn còn lỗi nữa thì thay code trên bằng code ngắn gọn như sau:

'verify_peer' => false,

– Còn nếu gặp lỗi như bên dưới thì phần nhiều do chương trình antivirus chặn port, tạm tắt antivirus là xong

– Bạn cũng cần kiểm tra lại các thông số mail đã cấu hình xem có thật chính xác không nhé

Việc gửi mail liên hệ trong Laravel không khó, nhưng bạn có thể gặp nhiều sự cố, làm cẩn thận nhé, tạo app pass cho đúng, rồi nhập app pass cho đúng, các thông số mail cũng phải nhập cho chính xác thì mới thành công.

Trường hợp muốn nhúng form liên hệ vào layout của bạn thì thêm lệnh @extends ở đầu view form liên hệ là xong thôi.