コントローラでブレードを指定して画面を作成するように、メールでもブレードを使ってメールの作成が可能です。今回はそれを可能にしてくれるMailableのお話です。

HTMLメールの送信

まず、Mailableの作成から。

$ php artisan make:mail HelloHtml

を実行すると、Mailableのクラス、HelloHtml.phpを作成してくれます。

これを以下のように編集します。


namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class HelloHtml extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
       return $this->subject('こんにちは!') // メールの件名
            ->view('emails.hello'); // ここでブレードを指定
    }
}

ブレードの中身は、簡単に以下とします。

<html>
  <body>
    <h1>こんにちは!</h1>
  </body>
</html>

これをtinkerで送信します。

$ php artisan tinker
Psy Shell v0.10.6 (PHP 7.2.24 — cli) by Justin Hileman
>>> use App\Mail\HelloHtml;
>>> Mail::to('test@example.com')->send(new HelloHtml);
=> null

Mailtrapで送信されたメールを見てましょう。

HTMLメールとして届いていますね。

ここでひとつ修正です。前回にMailtrapの無料プランは3ヶ月までと書きましたが、それは大間違いで永遠に無料でした。毎月500通までの受信などの制限ありますが、私の使用頻度では十分です。

マークダウンを使ってもっとHTMLの要素をメールに

先に送信したメールは、HTMLですがとてもベーシックでつまらないですね。せっかくのHTMLだから、画像を入れたり色変えたりボタンを入れたりしたいです。しかし、コントローラの画面と違って、いちいちデザイナーに頼むのもなんです。

そこで、Laravelのマークダウンメールの登場です。

マークダウンのためのMailableのクラスの作成は、先のMailableのクラスと同じで、先のコマンドの実行に、–markdownの引数の指定するだけです。

$ php artisan make:mail HelloMarkdown --markdown=emails.hello-markdown

これで、HelloMarkdown.phphello-markdown.blade.phpが作成されます。

これらを以下のように編集します。

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class HelloMarkdown extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('こんにちは!マークダウン')
            ->markdown('emails.hello-markdown'); // viewでなくmarkdownメソッドを使用
    }
}
@component('mail::message')
# こんにちは

![Gmail](https://example.com/gmail.png)

ここにメールの内容が入る

@component('mail::button', ['url' => ''])
ホームページへ
@endcomponent

ありがとうございます<br>
{{ config('app.name') }}
@endcomponent

先と同様に、tinkerで送信します。

Psy Shell v0.10.6 (PHP 7.2.24 — cli) by Justin Hileman
>>> use App\Mail\HelloMarkdown;

>>> Mail::to('test@example.com')->send(new HelloMarkdown);
=> null

結果を、Mailtrapで見ると、以下のようになります。

By khino