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
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