php elephant sticker
Photo by RealToughCandy.com on Pexels.com

【中級者向け】Laravelでメール送信&ジョブキューを活用した非同期処理完全ガイド

この記事で学べること

  • Mailableクラスによるメールテンプレートの作成手順
  • Mailドライバ&キュードライバ設定方法
  • ジョブクラスでメール送信を非同期化する実装例
  • Laravel Horizon/Supervisor を用いたキュー管理
  • メールコンテンツのアクセシビリティ最適化ポイント

想定読者

  • メール通知を実装したい中級Laravelエンジニア
  • 非同期処理でレスポンス速度を向上させたい方
  • 運用フェーズでキューの可視化・安定稼働を目指すプロジェクトリーダー

アクセシビリティレベル:★★★☆☆

メール本文の代替テキスト、プレーンテキスト版、コントラスト・言語属性の考慮を解説


1. はじめに:なぜメール&キューを活用するのか

ユーザー登録やパスワードリセットなどのメール通知は、
同期的に処理するとユーザー体験を損ねる原因になります。
Laravel のジョブキュー機能と組み合わせることで、
メール送信をバックグラウンド化し、即時レスポンスを実現できます♡

  • 高速化:HTTP リクエストを素早く返却
  • 信頼性:再試行機能で一時的な障害にも強い
  • スケーラビリティ:複数ワーカーで負荷分散可能

2. 環境準備:Mailドライバ & キュードライバの設定

まずは .env に必要なドライバ設定を追加します。

# メールドライバ(SMTP/Mailgun/SESなど)
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=no-reply@example.com
MAIL_FROM_NAME="YourApp"

# キュードライバ(database/redis/sqsなど)
QUEUE_CONNECTION=database
# database キュー用テーブルの生成
php artisan queue:table
php artisan migrate
  • QUEUE_CONNECTIONdatabase にすると、jobs テーブルにジョブが蓄積
  • Redis を使う場合は、.envREDIS_HOST 等を設定して QUEUE_CONNECTION=redis

3. Mailable とビューの作成:メールテンプレート設計

3.1 Mailableクラスの生成

php artisan make:mail WelcomeMail --markdown=emails.welcome
// app/Mail/WelcomeMail.php
namespace App\Mail;

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

class WelcomeMail extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->subject('ようこそ!')
                    ->markdown('emails.welcome');
    }
}

3.2 Markdownビューの編集

{{-- resources/views/emails/welcome.blade.php --}}
@component('mail::message')
# {{ $user->name }} 様

ご登録ありがとうございます!  
以下のリンクからプロフィールを設定してください。

@component('mail::button', ['url' => url('/profile')])
プロフィール設定
@endcomponent

よろしくお願いいたします。  
{{ config('app.name') }}
@endcomponent
  • @component('mail::message') でレスポンシブデザインのメールレイアウトを自動生成
  • ALT属性付きの画像やプレーンテキスト版(->text('emails.welcome_plain'))も用意

4. 非同期化:ジョブクラスでメールディスパッチ

4.1 ジョブクラスの作成

php artisan make:job SendWelcomeEmail
// app/Jobs/SendWelcomeEmail.php
namespace App\Jobs;

use App\Mail\WelcomeMail;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable, SerializesModels;

    protected $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function handle()
    {
        Mail::to($this->user->email)
            ->send(new WelcomeMail($this->user));
    }
}

4.2 コントローラからディスパッチ

// app/Http/Controllers/Auth/RegisterController.php
use App\Jobs\SendWelcomeEmail;

protected function registered(Request $request, $user)
{
    // 同期メールをコメントアウトしてジョブをディスパッチ
    // Mail::to($user->email)->send(new WelcomeMail($user));
    SendWelcomeEmail::dispatch($user)->delay(now()->addSeconds(10));
}
  • ShouldQueue 実装で自動的にキューに投入
  • delay() で送信タイミングを調整可能

5. キュー管理:Laravel Horizon と Supervisor の導入

5.1 Laravel Horizon でモニタリング

composer require laravel/horizon
php artisan horizon:install
php artisan migrate
  • ダッシュボードでジョブステータス・処理時間を可視化
  • Redis キュードライバ専用

5.2 Supervisor で永続ワーカー起動

# /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=2
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log
supervisorctl reread
supervisorctl update
supervisorctl start laravel-worker:*
  • 自動再起動&複数プロセスで高可用性を確保

6. メールコンテンツのアクセシビリティ最適化

  • 代替テキスト:画像やボタンに必ず alt 属性を設定
  • プレーンテキスト版:HTMLメールと同梱し、スクリーンリーダーで読み上げ
  • 言語属性<html lang="ja"> を明示して読み上げ精度を向上
  • コントラスト比:メールボタンの背景色と文字色の比率を WCAG 2.1 AA 以上に

7. まとめ・チェックリスト

  1. .env で Mail/Queue ドライバを適切に設定
  2. Mailable クラス+Markdown テンプレートでメールレイアウトを設計
  3. ジョブクラス ShouldQueue で非同期処理を実装
  4. Horizon/Supervisor でワーカーを安定稼働・監視
  5. メール本文は ALT 属性・プレーンテキスト・言語属性・コントラスト比を確認

これで、ユーザー体験を損なわない高速かつアクセシブルなメール通知基盤が完成です♡
ぜひプロジェクトに取り入れて、より使いやすいサービスを目指しましょう!

投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)