LaravelのNotificationでテキスト(平文)メールを送信したい
Laravelで通知メールを送信するしくみとしてNotificationクラスがありますが、それでテキスト(平文)メールを送る方法です。
Notificationは非常に便利で、通知メールを送るための各機能が用意されています。
但し、基本的に送信するメールタイプはHTMLメールです。正しくは「HTMLメールが受け取れない環境の場合はテキストメールを送る」といった仕様のようでうすが、あまり理解できておりません。。
個人的には通知メールは確実に届けたいので、HTMLメールではなくテキストメールのみを送信するほうが良いと考えています。HTMLメールが崩れて読めない、メッセージが伝わらないでは困りますからね。
では、実際にテキストメールを送信する方法です。
例えば、新規Notificationクラス「SampleNotification」を作成する場合、artisanコマンドで作成することができます。
> php artisan make:notification SampleNotification
コマンドを実行すると、ファイル「…/app/Notifications/SampleNotification.php」が生成されます。デフォルトの内容は以下です。(コメントなど要点以外は省略しています)
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class SampleNotification extends Notification
{
use Queueable;
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
}
関数toMailの中でメールを送信してるのですが、継承してるクラスMailMessageではHTMLメールを送信します。テキストメールのみの指定はできません。
テキストメールを送信するためにクラスMailableを利用したいのですが、クラスSampleNotificationでMailableを継承しちゃうと、Verifyメールなどデフォルトで使用できる便利な機能が使えなくなってしまいます。そもそもメールを送信する関数がtoMailではなくbuildだったり。。
そこで必要なクラスを読み込んだり、処理を分けたりなど試行錯誤を繰り返したのですが、やはり使えない機能があったり、処理によってはエラーになったり。。やはりフレームワークデフォルトの構成を崩すのはあまりよろしくないようです。
調査する中、同様の問題を取り上げている記事もいろいろありましたが、以下の方法がスマートだと思ったので参考にさせていただきました。
Plain text emails for notifications?
ちなみに今回はLaravel 6.xです。
さきほどのデフォルトのコードを以下のように書き換えます。
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class SampleNotification extends Notification
{
use Queueable;
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new BareMail)
->to('送信先メールアドレス')
->subject('メールタイトル')
->text('メールビュー');
}
}
class BareMail extends Mailable {
use Queueable, SerializesModels;
public function build() {}
}
別途クラスBareMailを追加してクラスMailableを継承します。そして、メールを送信する関数toMailの中でクラスBareMailをコールします。
これで確実にテキストメールを送ることができます。