# やりたいこと
公式の「メール通知」の「他の通知フォーマットオプション」でMailable
を使うやり方が紹介されているが、あまりに簡素な説明になってしまっているので、具体的なやり方を確認する。
環境
Laravel 5.5
何が嬉しいか
通常はMailMessage
インスタンスを使うが、これだと必要最低限のことしかできない。Mailable
インスタンスだとMailMessage
インスタンスではできなかった以下のようなことができるようになる。
- テキストメールを送れる。
-
SwiftMailer
に好き勝手にパラメータを渡せる。
-return-path
が設定できる。
-x-mailer
のような拡張ヘッダを追加できる。
Mailファサード使ってsend()すれば良いじゃん
それだとnotify()
ではなくsend()
になり、「通知」のコンテキストが損なわれるのでやりたくない。
やってみた
まずMailableクラスを直接インスタンスとして利用しようとすると、build()
が実装されてないっていう旨のエラーが吐かれる。そのため、継承してbuild()
するだけのクラスをapp/Email
内に新規作成する。
<?php
namespace App\Mail;
use Illuminate\Mail\Mailable;
class Notification extends Mailable
{
/**
* Build the message.
*
* @return $this
*/
public function build()
{
//
}
}
次に作成したNotificationクラスを通知用のクラスのtoMailメソッドで呼び出すようにする。
変更前
ヘッダを自由に設定できず、テキストメールを作ることもできなかったため、ヘッダの拡張は諦めつつmarkdownで送っている。
public function toMail($notifiable)
{
return (new MailMessage)
->from(config('mail.from.address'))
->subject('メッセージ受信通知')
->markdown('emails.message_received', ['url' => route('hoge')]);
}
変更後
ヘッダにreturn-path
とx-Mailer
を設定して、テキストメールを作って送れるようになった。
public function toMail($notifiable)
{
return (new \App\Mail\Notification())
->text('emails.message_received', ['url' => route('hoge')])
->from(config('mail.from.address'))
->to($notifiable->email)
->subject('メッセージ受信通知')
->withSwiftMessage(function (\Swift_Message $message) {
$message
->setReturnPath(config('mail.from.address'))
->getHeaders()->addTextHeader('X-Mailer', 'hoge-mailer');
});
}
以上。
共通でセットするパラメータであれば、build()
内でreturn $this->from(config('mail.from.address'))
とかしても良さそう。