Laravel の Mailable を使ってメール送信機能を実装する方法

Laravel の Mailable を使ってメール送信機能を実装する方法 Laravel
記事内に広告が含まれています。

Laravel には、メール送信をするための Mailable クラスが用意されているので、こちらを使ってメール送信を行う方法について書いていきます!

Laravel の Mailable を使ってメール送信機能を実装する方法

Mailable クラスを作成する

Mailable クラスの作成に関しては、Laravel 側で artisan コマンドが用意されているので、そちらを使用して、Mailable クラスを作成します。

php artisan make:mail SystemAlert

上記コマンドを実行すると、app/Mail ディレクトリに配下に SystemAlert.php ファイルが作成されます。

中身は以下のようになっております。

<?php

namespace App\Mail;

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

class SystemAlert extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }
}

基本的には build メソッド内に、メール送信内容等を書いていきます。

メール本文を作成する

view メソッドを使用して、HTML メールを指定する方法と、text メソッドを使用して、テキストファイルを指定する方法がありますが、今回は SystemAlert で内部向けに送信するので、text メソッドを指定します。

views/mail 配下に systemAlert.blade.php を作成しました。

エラーメッセージ
{{ $exception->getMessage() }}

発生箇所
{{ $exception->getFile() }} line {{ $exception->getLine() }}

スタックトレース
{{ $exception->getTraceAsString() }}

今回は、Exception が発生した場合にメールを送信するため、メール内容にエラー内容を記載するようにしています。

併せて app/Mail/SystemAlert.php の build メソッド内も修正しておきます。

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->text('mail.systemAlert');
    }

メール送信元の指定をする

続いて、メール送信元の指定を行っていきます。

config/mail.php

"sys_alert" => [
        "from" => [
            "address" => env("SYS_ALERT_MAIL_FROM_ADDRESS"),
            "name"    => env("SYS_ALERT_MAIL_FROM_NAME")
        ]
]

app/Mail/SystemAlert.php

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view("mail.systemAlert")
                    ->from(config("mail.sys_alert.from.address"), config("mail.sys_alert.from.name"));
    }

メール件名やテキストファイルに渡す値の設定をする

続いて、メールの件名やテキストファイルに渡す値を設定していきます。

app/Mail/SystemAlert.php

    /**
     * Exception
     * 
     * @var Exception $exception
    */
    private $exception;
    
    /**
     * Create a new message instance.
     *
     * @param Exception $exception
     * @return void
     */
    public function __construct(Exception $exception)
    {
        $this->exception = $exception;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $env = app()->environment();
        $subject = "[{$env}]システムエラー";
        $data = [
            "exception" => $this->exception
        ];
        
        return $this->view("mail.systemAlert")
                    ->subject($subject)
                    ->from(config("mail.sys_alert.from.address"), config("mail.sys_alert.from.name"))
                    ->with($data);
    }

メールの件名に関しては、subject メソッドを使って指定することが可能です。開発環境・ステージ環境・本番環境のどの環境でのメール通知か分かるように件名には環境情報を記載してあげると良いです。

また、今回はシステムエラーの内容を通知するので、コンストラクタで Exception を受け取って、メンバ変数 $exception を設定しています。

build 内に記載している with メソッドで ビューファイルに渡す変数をセットしています。

メール送信ドライバの設定をする

Laravel で指定できるメール送信のドライバとしては以下があります。

ドライバ名説明
smtpSMTP サーバから送信する
sesAmazon SES から送信する
mailgunAPI ベースのメール送信サービスから送信する
postmarkmailgun と同様 API ベースのドライバ。
postmark ドライバを使用するためには、composer を介して postmark の SwiftMailer トランスポートをインストールする必要がある
sendmailPHP の mail 関数で送信する
log送信は行わずにログファイルに送信内容を書き込む
arrayロジック自体は通るが、送信はされない

今回は、sendmail を使います。

config/mail.php

'default' => env('MAIL_MAILER', 'sendmail'), // .envのMAIL_MAILERにもsendmailを指定

メールを送信する

最後に、Mail ファサードを使ってメール送信処理を書いていきます。

config/mail.php

"sys_alert" => [
        "from" => [
            "address" => env("SYS_ALERT_MAIL_FROM_ADDRESS"),
            "name"    => env("SYS_ALERT_MAIL_FROM_NAME")
        ],
        // 追加
        "to" => [
            "address" => env("SYS_ALERT_MAIL_TO_ADDRESS")
        ]
    ]

app/Http/Controllers/SampleController.php

<?php

namespace App\Http\Controllers;

use App\Mail\SystemAlert;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class SampleController extends Controller
{
    public function sample()
    {
        try {
            // 何らかの処理
        } catch (Exception $e) {
            Mail::to(config("mail.sys_alert.to.address"))->send(new SystemAlert($e));
        }
    }
}

これで sample メソッド内の catch 句で Exception を捕捉した場合に、メールが送信されます。

まとめ|Laravel の Mailable を使ってメール送信機能を実装する方法

ここまで、「Laravel の Mailable を使ってメール送信機能を実装する方法」について書いてきました。

Laravel では、メールを送信するクラスとして Mailable クラスが用意されているため、メール送信機能の実装に関しては、比較的簡単に実装することができますね!

Laravel関連のおすすめ本・Udemy講座

コメント

タイトルとURLをコピーしました