【中級者向け】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_CONNECTION
をdatabase
にすると、jobs
テーブルにジョブが蓄積- Redis を使う場合は、
.env
にREDIS_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. まとめ・チェックリスト
.env
で Mail/Queue ドライバを適切に設定- Mailable クラス+Markdown テンプレートでメールレイアウトを設計
- ジョブクラス
ShouldQueue
で非同期処理を実装 - Horizon/Supervisor でワーカーを安定稼働・監視
- メール本文は ALT 属性・プレーンテキスト・言語属性・コントラスト比を確認
これで、ユーザー体験を損なわない高速かつアクセシブルなメール通知基盤が完成です♡
ぜひプロジェクトに取り入れて、より使いやすいサービスを目指しましょう!