Markdown メール通知を作成する

Laravel 5.4 より組み込まれた Markdown を用いたメール通知 を作成します。

Markdown Mail Notificationの作成はartisan make:notificationを利用するとViewテンプレートまで自動生成できるのでおすすめです。

今回は、Laravelのデフォルトのユーザー登録時にメールアドレス検証用のメールを送信するという体でサンプルを作成します。

なぜ Markdown ?

Laravel 5.3 で Notification が実装されましたが、これで使用できたメール通知はあまり使い勝手のいいものではありませんでした。

たとえば……

  • 本文レイアウトの自由度が低い
  • デフォルトで改行(≠改段落) を本文に入れられない、工夫してもイマイチ
  • 本文をコード内に書くので分離が出来ず汚れる。またPHPCS等の抑制が必要に
  • コードを見て確認がしにくい

これらの問題が Markdown を使ったメール通知では解消されています。

もちろん、必要に応じて従来のも使用できます。簡単な管理者宛通知メールとかならそっちの方がいいですよね。

Notificationの作成

artisanNotificationのクラスを作成します。今回は NewUserNotification という名前にしました。同時に notification.user.new というviewテンプレートを作成します。

\App\Notifications\CreateUserresources/views/notification/user/new.blade.php 以下のような内容で生成されました。

Notification の編集

今回作るのは登録完了&認証要求メールなので通知に載せれるようにしましょう。

Notification Class

Notificationの方はこんな感じ。今回はコンストラクタで値を取っていますが、セッターメソッドでももちろん構いません。

Notification::markdownは第一引数にView名、第二引数にViewに渡す配列を渡します。view()とかと基本的には一緒ですね。1

View Template

Viewテンプレートはmail::messageコンポーネントのスロットとして記述します。2 スロット内に記述したテキスト(もちろんHTMLも可)は自動的に Markdown テキスト としてパースされ、見た目の整えられたHTMLとしてメールに渡されます。また、CSSも動的に HTML 内にインライン化されます。(後述)

テキストメールでは、 Markdown のパースは行われず、HTMLタグの除去が行われたものが挿入されます。

また、デフォルトで buttontable, panel, promotionといったbladeコンポーネントが用意されています。

渡されたデータを使って、とりあえずこんな感じの Markdown View テンプレートを用意しました。

自分で書いておいてなんですが、心当たりのない人に返信を求めるのはダメだと思います。w

コントローラーから呼び出し

別にコントローラーでなくてもイベントリスナーでもサービスでもどっからでもいいんですけど今回はとりあえずコントローラーから呼び出します。

Laravel 5.3+においてデフォルトのapp\Userモデルは Notifable トレイト を継承しているのでここから生える notifable->notify($notification)を利用します。

notificationに渡されるnotifableはこれ(ここではUser)になりますが、notifableを利用するクラスはなんでも構いません。

デフォルトのRegisterController ではアカウント作成後に RegisterController@registered が呼び出されるのでここに書く。

以上で設置完了。

送信してみる

実際にユーザー登録をして、メールの送信を確認します。

なお、今回は一つ前の記事にてMailCatcherを設定済み。

ユーザー情報を入力してポチ

登録が完了すると同時に、メールが届きました。

テキストメールもこの通り

デザインのカスタマイズ

メールに独自のテンプレートを使いたいですよね。(メールテンプレートの構築は大変ですが。)

まずはFW内に含まれているテンプレートをプロジェクトリソースディレクトリにpublishします。

/resources/views/vendor/mail 以下に複製されますね。

みたら分かる通り、これらのテンプレートもまた mesage.blade.php を中心とした component チェーンで構成されています。HTMLとmarkdown(テキストメール用)で。

また、メールテンプレートなのにインラインスタイルが書かれておらず、themes/default.cssが存在することに気付くでしょう。
上にも書いたとおり、Notification で Markdown メールを送信する際にはこのCSSが CssToInlineStyles により自動的にインライン化されるんです。賢い!

またこのテーマのCSSファイル名は設定で変えれる……らしいんだけど決め打ちでアプリ内で複数使えるというわけではないようなので悩みどころ。要求するなら継承して作れってことなのだろうか。


  1. ただし第3引数をセットしてもマージされたりしません。 
  2. Viewを1から自分で作る際は @component('mail::message') 〜 @endcomponent で囲うのを忘れないようにしましょう。まさか居ないと思いますが、自分はそれを忘れて小一時間悩みました。 

“Markdown メール通知を作成する” への2件の返信

コメントを残す