[Laravel] Queues를 이용한 Mail 보내기
Queue를 이용한 메일 보내기
간단한 메일 보내기에 대해 설명드립니다.
smpt가 없을 경우 구글 SMTP 설정법 을 참조 바랍니다.
개념은 controller에서 메일을 보낼때 직접 보내지 않고 queue(database)에 쌓아두면
백그라운드에서 실시간으로 database를 읽어 들여 메일을 보내는 방식입니다.
- 이장에 들어가기전에 아래 링크를 잠시 읽어봐 주시기 바랍니다.
- Job에 대한 기본 정보 이해하기
Queue를 이용하여 메일을 보내는 두가지 방식
- Mail::to()->queue() (추천)
- Job 파일로 보내기 (Job을 이해하기위해 어렵게(?) 코딩)
위의 두가지 방식에 대해 아래에 설명드릴 예정입니다.
다수사용자에게 보내거나 Mail에 대해 좀더 다양한 내용(notificatione 등)을 원하시면 메일 발송 을 참조 바랍니다.
1. Mailable 새성 (공통)
\App\Mail folder에 SendEmail 클래스 생성
php artisan make:mail SendEmail
- app/Mail/SendEmail.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 $params;
public function __construct($params)
{
$this->params = $params;
}
public function build()
{
return $this->view('view.mail');
}
}
2.1 메일발송 (queue 메소드를 사용하는 경우)
일반적으로 Queue 로 메일을 보낼 경우 아래처럼 queue() 를 사용하면 됩니다. 매우 쉽습니다.
..........
use App\Mail\SendEmail;
use Illuminate\Support\Facades\Mail;
class SendMailController {
$data = new \stdClass;
$data->email = 'yourMailAddress';
..........
Mail::to($data->email)->queue(new SendEmail($data)); // 여기서 프로그램 끝
}
2.2 메일발송 (Job 파일을 이용하는 경우)
Job 파일을 이용하는 방법은 비추천 입니다. 하지만 여기서는 이렇게도 사용가능하다는 것을 보여드리기위해, 혹은 다양한 경우에 대비해서 간단히 설명드립니다.
..........
use App\Jobs\JobEmail;
class SendMailController {
$data = new \stdClass;
$data->email = 'yourMailAddress';
..........
dispatch(new JobEmail($data)); // dispatch를 이용하여 JobEmail로 전송, App\Jobs\JobEmail 에 대해서는 아래에 계속 설명드리겠습니다.
}
3. Job생성(Job 파일을 이용하는 경우)
\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()
{
}
}
3-1. Job수정(Job 파일을 이용하는 경우)
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->email)->send(new SendEmail($this->data));
}
}
4. blade 파일 생성(공통)
mail.blade.php 생성
<!DOCTYPE html>
<html lang="en">
<head>
<title>Laravel sending email using queue</title>
</head>
<body>
<p>Hi There</p>
<p>{{$params->message}}</p>
<p>Thank you</p>
</body>
</html>