JavaScriptを有効にしてください

Laravel メールを自動的にマルチパート化する

 ·  ☕ 1 分で読めます

Larave メールをマルチパート化

Laravel のメールで view を指定すると Laravel では view を実行してHTMLを生成します。
そうするとHTMLメールになってしまいます。
ただし、一部のメーラーだとHTMLメールが受け取れないのでテキストメールとのマルチパート化をする必要がありましたので、その時のメモ。

trait を作成

trait を作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

namespace App\Mails;

use Illuminate\Support\HtmlString;
use View;

trait MailMultiPartViewTextTrait
{
    /**
     * Build the view for the message.
     *
     * @return array|string
     *
     * @throws \ReflectionException
     */
    protected function buildView()
    {
        if (isset($this->view) && !isset($this->textView)) {
            // View だけ設定されている場合、Viewを生成してhtml、textの自動マルチパート化を行う

            // View を生成する
            $view = View::make($this->view, $this->buildViewData())->render();

            // styleタグ内を削除
            $text = preg_replace("/<style\\b[^>]*>(.*?)<\\/style>/s", "", $view);
            // タグを削除
            $text = strip_tags($text);

            return array_filter([
                'html' => new HtmlString($view),
                'text' => new HtmlString(ltrim($text)),
            ]);
        }

        return parent::buildView();
    }
}

メールを使用する

サンプルはこちらから使用
Laravel 7.x メール

useMailMultiPartViewTextTrait を追加する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php

namespace App\Mail;

use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels, MailMultiPartViewTextTrait;

メールソースを確認すると以下の情報が増えてマルチパート化されます。
Content-Type: multipart/alternative;
Content-Type: text/plain; charset=utf-8

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer