Laravel:説明会を忘れないようにカレンダー連携できるメール

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、まだまだマーケティング勉強の余韻が残っている今日この頃です。
こういった勉強をすると、日常から「あ、これってアレに使えるんじゃない??」って思ったりします。

そして、そんな中思いついたのが、

カレンダー連携できるメール

です。

どういうことかと言うと、メールに.icsファイルを添付しておいて
メールを開いたときにカレンダーに登録をさせるようにするわけです。

例えば、商品やサービス、セミナーの日時って
忘れられてしまったりしますが、これを予防するための機能です。

流れはこんなカンジです。

  • イベント参加フォームから送信
  • 完了メールを送信
  • ics が添付しているので以下のようにカレンダー登録できる

※ これは、gmailの例です。

そこで❗

今回はLaravelでこのicsファイル付きメールを送信し、
少しでも参加人数を増やす」というマーケティングに関連した実装をしてみます。

ぜひ何かの参考になりましたら嬉しいです。😊✨

「ツイッター教材を買ったので、
投稿するツイートを大量生産してます!」

開発環境: Laravel 11.x

パッケージをインストールする

.icsを作成するためのパッケージをSpatieさんが提供していますので、
これをインストールしておきましょう。(いつもありがとうございます❗)

composer require spatie/icalendar-generator

これで準備は完了です。
ここからは実際にコードを書いていきましょう😊

コントローラーをつくる

では、今回はDB周りは不要なので、
いきなりコントローラーからつくっていきます。

以下のコマンドを実行してください。

php artisan make:controller ApplicationController

するとファイルが作成されるので、
中身を以下のようにします。

app/Http/Controllers/ApplicationController.php

<?php

namespace App\Http\Controllers;

use App\Mail\EventApplied;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Spatie\IcalendarGenerator\Components\Calendar;
use Spatie\IcalendarGenerator\Components\Event;
use Spatie\IcalendarGenerator\Properties\TextProperty;

class ApplicationController extends Controller
{
    private $event;

    public function __construct()
    {
        $dt = Carbon::now();
        $start_dt = $dt->addDays(7)->setTime(19, 0, 0); // 1週間後の19時からイベント開始
        $end_dt = $start_dt->copy()->addHours(2); // 開始から2時間後にイベント終了

        $this->event = [
            'name' => '新サービス「Console dot Log」参加説明会',
            'description' => '新サービス「Console dot Log」の参加説明会です。',
            'location' => [
                'address' => '東京都●●区丸●●1−2−34',
                'address_name' => 'SUKOHI タワービル 27階',
                'coordinates' => [
                    'lat' => 35.123456,
                    'lng' => 139.123456,
                ],
            ],
            'organizer' => [
                'name' => '株式会社 九保すこひ',
                'email' => 'sukohi@example.com',
            ],
            'start_dt' => $start_dt,
            'end_dt' => $end_dt,
        ];
    }

    public function create()
    {
        return view('application.create', [
            'event' => $this->event,
        ]);
    }

    public function store(Request $request)
    {
        // 注: バリデーションは省略してます

        // 本来はここでデータベースに保存する処理を書く

        // ics データを作成
        $ics_event = Event::create()
            ->name($this->event['name'])
            ->description($this->event['description'])
            ->startsAt($this->event['start_dt'])
            ->endsAt($this->event['end_dt'])
            ->address($this->event['location']['address'])
            ->addressName($this->event['location']['address_name'])
            ->coordinates(
                $this->event['location']['coordinates']['lat'],
                $this->event['location']['coordinates']['lng'],
            )
            ->organizer(
                $this->event['organizer']['email'],
                $this->event['organizer']['name'],
            );

        $ics_calendar = Calendar::create()
            ->appendProperty(
                TextProperty::create('METHOD', 'REQUEST')
            )
            ->event($ics_event);
        $ics_content = $ics_calendar->get();

        // メール送信
        Mail::to($request->email)->send(
            new EventApplied(
                event: $this->event,
                ics_content: $ics_content,
            )
        );

        return '申し込みが完了しました!';
    }
}

なお、icsデータの最後の部分で「METHOD:REQUEST」を追加していますが、これは以下のような選択ボタンを表示するためのものです。

※ 実際の内容はこんなカンジになります。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:spatie/icalendar-generator
METHOD:REQUEST <---ここ
...

なお、もし「METHOD:REQUEST」をつけない場合だと、
以下のように「カレンダーに追加」リンクが表示されますが、
あまり目立たないので、よりカレンダー登録を訴求したい場合はセットしておくほうがいいでしょう。

ビューをつくる

次にコントローラー内でセットしたビューをつくります。
コマンドを実行して下さい。

php artisan make:view application.create

