Learn How to Send an Email on Error Exceptions
Published on by Amit Gupta
You’ve created a new Laravel app for your client and deployed it on the production server. Everything was working fine till a customer has a problem with the app because of some buggy code. He immediately leaves the app, and the same thing happens with multiple customers before you know about the bug. You fix the bug, and then everything is on track.
But what if you were notified immediately through e-mail (or another service) about the bug and you fix it ASAP. In Laravel, this can be done easily and in this post, we’re going to learn how.
In Laravel, all exceptions are handled by the App\Exceptions\Handler
class. This class contains two methods: report
and render
. We’re only interested in report
method; it is used to log exceptions or send them to an external service like Bugsnag or Sentry. By default, the report method simply passes the exception to the base class where the exception is logged. However, we can use it to send an email to developers about the exception.
/** * Report or log an exception. * * This is a great spot to send exceptions to Emails. * * @param \Exception $exception * @return void */public function report(Exception $exception){ if ($this->shouldReport($exception)) { $this->sendEmail($exception); // sends an email } return parent::report($exception);} /** * Sends an email to the developer about the exception. * * @param \Exception $exception * @return void */public function sendEmail(Exception $exception){ // sending email}
Here we are using shouldReport
method to ignore exceptions which are listed in the $dontReport
property of the exception handler.
Each type of email sent by the application is represented as a “mailable” class in Laravel. So, we need to create our mailable class using the make:mail
command:
$ php artisan make:mail ExceptionOccured
This will create a class ExceptionOccured
in the app/Mail
directory.
Merely sending the mail will not solve the problem. We need the full stack trace of the exception. And for that, we can use the Symfony’s Debug component.
public function sendEmail(Exception $exception){ try { $e = FlattenException::create($exception); $handler = new SymfonyExceptionHandler(); $html = $handler->getHtml($e); Mail::to('developer@gmail.com')->send(new ExceptionOccured($html)); } catch (Exception $ex) { dd($ex); }}
Make sure you add the following code at the top of the file:
use Mail;use Symfony\Component\Debug\Exception\FlattenException;use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;use App\Mail\ExceptionOccured;
Note—We have used the try
block to avoid the infinite loop if the mail command fails.
Then, in your ExceptionOccured
mailer class:
<?php namespace App\Mail; use Illuminate\Bus\Queueable;use Illuminate\Mail\Mailable;use Illuminate\Queue\SerializesModels;use Illuminate\Contracts\Queue\ShouldQueue; class ExceptionOccured extends Mailable{ use Queueable, SerializesModels; /** * The body of the message. * * @var string */ public $content; /** * Create a new message instance. * * @return void */ public function __construct($content) { $this->content = $content; } /** * Build the message. * * @return $this */ public function build() { return $this->view('emails.exception') ->with('content', $this->content); }}
Add the following code in your emails.exception
view file:
{!! $content !!}
Now, whenever an exception is thrown in your application, you will receive an email with full stack trace. Cool!
I have created a Laravel package named squareboat/sneaker to do all this cumbersome work for you so you can concentrate on solving the bug.
Some of the features of the sneaker are:
– On/off emailing using .env
file.
– Customizing the email body.
– Ignoring the exception generated by bots.
and more to come.
If you want the complete source code for this, I’m more than happy to share it and you can find the source code on Github
Love to code, and have fun when helping others. At the moment I'm a big fan of Laravel framework and I am now what some would refer to as an "evangelist". I love to help others learn more about Laravel and get them started on the road to success. I hang out a LOT in #laravel on Stackoverflow. I've been developing the web and mobile apps and what not for roughly 2 years now and I am learning more all the time.