Laravel发送邮件操作流程笔记

官方文档描述比较全面,但是不够简洁以及没有操作流程,所以记录一下备忘。

本文是简单实用的快捷配置方式,使用smtp服务,具体需求看官方文档。

申请发件邮箱开启SMTP服务

以qq邮箱为例,授权码即使邮箱发送时验证的密码

网易163邮箱配置

以客户留言接收邮件通知为例 markdown邮件文档

//生成Mailables Markdown 邮件
php artisan make:mail CustomerFeedbackMail --markdown=emails.customer.feedback
如图会生成两个文件,然后编写代码

配置在浏览器中预览邮件 文档

//添加路由
Route::get('mailable', 'Pc\PageController@mailable');//预览mark邮件

//控制器方法
public function mailable(Request $request)
{
   return new CustomerFeedbackMail();
}

//简单编辑邮件模板feedback.blade.php
@component('mail::message')
# 邮件通知

The body of your message.

@component('mail::button', ['url' => ''])
进入官网后台管理
@endcomponent

@endcomponent

引入通知用到模型数据 文档

//预览页面控制器
class PageController extends Controller
{
    public function mailable(Request $request)
    {
        $message = Message::find(1);

        return new CustomerFeedbackMail($message);
    }
}

//邮件mailable
class CustomerFeedbackMail extends Mailable
{
    use Queueable, SerializesModels;

    public $message;

    public function __construct(Message $message)
    {
        $this->message = $message;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {   
        //emails.customer.feedback是视图文件目录和文件
        return $this->markdown('emails.customer.feedback', ['feedback' => $this->message])->subject('邮件标题');
    }
}

//邮件视图文件markdown
@component('mail::message')
# 客户留言通知
## 姓名:{{$feedback->name}},
## 电话:{{$feedback->mobile}},
## 留言:{{$feedback->content}},
## 提交终端:{{$feedback->terminal}},
## 提交页面名称:{{$feedback->page_name}},

@component('mail::button', ['url' => ''])
进入官网后台管理
@endcomponent

@endcomponent
预览效果

发送到指定邮箱 遍历收件人列表

//修改config/mail.php 配置,增加默认收件邮箱
'to' => [
   'address' => explode(',', env('MAIL_DEFAULT_TO_ADDRESS', '')),
   'name' => env('MAIL_TO_NAME', ''),
],

//修改env配置
MAIL_MAILER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=xxxx@qq.com
MAIL_PASSWORD=xxxx
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=xxx@qq.com
MAIL_FROM_NAME=xxx
MAIL_DEFAULT_TO_ADDRESS=xxx@foxmail.com
MAIL_TO_NAME=留言通知

//发送代码,此处使用terminable中间件延时发送
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use App\Mail\CustomerFeedbackMail;
use App\Models\Message;
class SendFeedbackMailTerminable
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        $response_data = json_decode($response->getContent(), true);

        if (!isset($response_data['data']['message_id']) || empty($response_data['data']['message_id'])) {
            return;
        }

        Log::info('留言id=>'.$response_data['data']['message_id']);

        $message = Message::find($response_data['data']['message_id']);

        if (!$message instanceof Message) {
            return;
        }

        $toAddress = config('mail.to.address');

        foreach ($toAddress  as $value) {
            try {
                Mail::to($value)->send(new CustomerFeedbackMail($message));
            } catch (\Throwable $th) {
                Log::channel('sendmail')->info('发送邮件失败'.$th->getMessage());
                continue;
            }

            Log::channel('sendmail')->info('[官网留言邮件通知记录]:', ['email' => $value, 'message_id' => $response_data['data']['message_id']]);
        }
    }
}