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 メール
use
に MailMultiPartViewTextTrait
を追加する。
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