Laravelでエラーをメールで飛ばす

投稿者: | 2020年1月14日

エラーの通知というと、最近はslackなんかに飛ばすのが主流で、Laravelでもすごく簡単に対応することができます。
しかし、セキュリティの問題などで、そんな今時な方法は使えないという方もいらっしゃると思いますので、メールで通知する方法をご紹介です。

下記のページを参考にしました。
Laravel エラーレポートメールを送信する

Laravelのエラーをメールで飛ばすには、エラーが発生したときにエラーをキャッチするクラスを修正することになります。
そのクラスは下記のものです。
app\Exceptions\Handler.php

このクラスの中の report(Exception $exception) というメソッドを修正します。
引数の $exception にはエラーについての情報がセットされていますので、それらの情報を通知メールに記載します。

Exceptionクラスについての詳しい情報は下記のページをご参照ください。
https://www.php.net/manual/ja/class.exception.php

実際に修正したHandler.phpは次のようになります。。

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Mail\Message;  // 追加
use Mail;  // 追加

class Handler extends ExceptionHandler
{

(中略)

    public function report(Exception $exception)
    {
        if ($exception instanceof \Exception) {

            // エラーに関係する情報を取得
            $error['message'] = $exception->getMessage();
            $error['url']     = url()->current();
            $error['file']    = $exception->getFile();
            $error['line']    = $exception->getLine();
 
            if(ENV('APP_ENV') == "production"){
                // 本番環境のとき

                // メールを送信
                Mail::send(['text' => 'emails.exception_notif'], ["e" => $error],
                    function(Message $message) {
                        $message
                            ->to('alert@example.com')
                            ->from('webmaster@example.com')
                            ->subject('laravel error');
                    }
                );
            }
        }

        parent::report($exception);
    }

メールテンプレートである emails.exception_notify は次のようになります。必要に応じて、内容は書き換えてください。

エラーが発生しました

Message:
{{ $e['message'] }}

URL:
{{ $e['url'] ?? '' }}

File:
{{ $e['file'] }}

Line:
{{ $e['line'] }}

以上となります。
これで知らないうちにエラーが発生していたなんてことはなくなります!