[Laravel] Queues를 이용한 Mail 보내기

[Laravel] Queues를 이용한 Mail 보내기 updated_at: 2024-06-25 11:45

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 &
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1