laravel搭建bug邮件报警

概述

利用laravel邮件发送机制,制作一个邮件报警功能,在例如支付,授权,结算等一些敏感位置对错误异常信息进行即时邮件报警,将错误数据发送给开发者,即时解决bug。

安装配置

官方文档:https://laravel.com/docs/5.5/mail#previewing-mailables-in-the-browser

Mailgun和SparkPost这样基于API的驱动程序通常比SMTP服务器更简单快捷。如果可能的话,你应该使用这些驱动程序之一。所有的API驱动程序都需要Guzzle HTTP库,可以通过Composer软件包管理器

composer require guzzlehttp/guzzle   //要用Mailgun,需安装这个包,

 

配置 config/mail.php 文件

return [
  'driver' => env('MAIL_DRIVER', 'smtp'),  用于配置邮件发送驱动,
  'host' => env('MAIL_HOST', 'smtp.163.com'),//是邮箱所在主机,比如我们使用163邮箱,对应值是smtp.163.com,使用QQ邮箱的话,对应值是smtp.qq.com'port' => env('MAIL_PORT', 25),//用于配置邮箱发送服务端口号,比如一般默认值是25,但如果设置SMTP使用SSL加密,该值为465。
 'from' => ['address' => 'shao19920426@163.com','name' => '发件人'], //如果你用的网易或者qq 的邮箱服务,你这个发件人邮箱必须和下面的邮箱账号相同
  'encryption' => env('MAIL_ENCRYPTION', 'tls'),//表示加密类型,可以设置为null表示不使用任何加密,也可以设置为tls或ssl
 'username' => env('MAIL_USERNAME'), //你的邮箱账号 'password' => env('MAIL_PASSWORD'), //你的秘钥(授权码)
 'sendmail' => '/usr/sbin/sendmail -bs', //是在设置driver为sendmail时使用,用于指定sendmail命令路径。 ] //注意你对应的.env若配置,这儿配置无效

 

制作邮件模板

生成一个邮件发送类文件

php artisan make:mail OrderShipped

文件app\Mail\OrderShipped.php

<?php

namespace App\Mail;

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

class OrderShipped extends Mailable 
//class OrderShipped extends Mailable implements ShouldQueue   //加上该接口就是队列发送, 确保你的队列已正常启用
{
    use Queueable, SerializesModels;

    public $_err;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(\Exception $e,$title='恭喜你出bug了')
    {

        $data = [
            'msg' => $e->getMessage(),
            'code' => $e->getCode(),
            'file' => $e->getFile(),
            'line' => $e->getLine(),
        ];
        $this->_err = $data;
        $this->subject = $title;
    }

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

模板文件 resource/mail/test.blade.php

<!DOCTYPE html>
<html>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<head>
    <style>
        .list-group {
            padding-left: 0;
            margin-bottom: 20px;
        }

        .list-group-item {
            position: relative;
            display: block;
            padding: 10px 15px;
            margin-bottom: -1px;
            background-color: #fff;
            border: 1px solid #ddd;
        }

        .code {
            color: red;
        }

        .col-md-12 {
            width: 100%;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            <div class="list-group">
                <span class="list-group-item code">错误码:{{$code}}</span>
                <span class="list-group-item code">错误内容:{{$msg}}</span>
                <span class="list-group-item code">错误文件:{{$file}}</span>
                <span class="list-group-item code">错误行数:{{$line}}</span>
                {{--                <img class="list-group-item" src="{{$message->embed($img)}}">--}}
            </div>
        </div>
    </div>
</div>
</body>
</html>

发送邮件

测试控制器

<?php

namespace App\Http\Controllers;

use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Shaozeming\Push\PushManager;

class HomeController extends Controller
{
    public function index()
    {
        try{
            // 你的操作.....
        
        }catch (\Exception $e){
            Mail::to('shao19920426@163.com')->send(new OrderShipped($e));
            $res = Mail::failures();
            Log::info($res,[__METHOD__]);
        }
    }

邮件示例:

 

结语提示:

利用第三方免费的邮件服务器,如163和qq,我们给其它邮箱发送邮件容易被当成垃圾邮件处理,甚至被退回,无法送达,这个目前无解,若有需求,你可以选择一些收费的邮件服务或者自己搭建,以保送达率。

如果你只是报bug ,你可以像我这样,将收件人和发件人都是你自己,这样就一定能送达。