環境
PHP 8.2.0
Laravel Framework 9.52.14
完成するもの
予約等をした際に自動で予約情報がメールで相手のメールアドレスあてに送信される機能です。
Let’s 開発
①コマンドでMailableクラスを継承したそのメールのインスタンスを作成する
Laravelプロジェクトフォルダで下記のコマンドをうつことで、インスタンスを作成できます。
php artisan make:mail ReserveConfirmMail
すると、下記画像のように、プロジェクトフォルダ/app/Mail直下に、ReserveConfirmMail.phpファイルが作成されます。中身は下記の通りです。
簡単に説明しますと、
__constructはインスタンスが作成されると初期に自動で行われる処理です。
envelopeは封筒とかいう意味ですが、ここでは、メールの件名を指定できます。
contentでは、メールのVIEWファイルを指定します。メールのVIEWファイルはblade.phpファイルでつくりますが、TailWind cssが無効だったり、画像は相対パスでは指定できなかったり、基本的に、tableクラス関係のタグを利用して構成していかないといけなかったり、なかなか面倒です。
そこで後々紹介しますが、無料のVIEWのテンプレートがあるので、大枠をそれでデザインを整えると時短でメール機能の見た目の部分を実装できます。
attachmentsは添付ファイルを指定することができます、今回は使用しません、かわりにインライン画像として、VIEWファイル内で画像を貼り付けたいと思います。
➁Mailableインスタンスにデータを渡す
Mailableを継承したクラス(=Mailableインスタンス=Mailableクラス)からメールを作成する場合、Mailableインスタンスに、データを渡したい時が多いと思います。
たとえば、予約システムをつくるなら、予約日時、予約者の名前などはメールに載せたい必須項目です。
なので、今回は、それらのメールに載せたい項目を、$dataに配列として格納し、Mailableクラスに渡したいと思います。
まず、メール機能を実行するコードはおそらくControllerに書くかと思いますので、
一例として、示します。
use Illuminate\Support\Facades\Mail;
use App\Mail\ReserveConfirmMail;
まず、コントローラーの上の方で今回利用する、Mailクラス(必須)
と、先ほど作成したMailableインスタンスをかきましょう。
// メールにのせるデータ作成↓(バック側では全部、日本語でつくりVIEW側で翻訳してもらう想定。)
$data = [
__("犬田布岬の神秘体験"), //題名 0 ※件名のためここで翻訳する
$guest_reservation->user->name, //ユーザー名 1
$admin_cancel_list->delete_lead_note, //予約可能枠取消理由 2
$selcted_date->year . "年" . $selcted_date->month . "月" . $selcted_date->day . "日", //サービスをうけるはずだった日付 3
$guest_reservation->hour, //サービスをうけるはずだった時間 4
$guest_reservation->service_price // お支払金額 //5
];
// メールにのせるデータ作成↑
// ↓メールアドレスあてにメール送信
Mail::to($guest_reservation->user->email)
->send(new AdminCancelMail($data));
// ↑メールアドレスあてにメール送信
そして、メールをおくりたいメソッドの適用箇所で
①Mailableインスタンスにおくりたいデータを$dataに配列としてまとめる
➁Mailクラスのtoメソッドでメールアドレスを引数にわたし、sendメソッド最初に作成した今回でいう、ReserveConfirmMailクラスを指定し、その中に先ほどまとめた$dataを引数として渡します。これでコントローラーでの書くコードは終わりです。
③Mailableインスタンスでデータをうけとり、VIEWファイルで利用できるようにする。
結論ですと、下記の画像のようにかけば問題ないです、今回は、$data配列にまとめたので、シンプルです。
メンバ変数を定義し、コンストラクタでさきほど、送ってきた変数をうけとり、ReserveConfirmMailクラスの$dataに格納しました。これで、$dataの中に、さきほど、コントローラーでまとめた変数はすべて利用できます、このクラス内でも、連携するVIEWファイル内でも使えます。
実際に、このクラス内の、envelopeメソッドでメンバ変数の中の変数を使って、件名を書き替えました。↓
この変更によって、おくられるメールの件名は、コントローラーで$dataの0番目にしてした値、
__(“犬田布岬の神秘体験”)
が代入されます。
注意点としては、同クラス内のメンバー変数や、メソッドを使う際は、$this->を使います、忘れないように。
③VIEWファイルをつくっていこうⅠ
最後にVIEWファイル、いわゆるメールの中身そのものを作っていきます。
メールにはただのテキスト形式、とデザイン等が付与できるhtmlメールがあります。
ひとまず、難易度の優しいテキスト形式のメールをいったん、送信テストもかねてつくり、その後、htmlメールに移行したいと思います。
まずは、VIEWファイルをつくります、私は下記の場所に作成しました、ファイル名は、決まりはないですが、クラス名と照らし合わせやすいように、reserve_confirm_mail.blade.phpにしました。↓
そして、次に、VIEWファイルと、クラスを紐づけるために、さきほどのReserveConfirmMailクラスのcontentメソッド内に、VIEWファイル名を書きました。
これでクラスのほうも完成ですね、あとは、VIEWファイルを作成しおえたら完成です。
VIEWファイルでは、ひとまず、$dataの値を全部だして自分の出力したいデータがちゃんと渡されているか確認します。(テキスト形式)
普通にbladeファイルの書き方で問題ないです、ただ、メールの場合、デザインはstyle属性で指定しないときかない等、普通のhtmlとは多少異なります。
実際に実行しますと、下記のようなテキストのみのメールが送られてきます、値もしっかり渡されていることが確認できました、ひとまず、普通のテキストのみのメールは完成です👏↓
③VIEWファイルをつくっていこうⅡ
ですが、テキストのみのメールだとなんかあっけないですよね、デザインとか、画像とかいれたほうが、最後まで読む率が上がるという論文もでているそうですし、企業でも最近htmlメールを採用しているところが多いらしいので、htmlメールをつくっていきましよう。
参考サイト↓
結果からいいますと、上記の参考サイトをもとに、layoutのVIEWファイルを作成し、
↓レイアウト側
本体となるVIEWファイルで中の値をいれたら大丈夫です。
本体のVIEWファイル例↓
ここで、もう一つ、気をつけることですが、
メールで画像を表示するときには、
$message->embed(public_path('logo\005.jpg'))
を利用するのが楽だと思います、ただ、上記の関数は、レイアウト側でのVIEWファイルでは、利用できません、おそらく$messageが本体のVIEWファイルまではきているが、レイアウトのVIEWファイルにはきていません、そこで、今回は、図のように<x-slot>を利用して渡しました。
では、最後に、予約完了したときに自動でおくられてくるメールのデザインを確認しましょう。
日本語は、多少おかしいところはのちのち修正しますが、デザインも施され、インライン画像もしっかりと表示されています!
最後に
クリスマス後の感想ですが、特にいつも通り過ご(コワーキングスペースでごりごり開発)してましたが、
昨日、高校時代の同級生からちょうど来年のこの日に同窓会をしようという誘いを受け了承しました。
そこには、長年あえてなかったメンバーも集まるし、高校一年の今頃の時期の自分の苦しすぎた初恋の人もきます、なんか伏線回収みたいに、次会うときに普通に話せたら自分は、自分の成長を実感するだろうと確信しながら12年ぶりにあうことになります。
返信がありません