[Laravel] Queues를 이용한 Mail 보내기 updated_at: 2024-12-14 03:26

Queue를 이용한 메일 보내기

간단한 메일 보내기에 대해 설명드립니다.
smpt가 없을 경우 구글 SMTP 설정법 을 참조 바랍니다.

개념은 controller에서 메일을 보낼때 직접 보내지 않고 queue(database)에 쌓아두면
백그라운드에서 실시간으로 database를 읽어 들여 메일을 보내는 방식입니다.

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>

5. Queue Worker 실행하기

관련내용 참조

평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글