すると、ビューファイルが作成されるので、
中身を以下のようにします。

resources/views/application/create.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>{{ $event['name'] }}</title>
    <script src="https://cdn.tailwindcss.com/3.4.3"></script>
</head>
<body class="bg-gray-100 flex justify-center items-center h-screen">
<div class="w-full max-w-md p-8 bg-white shadow-lg rounded-lg">
    <h2 class="text-md font-bold text-center mb-6">{{ $event['name'] }}<br>登録フォーム</h2>
    <form action="{{ route('application.store') }}" method="POST" class="space-y-6">
        @csrf
        <input type="text" name="name" placeholder="お名前" class="w-full p-2 border border-gray-300 rounded-md">
        <input type="email" name="email" placeholder="メールアドレス" class="w-full p-2 border border-gray-300 rounded-md">
        <button type="submit" class="w-full p-2 bg-blue-500 text-white rounded-md hover:bg-blue-600">送信</button>
    </form>
</div>
</body>
</html>

メール送信部分をつくる

では、こちらもコントローラー内でセットした
Mailableをつくっていきます。

コマンドを実行して下さい。

php artisan make:mail EventApplied

するとMailableファイルが作成されるので、
中身を以下のようにします。

app/Mail/EventApplied.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use Illuminate\Mail\Mailables\Attachment;

class EventApplied extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     */
    public function __construct(
        private array $event,
        private string $ics_content
    ){}

    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: '参加申し込みありがとうございます!',
        );
    }

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.event_applied',
            with: [
                'event' => $this->event,
            ],
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [
            Attachment::fromData(fn() => $this->ics_content, 'event.ics', 'text/calendar')
        ];
    }
}

この中で重要なのは、添付ファイルをデータからつくっているところです。
fromData()で実装できます。

resources/views/emails/event_applied.blade.php

php artisan make:view emails.event_applied

ビューが作成されるので中身を変更します。

resources/views/emails/event_applied.blade.php

この度は、{{ $event['name'] }} への参加申し込みをいただき、<br>誠にありがとうございます。<br><br>
以下の内容で申し込みを受け付けました。<br><br>

詳細は以下の通りです。<br>
時間:{{ $event['start_dt']->format('Y年m月d日') }} ({{ $event['start_dt']->format('H:i') }}〜 {{ $event['end_dt']->format('H:i') }})<br>
場所: {{ $event['location']['address_name'] }}<br><br>

当日お会いできるのを楽しみにしております。<br>
ぜひカレンダーへの予定の追加をお願いいたします。<br><br>

{{ $event['organizer']['name'] }}

ルートをつくる

では、最後にルートです。

routes/web.php

// 省略

use App\Http\Controllers\ApplicationController;

// 省略

Route::prefix('application')->group(function () {
    Route::get('/create', [ApplicationController::class, 'create'])->name('application.create');
    Route::post('/', [ApplicationController::class, 'store'])->name('application.store');
});

これで作業は完了です。
お疲れ様でした😊✨

テストしてみる

では、実際にテストしてみましょう❗

まずはブラウザで「https://******/application/create」へアクセスします。

すると、フォームが表示されるので、
名前とメールアドレスを入力して送信してみます。

すると・・・・・・

はい❗
完了メッセージが表示されました。

では、メールの方も見てみましょう。

はい❗
ちゃんと到着していて、icsファイルも添付されています。

ただし、このメール表示は開発用のmailcatcherのものなので、
icsファイルをダウンロードして自分自信のgmailへ送信して確認してみます。

どうなるでしょうか・・・・・・

はい❗

gmailにメールが届いたので、開封してみると、
「カード」が表示されていました。

そこで、参加を表明する「はい」ボタンをクリックしてみます。

そして、「Google カレンダー」の方で見てみると・・・・・・

はい❗

きちんと登録されていて、
さらに30分前にアラームがなるようになっています。

すべて成功です😊✨

企業様へのご提案

今回のようにicsファイルを使ったメールを送信すると、
カレンダーへの登録やアラームを鳴らすなどができます。

となると、顧客がよりイベントに参加するようにすることが期待できます。

もしこのシステムを使って集客数を増やしたい場合は
ぜひお問い合わせからご相談ください。

お待ちしております。😊

開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回はLaravelを使ってicsファイル付きのメールを送信してみました。

もしかすると、より集客につながるパーセンテージは少ないかもしれませんが、
母数が大きくなればなるほど集客数自体は増えていくので、少しでもプラスになる施策はやるべきですね。

ぜひ今回のメールを参考にして他にもいろいろと研究してみてくださいね。

ではでは〜❗

「マーケティングのセミナー
参加したことあります😊」

このエントリーをはてなブックマークに追加       follow us in feedly