【Laravel】メール送信機能の実装方法|Mailableクラスとテンプレートでの実装例

【Laravel】メール送信機能の実装方法|Mailableクラスとテンプレートでの実装例 Laravel

Laravelには、メール送信機能が標準で組み込まれており、簡潔で柔軟にメール送信処理を実装できます。この記事では、Mailableクラスの使い方や、Bladeテンプレートを使ったHTMLメールの実装方法、そして基本的な設定方法までをわかりやすく解説します。

メール送信機能の準備

まずは、メール送信に必要な設定を.envファイルに記述します。ここでは、Gmailを例にします。

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your_gmail_address@gmail.com
MAIL_PASSWORD=your_gmail_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_gmail_address@gmail.com
MAIL_FROM_NAME="Laravel App"

GmailのSMTPを使用する場合、アプリパスワードや2段階認証の設定も必要になることがあります。

Mailableクラスの作成

Laravelでは、Mailableクラスを使ってメールの構成を定義できます。以下のコマンドでMailableクラスを作成します。

php artisan make:mail ContactMail

作成されたapp/Mail/ContactMail.phpに、件名やビューを定義します。

namespace App\Mail;

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

class ContactMail extends Mailable
{
    use Queueable, SerializesModels;

    public $data;

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

    public function build()
    {
        return $this->subject('お問い合わせ内容の確認')
                    ->view('emails.contact');
    }
}

メールテンプレートの作成

resources/views/emails/contact.blade.php にテンプレートを作成します。

<h2>お問い合わせ内容</h2>
<p>お名前:{{ $data['name'] }}</p>
<p>メールアドレス:{{ $data['email'] }}</p>
<p>メッセージ:{{ $data['message'] }}</p>

メール送信処理の実装

コントローラやサービスクラスから以下のように呼び出して送信します。

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

public function sendContact(Request $request)
{
    $data = $request->only(['name', 'email', 'message']);

    Mail::to('admin@example.com')->send(new ContactMail($data));

    return redirect()->back()->with('status', 'メールを送信しました。');
}

Mail::to()で宛先を指定し、send()にMailableインスタンスを渡すだけで送信できます。

キューを使って非同期で送信する

メール送信に時間がかかる場合は、キューを使ってバックグラウンドで処理することも可能です。

Mail::to('admin@example.com')->queue(new ContactMail($data));

queue()を使えば、キューを通じて非同期で処理され、ユーザーの待ち時間を軽減できます。
※ キューの設定が別途必要です。

HTMLとプレーンテキストを両方送信する

build()メソッドでview()text()を併用することで、HTMLとテキストの両方に対応可能です。

public function build()
{
    return $this->subject('お問い合わせ内容の確認')
                ->view('emails.contact')
                ->text('emails.contact_plain');
}

よくある注意点

  • Gmailを使う場合は、アプリパスワードの設定が必要になる場合があります。
  • 本番環境では必ずMAIL_FROM_ADDRESSMAIL_FROM_NAMEを設定しましょう。
  • HTMLメールを送る場合は、表示崩れに注意しシンプルな構成にするのがおすすめです。

まとめ

LaravelのMailableクラスとテンプレートを使えば、柔軟かつ見やすいメール送信処理が実装できます。送信先や内容が複雑でも、構造を分離できるため保守性が高くなります。

また、非同期送信やHTMLテンプレートの併用など、実務でもよく使われる機能を組み合わせることで、より快適なアプリケーションを構築できます。