Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Aprenda Como Enviar E-mail em Caso de Exceptions no Laravel

Aprenda Como Enviar E-mail em Caso de Exceptions no Laravel

Algo muito importante em ambiente de produção é monitorar com detalhes eventuais erros na aplicação que podem ocorrer.

Por mais que desenvolva uma aplicação em Laravel bem organizada, com testes e etc, eventualmente ainda pode passar algo despercebido e gerar erros em produção, e uma das maneiras de minimizar os problemas é avisar a equipe de desenvolvimento do erro para que as correções sejam aplicadas o quanto antes.

E nesse tutorial vou mostrar como receber reportagens com detalhes dos erros gerados, diretamente no seu e-mail.

 
 

Reportar Erros no Laravel por E-mail:

Na classe de exception Handler (app/Exceptions/Handler.php) no método report() vamos interceptar os erros para envia-los por e-mail.

/**
 * Report or log an exception.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    if ($this->shouldReport($exception)) {
        $this->sendEmailException($exception); // send email exception
    }

    parent::report($exception);
}

 

Agora precisamos criar o método sendEmailException() para enviar o e-mail em caso de erros (exceptions). Mas, precisamos pegar o conteúdo e converter para HTML, para a mensagem esteja visualmente legível para leitura da equipe de suporte que vai receber o e-mail de exception.

/**
 * Sends an email to the developer about the exception.
 *
 * @param  \Exception  $exception
 * @return void
 */
public function sendEmailException(Exception $exception)
{
    try {
    	// Converte message to HTML
        $e = FlattenException::create($exception);
        $handler = new SymfonyExceptionHandler();
        $html = $handler->getHtml($e);

        // Send Mail Exception
        Mail::to('[email protected]')->send(new ExceptionOccuredMail($html));
    } catch (Exception $ex) {
        Log.error($ex);
    }
}

PS. Não pode esquecer de usar as classes:

use Log;
use App\Mail\ExceptionOccuredMail;
use Mail;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
use Symfony\Component\Debug\Exception\FlattenException;

 

Note que estamos usando a classe de e-mail ExceptionOccuredMail, mas a mesma ainda não foi criada, precisamos criar, para isso rode este comando:

php artisan make:mail ExceptionOccuredMail

Agora na classe ExceptionOccuredMail (app/Mail/ExceptionOccuredMail.php) precisamos implementar para enviar o e-mail com exception, veja como fica:

namespace App\Mail;

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

class ExceptionOccuredMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * The body of the message.
     *
     * @var string
     */
    private $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')
                    ->subject('Novo erro! :-(')
                    ->with('content', $this->content);
    }
}

 

Agora precisa criar a view com o conteúdo do erro em resources/views/emails/exception.blade.php

O conteúdo da view deve ser:

{!! $content !!}

 

No arquivo .env mesmo que altere as configurações de ambiente, indicando que a aplicação está operando em produção vai enviar o erro detalhando para o e-mail: [email protected]:

APP_ENV=production
APP_DEBUG=false

PS. Para testar o envio de e-mails em ambiente local sugiro que teste com o Mailtrap.io (Leia esse tutorial sobre).

 
 

Enviar E-mails Exceptions com Filas

Um ponto importante sobre esse envio de e-mails é porque o processo de envio de e-mails é pesado, e além de gerar um erro vai travar a aplicação por um bom tempo, até que seja finalizado o envio.

Para resolver isso precisamos fazer o envio deste e-mail com filas (Queues) para não travar a aplicação até que o processo de envio do e-mail seja finalizado.

Como não é o objetivo não vou entrar em detalhes sobre Queues nesse tutorial, apenas vamos desfrutar do recurso.

Uma rápida configuração de queues seria, criar a migration:

php artisan queue:table

Criar a tabela a partir da migration:

php artisan migrate

Definir no arquivo .env que o tipo de queue é controlado por database:

QUEUE_DRIVER=database

Na classe de e-mail ExceptionOccuredMail (app/Mail/ExceptionOccuredMail.php) vamos usar o recurso de Queue, para isso basta fazer a classe ExceptionOccuredMail implementar a interface ShouldQueue

E para testar o envio do exception com fila (Queue) basta rodar o comando:

php arisan queue:work

 

Para testar crie uma rota que usa uma view que não existe, por exemplo:

Route::view('/test-error-report', 'view-not-found');

Ao acessar o projeto http://localhost:8000/test-error-report será enviando um e-mail com a exception, detalhando que a view view-not-found não foi encontrada. Faça o teste!

 

Referência: https://laravel-news.com/email-on-error-exceptions

 

Finalizamos aqui, espero que tenha gostado e qualquer dúvida já sabe, só deixar aquele comentário! 🙂

 

Abraços []’s

 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.