Laravelでメール送信付きの問い合わせフォームを作る方法
先生と生徒の会話形式で理解しよう
生徒
「Laravelで問い合わせフォームを作って、送信するとメールも届くようにしたいです。」
先生
「それならLaravelのメール送信機能とフォームバリデーションを組み合わせると簡単に作れます。」
生徒
「フォームバリデーションって何ですか?」
先生
「入力されたデータが正しいかチェックする仕組みのことです。例えば必須項目が空欄でないか、メールアドレスが正しい形式かなどを確認します。」
1. メール送信用の設定
まずは.envファイルでメール送信の設定を行います。SMTPサーバーや送信元メールアドレスを指定します。
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your_email@example.com
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your_email@example.com
MAIL_FROM_NAME="YourAppName"
この設定でLaravelがメールを送信できるようになります。
2. フォームの作成
Bladeテンプレートで問い合わせフォームを作ります。ユーザー名、メールアドレス、内容などの入力欄を設置します。
<form action="{{ route('contact.send') }}" method="POST">
@csrf
<input type="text" name="name" placeholder="お名前">
<input type="email" name="email" placeholder="メールアドレス">
<textarea name="message" placeholder="お問い合わせ内容"></textarea>
<button type="submit">送信</button>
</form>
@csrfはフォームのセキュリティを守るためのトークンです。
3. バリデーションの設定
FormRequestを使うと、フォームの入力チェックを簡単にまとめられます。artisanコマンドで作成します。
php artisan make:request ContactFormRequest
作成されたContactFormRequestのrules()メソッドにルールを定義します。
public function rules()
{
return [
'name' => 'required|string|max:50',
'email' => 'required|email',
'message' => 'required|string|max:1000',
];
}
4. メール送信の設定
LaravelのMailファサードを使ってメールを送信します。Mailableクラスを作成すると便利です。
php artisan make:mail ContactMail
Mailableクラスでメールの件名や本文を設定します。
public $contact;
public function __construct($contact)
{
$this->contact = $contact;
}
public function build()
{
return $this->subject('お問い合わせがありました')
->view('emails.contact');
}
5. コントローラでフォーム送信処理
コントローラでFormRequestを受け取り、バリデーション済みデータを取得し、メール送信を行います。
use App\Http\Requests\ContactFormRequest;
use App\Mail\ContactMail;
use Illuminate\Support\Facades\Mail;
public function send(ContactFormRequest $request)
{
$data = $request->validated();
Mail::to('admin@example.com')->send(new ContactMail($data));
return redirect()->back()->with('success', 'お問い合わせを送信しました');
}
送信後はセッションにメッセージを保存し、フォーム画面に表示できます。
6. Bladeでエラーメッセージと完了メッセージ表示
バリデーションエラーや送信完了メッセージをBladeで表示します。
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
@foreach($errors->all() as $error)
<div class="alert alert-danger">{{ $error }}</div>
@endforeach
7. ベストプラクティス
- FormRequestを使ってバリデーションを分離し、コントローラをシンプルに保つ
- メール送信はMailableクラスで管理して再利用性を高める
- 送信後のリダイレクトとセッションメッセージでユーザーにフィードバックを提供する
- メール送信設定は.envで管理し、開発環境と本番環境を分ける