官方文档描述比较全面,但是不够简洁以及没有操作流程,所以记录一下备忘。
本文是简单实用的快捷配置方式,使用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']]);
}
}
}