#20 Laravel基礎

Mailableでメールを送信する

メール送信の準備

Laravelでは Mailable? メール送信の内容とロジックをクラスにまとめる仕組み。`php artisan make:mail`で生成し、`Mail::to()->send()`で送信する。 クラスにメールの内容とロジックをまとめて送信できます。

まず .env でメールの設定を確認します。開発中は Mailtrap(受信テスト用サービス)が便利です。

# 📁 .env(開発環境)

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_mailtrap_username
MAIL_PASSWORD=your_mailtrap_password
MAIL_FROM_ADDRESS="noreply@example.com"
MAIL_FROM_NAME="${APP_NAME}"

Mailable クラスを生成する

php artisan make:mail WelcomeMail

app/Mail/WelcomeMail.php が生成されます。

<?php
// 📁 app/Mail/WelcomeMail.php

namespace App\Mail;

use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class WelcomeMail extends Mailable
{
    use Queueable, SerializesModels;

    // コンストラクターでデータを受け取る
    public function __construct(
        public User $user  // ← public にするとビューから自動でアクセスできる
    ) {}

    // メールの件名・送信元などを設定
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: 'ご登録ありがとうございます',
        );
    }

    // メール本文のビューを指定
    public function content(): Content
    {
        return new Content(
            view: 'emails.welcome',  // ← resources/views/emails/welcome.blade.php
        );
    }
}

メール本文のビューを作る

mkdir -p resources/views/emails
{{-- 📁 resources/views/emails/welcome.blade.php --}}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <h1>{{ $user->name }} さん、ご登録ありがとうございます!</h1>

    <p>アカウントが正常に作成されました。</p>

    <p>
        <a href="{{ route('dashboard') }}">ダッシュボードへ</a>
    </p>

    <p>
        ご不明な点がございましたら、<a href="mailto:support@example.com">サポート</a>までご連絡ください。
    </p>
</body>
</html>

メールを送信する

// 📁 app/Http/Controllers/Auth/RegisteredUserController.php

use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

public function store(Request $request)
{
    // ユーザー登録処理
    $user = User::create([
        'name'     => $request->name,
        'email'    => $request->email,
        'password' => bcrypt($request->password),
    ]);

    // ウェルカムメールを送信
    Mail::to($user->email)->send(new WelcomeMail($user));

    return redirect()->route('dashboard');
}

CC・BCC・複数宛先

Mail::to($user)
    ->cc($manager)
    ->bcc('log@example.com')
    ->send(new WelcomeMail($user));

// 複数宛先
Mail::to([$user1, $user2])->send(new WelcomeMail($user1));

添付ファイル

// 📁 app/Mail/InvoiceMail.php

use Illuminate\Mail\Mailables\Attachment;

public function attachments(): array
{
    return [
        Attachment::fromPath(storage_path('app/invoices/invoice-001.pdf'))
                  ->as('請求書.pdf')
                  ->withMime('application/pdf'),
    ];
}

ローカルでのメールテスト(log ドライバー)

本番のメールサーバーを使わず、ログファイルにメール内容を書き出す方法です。

# 📁 .env

MAIL_MAILER=log

storage/logs/laravel.log にメールの内容が出力されます。


まとめ

  • php artisan make:mail で Mailable クラスを生成する
  • envelope() で件名、content() でビューを指定する
  • コンストラクターの public プロパティはビューから $user のようにアクセスできる
  • Mail::to()->send() でメールを送信する
  • 開発中は MAIL_MAILER=log でログ出力できる

次回はキューを使ってメール送信を非同期化する方法を学びます。