k.watanabe技術者ブログ

k.watanabe

Laravelでお問い合わせフォームを作成②

はじめに

laravelではメールファサードを使用してメールを送信出来ますが、Mailableクラスを使用して送信元やテンプレートなどをkeyごとにわかりやすく設定することが出来ます。


手順1: Mailableクラスの作成

まずは以下のコマンドでMailableクラスを作成します。


  1. $ php artisan make:mail FormAdminSendmail


手順2:Mailableクラスの編集

まず、onstructの引数に【public array $form_data】を追加します。ここに書くことで入力フォームから受け取ったパラメータを次に遷移させるブレードに渡すことが出来ます。


envelopeメソッドでは送信元の情報を設定します。【config('mail.email_admin');】の記述でenvファイルに設定した管理者のメールアドレスをconfigファイルを介して取得しています。

subjectのkeyには送信元から送信する際のメールタイトルを追加します。わかりやすいように自動送信メールとしました。

  1. <?php
  2. namespace App\Mail;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Contracts\Queue\ShouldQueue;
  5. use Illuminate\Mail\Mailable;
  6. use Illuminate\Mail\Mailables\Content;
  7. use Illuminate\Mail\Mailables\Envelope;
  8. use Illuminate\Queue\SerializesModels;
  9. use Illuminate\Mail\Mailables\Address;
  10. class FormAdminMail extends Mailable
  11. {
  12.     use Queueable, SerializesModels;
  13.     /**
  14.      * Create a new message instance.
  15.      *
  16.      * @return void
  17.      */
  18.     public function __construct(public array $form_data)
  19.     {
  20.         //
  21.     }
  22.     /**
  23.      * Get the message envelope.
  24.      *
  25.      * @return \Illuminate\Mail\Mailables\Envelope
  26.      */
  27.     public function envelope()
  28.     {
  29.         $email_admin = config('mail.email_admin');
  30.         return new Envelope(
  31.             from: new Address($email_admin, 'k.watanabe'),
  32.             subject: '自動送信メール',
  33.         );
  34.     }
  35.     /**
  36.      * Get the message content definition.
  37.      *
  38.      * @return \Illuminate\Mail\Mailables\Content
  39.      */
  40.     public function content()
  41.     {
  42.         return new Content(
  43.             view: 'mail.admin',
  44.         );
  45.     }
  46.     /**
  47.      * Get the attachments for the message.
  48.      *
  49.      * @return array
  50.      */
  51.     public function attachments()
  52.     {
  53.         return [];
  54.     }
  55. }


contentメソッドのviewのkeyはテンプレートとして使用したい管理者用のbladeファイルを追加します。お問い合わせがあった場合に管理者に送信する際のメールのテンプレートを記述することになります。


管理者用に送る際のメールテンプレート

views/mail/admin.blade.php

  1. 様より下記の内容のお問い合わせがありました
  2. ==============================
  3. お問い合わせ内容
  4. ==============================
  5. ■お名前:
  6. ■メールアドレス:
  7. ■お問い合わせ内容:

ユーザーと管理者でメールのテンプレートを分けたい場合はユーザー用のMailableクラスを作成します。(テンプレートを共通で使いたい場合は不要。)

  1. php artisan make:mail FormUserSendmail

app/Mail/FormUserMail.php

  1. <?php
  2. namespace App\Mail;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Contracts\Queue\ShouldQueue;
  5. use Illuminate\Mail\Mailable;
  6. use Illuminate\Mail\Mailables\Content;
  7. use Illuminate\Mail\Mailables\Envelope;
  8. use Illuminate\Queue\SerializesModels;
  9. use Illuminate\Mail\Mailables\Address;
  10. class FormUserMail extends Mailable
  11. {
  12.     use Queueable, SerializesModels;
  13.     /**
  14.      * Create a new message instance.
  15.      *
  16.      * @return void
  17.      */
  18.     public function __construct(public array $form_data)
  19.     {
  20.         //
  21.     }
  22.     /**
  23.      * Get the message envelope.
  24.      *
  25.      * @return \Illuminate\Mail\Mailables\Envelope
  26.      */
  27.     public function envelope()
  28.     {
  29.         $email_admin = config('mail.email_admin');
  30.         $from = new Address($email_admin, 'フォームAPP');
  31.         $subject = '【フォームAPP】お問合せ有難うございます';
  32.         return new Envelope(
  33.             from: $from,
  34.             subject: $subject,
  35.         );
  36.     }
  37.     /**
  38.      * Get the message content definition.
  39.      *
  40.      * @return \Illuminate\Mail\Mailables\Content
  41.      */
  42.     public function content()
  43.     {
  44.         return new Content(
  45.             view: 'mail.user',
  46.         );
  47.     }
  48.     /**
  49.      * Get the attachments for the message.
  50.      *
  51.      * @return array
  52.      */
  53.     public function attachments()
  54.     {
  55.         return [];
  56.     }
  57. }

Views/mail/user.blade.php

  1. こちらの内容で受け付けました。
  2. ==============================<br>
  3. お問い合わせ内容<br>
  4. ==============================<br>
  5. ■お名前:
  6. ■メールアドレス:
  7. ■お問い合わせ内容:

手順3: コントローラー側でメール送信するロジックを追加

メール送信する流れとしては、入力ページで入力した後、確認ページへ遷移し、確認ページから送信ボタンを押すと、MailController.phpのsendメソッドが呼び出されます。

MailRequestでバリデーションが通れば、envファイルに定義している管理者用のメールアドレスをconfigから取得し、管理者宛メールの送り先にセットします。

メールファサードのsendメソッドを使用してメール送信しています。

第1引数に、テンプレートファイルのパスを指定し、第二引数に送信したい中身(フォームから受け取ったパラメータ)をセットしてメール送信しています。

Controllers/MailController.php


  1.  /**
  2.      * Display the login view.
  3.      */
  4.     public function send(MailRequest $request): View
  5.     {
  6.         $form_data = $request->validated();
  7.         $email_admin = config('mail.email_admin');
  8.         $email_user = $form_data['email'];
  9.         // 管理者宛メール
  10.         Mail::to($email_admin)->send( new FormAdminMail($form_data) );
  11.         // ユーザー宛メール
  12.         Mail::to($email_user)->send( new FormUserMail($form_data) );
  13.         
  14.         // 二重送信対策のためトークンを再発行
  15.         $request->session()->regenerateToken();
  16.         
  17.         return view('mail.conmplete', ['contents' => $form_data]);
  18.     }

あとは二重送信されないための処理を追加し、完了ページへ遷移させます。


その他1: サクラサーバーで設定したメールと連携する。

サクラサーバーの管理画面にログインし、メール一覧から作成ボタンを押してメールアカウントを作成する。


envファイルに以下のように設定する。


  1. MAIL_MAILER=smtp
  2. MAIL_HOST=サクラサーバーのホスト名
  3. MAIL_PORT=587
  4. MAIL_USERNAME=サクラサーバーの管理画面から作成したメールアドレス
  5. MAIL_PASSWORD="サクラサーバーで設定した”パスワード
  6. MAIL_ENCRYPTION=tls
  7. MAIL_FROM_ADDRESS=サクラサーバーの管理画面から作成したメールアドレス
  8. MAIL_FROM_NAME="${APP_NAME}"

これでお問い合わせフォームから入力した内容がサクラサーバーで設定したメールアドレス宛に送信出来るようになります。

参考記事:【超解説】Laravelでお問い合わせフォーム作成!Gmailで連携するには?

記事一覧に戻る

プロフィールに戻る