[Laravel] Queues를 이용한 Mail 보내기
Queue를 사용한 간단한 메일 보내기
간단한 메일 보내기에 대해 설명드립니다.
smpt가 없을 경우 구글 SMTP 설정법 을 참조 바랍니다.
개념은 controller에서 메일을 보낼때 직접 보내지 않고 queue(database)에 쌓아두면
백그라운드에서 실시간으로 database를 읽어 들여 메일을 보내는 방식입니다.
step1
\App\Jobs 에 job 클래서 생성
php artisan make:job JobEmail
- app/Jobs/JobEmail.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class JobEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{
}
public function handle()
{
}
}
step2
\App\Mail folder에 SendEmail 클래스 생성
php artisan make:mail SendEmail
- app/Mail/SendEmail.php
기본적인 형태는 아래와 같습니다.
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SendEmail extends Mailable
{
use Queueable, SerializesModels;
public function __construct()
{
}
public function build()
{
return $this->view('view.mail');
}
}
step3
메일을 보낼 컨트롤러에서의 세팅
..........
use App\Jobs\JobEmail;
class SendMailController {
$data = new \stdClass;
$data->mail_to = 'yourMailAddress';
$data->subject = 'This is Only Test Mail';
$data->message = 'Do not reply this mail';
dispatch(new JobEmail($data));
}
step4
JobEmail.php 를 아래와 같이 수정합니다.
- app/Jobs/JobEmail.php
..........
use App\Mail\SendEmail;
use Mail;
class JobEmail implements ShouldQueue
{
..........
protected $data;
public function __construct($data)
{
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Mail::to($this->data->mail_to)->send(new SendEmail($this->data));
}
}
step5
SendEmail.php 를 아래와 같이 수정합니다.
- app/Mail/SendEmail.php
..........
class SendEmail extends Mailable
{
..........
public $mailData;
public function __construct($mailData)
{
$this->mailData = $mailData;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('mail-form', ['mailData'=>$this->mailData]);
}
}
step6
mail-form.blade.php 생성
<!DOCTYPE html>
<html lang="en">
<head>
<title>Laravel sending email using queue</title>
</head>
<body>
<p>Hi There</p>
<p>{{$mailData->message}}</p>
<p>Thank you</p>
</body>
</html>
step7
Queue Worker 실행하기 관련내용 참조
nohup php artisan queue:listen >> storage/logs/laravel.log &