ユアスク by みんなシステムズ

MENU

知って得する!Laravelでリマインドメールを送ってみた

2023/07/06

こんにちは、後藤です。

いつの間にか7月を迎え、いつの間にか今年も半分が過ぎ・・・時間の流れの早さを感じます。

今回は、Laravelでリマインドメールを送る方法について説明します。そこでは「バッチ処理」を活用していきます。

そもそも、リマインドメールとは?

そんな方は、例としてホテルの予約をした時を思い返してみてください。

宿泊日の前日に、登録しているメールアドレスに前日を知らせるメールが届くことがありますよね?それです(前までは、ホテルの方が一人一人にメール送信していると思っていました・・・)

コマンドクラスを作成

まずはじめに、Artisanコマンドを使用して新しいコマンドクラスを作成します。この例では、SendRemindersという名前のコマンドを作成します。

php artisan make:command SendReminders

このコマンドにより、app/Console/CommandsディレクトリにSendReminders.phpという新しいクラスが作成されます。

コマンドの定義

次に、SendRemindersコマンドクラスを編集します。ここでは、コマンドのシグネチャ、説明、そしてhandleメソッドによる主な動作を定義します。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Batch;
use App\Jobs\SendReminderEmail;
use App\Models\User;

class SendReminders extends Command
{
    // ここの'reminder:send'がコマンドで使われる
    protected $signature = 'reminder:send';

    protected $description = 'Send reminder emails to all users';

    public function handle()
    {
        $users = User::all();

        $jobs = $users->map(function ($user) {
            return new SendReminderEmail($user);
        });

        $batch = Batch::dispatch(...$jobs);
        
        $this->info('Reminder emails have been dispatched!');
    }
}

ここでは、全ユーザーに対してリマインドメールを送信するジョブを作成し、それらをバッチ処理としてディスパッチしています。

メールの送信

SendReminderEmailジョブは、指定されたユーザーにリマインドメールを送信するためのものです。具体的なメールの送信処理は、Mailableクラスを使用して実装します。

php artisan make:mail ReminderEmail

以上のコマンドでapp/MailディレクトリにReminderEmailという新しいメールクラスが作成されます。

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ReminderEmail extends Mailable
{
    use Queueable, SerializesModels;

    public function build()
    {
        // メール文章のviewファイルを用意
        return $this->view('emails.reminder');
    }
}

これで、Artisanコマンドを用いて以下のようにリマインドメールのバッチ処理を起動することが可能になります。

php artisan reminder:send

スケジューリング

リマインドメールのバッチ処理を自動化するためには、Laravelのタスクスケジューラを使用します。スケジューラはCronジョブのように動作し、定義した時間や間隔でコマンドを実行することができます。

以下のようにapp/Console/Kernel.phpを編集すると、reminder:sendコマンドが毎日午前8時に実行されるように設定することができます。

protected function schedule(Schedule $schedule)
{
    $schedule->command('reminder:send')->dailyAt('8:00');
}

これにより、リマインドメールのバッチ処理は毎日自動的に実行されるようになります。

まとめ

以上が、Laravelでリマインドメールのバッチ処理を設定する方法です。知っておくと使う場面が多くて、とても便利です!バッチ処理を設定することにより、大量のメール送信やデータ処理を自動化し、時間を節約することができます。ぜひ、皆さんも活用してください!