created: 2019-06-15 00:00:00,tags:php,laravel,

Laravel で Mail を送信する前にメール内容を取得する

Laravel の Mailable クラスを継承して作成する Mail 機能は色々良くしてくれるので便利だけど、メール内容を取得する方法がなかなか見つからなかったので書いておく。

Laravel 5.6 時点での話なので、他は分からないけど、多分そんなに変わらないと思う。

結論から言うと Laravel 5.6 API - Mailable を見れば大体書いているという話。

内容

具体的には、Mailable オブジェクトを作成、各種設定の後 build メソッドを実行し、view_data を取得する事で body が取得出来る。

# app/Mail/SampleMail.php
<?php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SampleMail extends Mailable
    use Queueable,
        SerializesModels,
        MailHistoryUtil;

    public function build()
    {
        $subject = "sample mail subject";
        $body = "sample mail body";
        return $this->subject($subject)
            ->from($from)
            ->text('emails.sample', compact('body'));
    }
}
?>

<?php
namespace App\Http\Controllers\SampleController;

use App\Mail\SampleMail;
use App\Http\Controllers\Controller;

class SampleController extends Controller
{
    public function sample()
    {
        // Mailable オブジェクトを生成してから body の取得まで
        $mailable = new SampleMail();
        if (!is_null($mailable)) {
            $view_data = $mailable->build();
            $subject = $view_data->subject;
            $body = $view_data->viewData['body'];
    }
}

一部雰囲気で書いているため、完全動作は知らないけど、Mailable からの body の取得はこれで問題なし。