概要
Laravelのイベントとリスナーを使って、フォームからの問い合わせが来たときに、通知メールを送信する処理を実装します。
実行環境
上記の記事を参考に、GitHubのテンプレートリポジトリから環境を構築しています。
Laravel6.*
実装の大まかな流れ
- 環境変数にメール送信に必要な情報を設定
 - メール送信用クラスの作成
 - メールのViewを作成
 - イベントの作成
 - リスナーの作成
 - イベントとリスナーを紐づけ
 - イベントの発行
 
環境変数(.env)に必要情報を設定
MAIL_DRIVER=smtp
MAIL_HOST=XXXXX.jp //サーバのドメイン名やIPアドレス
MAIL_PORT=587 //ポート番号は各環境に依存
MAIL_USERNAME=XXXXX@XXXXX.co.jp //メールで利用するユーザ名
MAIL_PASSWORD=XXXXX //メールで利用するパスワード
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=XXXXX@XXXXX.co.jp //メールの送信元アドレス
ACCEPT_MAIL_ADDRESS=XXXXX@XXXXX.co.jp // メールの送信先アドレス
<?php
return [
    'aliases' => [
    // 省略
    ],
    // 問い合わせ用メールアドレスを設定
    'mail_from_address' => env('MAIL_FROM_ADDRESS'),
    'accept_mail_address' => env('ACCEPT_MAIL_ADDRESS'),
];
メール送信用クラスの作成
app\Mail配下にContactMail.phpを作成
$ php artisan make:mail ContactMail
メール送信用クラスの編集
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class ContactMail extends Mailable
{
    use Queueable, SerializesModels;
  // 追記
    private $contact;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($contact) // コンストラクタの引数で値を受け取る
    {
        // ContactMailクラスのprivate変数に引数の値を代入
        $this->contact = $contact;
    }
    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this
            ->from(config('app.mail_from_address')) // 送信元のメールアドレスを指定
            ->subject('お問い合わせ完了のご連絡') // メールの件名
            ->view('emails.contact_mail') // どのテンプレートを呼び出すか
            ->with(['contact' => $this->contact]); // withオプションでセットしたデータをテンプレートへ受け渡す
    }
}
メール送信用のViewを作成
resources\views配下にemailsフォルダを作成
$ mkdir emails
フォルダ作成後、resources\views\emails配下に、contact_mail.blade.phpを作成
メール送信のViewを編集
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        メール送信しました
    </body>
</html>
イベントの作成
app\Events配下にContactRequestCompleted.phpを作成
$ php artisan make:event ContactRequestCompleted
イベントの編集
イベントのコンストラクタを修正
イベント発火時に必要な情報をコンストラクタで渡しておく。
class ContactRequestCompleted
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
  // 追記
    public $contact;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($post) // コンストラクタの引数でフォームから値を受け取る
    {
        // ContactRequestCompletedクラスのpublic変数に引数の値を代入
        $this->contact = $post;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}
リスナーの作成
app\Listeners配下にSendContactRequestEmail.phpを作成
$ php artisan make:listener SendContactRequestEmail
リスナーの編集
SendContactRequestEmail内のhandleメソッドを修正
handleメソッド内に、メール送信などの具体的な処理を追加する。
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Mail;
use App\Mail\ContactMail;
class SendContactRequestEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle($event)
    {
        // メールの送信先アドレスに、.envで指定したACCEPT_MAIL_ADDRESSの値を代入
        $to_address_admin = config('app.accept_mail_address');
        // 送信先アドレスにメールを送信
        Mail::to($to_address_admin)->send(new ContactMail($event->contact));
    }
}
イベントとリスナーを紐づけ
Providers\EventServiceProvider.phpを編集
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
use App\Events\ContactRequestCompleted;
use App\Listeners\SendContactRequestEmail;
class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
        // 作成したイベントと紐付けたいリスナーを追記
        ContactRequestCompleted::class => [
            SendContactRequestEmail::class,
        ],
    ];
    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();
        //
    }
}
イベントの発行
コントローラー等にイベントの発行処理を追加
use App\Events\ContactRequestCompleted;
class SampleController extends Controller
{
     // イベントの発火処理(引数で値渡しが可能)
     event(new ContactRequestCompleted($post));
}