Copy & Paste Engineer

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

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

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

trait を作成

trait を作成します。

<?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 を追加する。

<?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