Help us understand the problem. What is going on with this article?

LaravelのMailMessageクラスをカスタマイズする

この記事は、MailMessageクラスの仕組みとカスタマイズ方法を解説し、HTMLメールとテキストメールをまとめて作って生産性を上げよう!という趣向の記事になっております!

MailMessageクラスって何?

php artisan make:notificationで通知のひな型を生成するとNotificationを継承した以下の様なコードが現れます。
ここで使われているMailMessageクラスが本記事の主役です。

public function toMail($notifiable)
{
    return (new MailMessage)
                ->line('The introduction to the notification.')
                ->action('Notification Action', url('/'))
                ->line('Thank you for using our application!');
}

このひな型の中では、MailMessageクラスを使ってメールの文章が構築されていますが、このMailMessageクラスに関するドキュメントがあまりないため、恐らく多くのケースで、まったく別のコードに置き換えるか、雰囲気でカスタマイズしていたりするのではないでしょうか?

以下で、クラスの仕組みとカスタマイズ方法を解説していきます。

Laravelのバージョン

Laravel 5.7

文章の構築

文章の構築はsubject(), greeting(), line()などのメソッドを呼び出して行います。
各メソッドがメール上のどこに出力されるかは、以下の図の通りです。
左の画像が構築されるHTMLメールで、右の画像が構築する処理、赤矢印で対応を表しています。

2019-12-01_21h46_03.png

上図の補足ですが、subjectはメールの件名となります。
①には.envAPP_ENVの値が出力されます。
②はリンクになっておりaction()の第二引数で指定したURLが出力されます。
また、level()の指定により色が変わります。
③はアクションボタンの出力がある場合のみ出力される注意書きです。
英語が出力されている箇所については、@langを通して出力されているので
Translation Stringsを使って置き換える事ができます。

テキストメールしか対応していないメールクライアントの場合、以下の様に表示されます。

2019-12-01_21h43_31.png

使用されるbladeについて

デフォルトでは以下のbladeを使用してレンダリングされます。

HTMLメールの場合

テキストメールの場合

①の内容を確認すると、本文部分のテキストをIlluminate\Mail\Markdown::parse()を通しているためHTMLメールではmarkdown記法が使える様です。
逆に、④では、Illuminate\Mail\Markdown::parse()を通していない他、strip_tags関数を通してHTMLタグを取り除いている事が分かります。
なお、③と⑥は同じファイルです。

bladeのカスタマイズ方法

③⑥はMailMessagemarkdown('your-blade-name')で指定したbladeに差し替える事ができます。
①②は/resources/views/vendor/mail/html以下に同名のbladeを配置すると、そちらが使われます。
④⑤は/resources/views/vendor/mail/markdown以下に同名のbladeを配置すると、そちらが使われます。

Markdownについて

MailMessageではMarkdown記法が使用でき、パースにはparsedownが使用されています。(デモページ
使える文法はGitHub Flavoredに準拠している様です。

なお、テキストメールには変換前のmarkdownがそのまま出力されます。

スタイルのカスタマイズについて

HTMLメールで適応されるCSSをthemeと呼んでいる様です。

デフォルトで適応されるCSS(theme)は以下となります。
Illuminate/Mail/resources/views/html/themes/default.css

カスタマイズしたい場合は/resources/views/vendor/mail/html/themes/default.cssを作成すると、そちらが使われます。

改行する方法

デザインの都合上、1つのline()の中で改行したいケースがあります。
(改行を含む文字列を入力しても、出力時には取り払われてしまう。brタグも同様。)
その場合は以下の様に書く必要があります。

->line(new HtmlString("1行目のテキスト<br>\n2行目のテキスト"))

キモは<br>\nを両方書くことです。
これにより、HTMLメールとテキストメールの両方で改行されます。

最後に

以上が、MailMessageの仕組みとカスタマイズ方法となります。
お役に立てましたら「いいね」を頂けると嬉しいです!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした