/**
* email内容。
*/
public $message;
要将$message
设置为public属性。protected是获取不到的。
采用队列发送email,存在模板不能获取到mail类的message数据的问题。我做了2个测试,
第一个测试,用queue推送到默认队列
PhotoNotice.php是mail类
<?php
/*
* This file is part of PHP CS Fixer.
* (c) Fabien Potencier <fabien@symfony.com>
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class PhotoNotice extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* email内容。
*/
public $message;
/**
* Create a new message instance.
*/
public function __construct($member)
{
$this->message = $member;
}
/**
* Set the recipients of the message.
*
* @param object|array|string $address
* @param string|null $name
* @return $this
*/
public function to($address, $name = null)
{
if (config('app.debug')) {
$temp_testing_email = config('commonsystem_constant.TESTING_EMAIL');
if (!empty($temp_testing_email)) {
$testing_email = explode(',', $temp_testing_email);
return $this->setAddress($testing_email, $name, 'to');
}
} else {
return $this->setAddress($address, $name, 'to');
}
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->subject('查找圖片通知')->view('emails.photo.notice')->with(['name'=>$this->message->name]);
}
}
email模板文件
<!DOCTYPE html>
<html lang="{{ config('app.locale') }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
<div class="flex-center position-ref full-height">
<div style='margin-bottom:20px;'>你好:@isset($name) {{$name}} @endisset<br>
<br>{{config("app.name")}} 系統為你查找到你參與活動的照片,請登入系統查看<br>
<br>
請點擊以下地址訪問。<br><br>
<a href="{{config('app.url')}}" target='_blank'>{{config("app.url")}}</a>
<br>
<div style='width:700px;margin:0;margin-top:20px;color:#8a8a8a;'>
<p>此為系統郵件,請勿回覆。</p>
</div>
<BR><BR>{{config("app.name")}} 管理員
</div>
</div>
</body>
</html>
第一个测试:
public function testSendEmail()
{
$member_rep = new MemberRepository();
$member = $member_rep->getById(7);
$photo_notice = new PhotoNotice($member);
\Mail::to("davidhuang@nmg.com.hk", 'davidhuang')->queue($photo_notice);
$this->assertTrue(true);
}
发现上述email不会加入到jobs表中,并没有经过队列发送,而是实时发送,模板可以获取到name的数据。
第二个测试
public function testSendEmail()
{
$member_rep = new MemberRepository();
$member = $member_rep->getById(7);
$photo_notice = (new PhotoNotice($member))
->onConnection('database')
->onQueue('emails');
\Mail::to("davidhuang@nmg.com.hk", 'davidhuang')->queue($photo_notice);
$this->assertTrue(true);
}
第二个测试会将队列加入jobs表中,要经过supervisor执行才会执行,模板无法获取到name。
如果将第二个测试中的 ->onQueue('emails');去掉,也是会加入到db的jobs表中的,也就是说,->onConnection('database')才是真正队列实现的关键。我们来看下mailable的源码
/**
* Queue the message for sending.
*
* @param \Illuminate\Contracts\Queue\Factory $queue
* @return mixed
*/
public function queue(Queue $queue)
{
if (property_exists($this, 'delay')) {
return $this->later($this->delay, $queue);
}
$connection = property_exists($this, 'connection') ? $this->connection : null;
$queueName = property_exists($this, 'queue') ? $this->queue : null;
return $queue->connection($connection)->pushOn(
$queueName ?: null, new SendQueuedMailable($this)
);
}
如果没定义$connection,是马上执行的。定义后,就会在db的jobs新增一条job,再手动执行
php artisan queue:work database
则会执行已有的jobs。执行后,收到的email是带有name数据的。
使用supervisor也同样可以执行,name可以获取到。但是需要注意的是,supervisor修改后单单reload或者stop,start是不够的,一定要reread,update,stop,start
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl stop race_photo
sudo supervisorctl start race_photo
2018-08-31 今天又遇到email无法读取message的问题
首先,执行
php artisan cache:clear
php artisan view:clear
还是获取不到。然后我想调试下代码,结果不论是保存到DB还是写入Log都无效,不会生效。搞了很久发现,因为我用了supervisor执行mail的定时任务,修改完代码必须repload supervisor才能生效。mail的message属性可以是数据,collect,eloquent等等。
<?php
/*
* This file is part of PHP CS Fixer.
* (c) Fabien Potencier <fabien@symfony.com>
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class PhotoNotice extends Mailable
{
use Queueable, SerializesModels;
/**
* email内容。
*/
public $message;
/**
* Create a new message instance.
*
* @param mixed $member
*/
public function __construct($name, $url)
{
$this->message = collect(['name'=>$name, "url"=>$url]);
}
/**
* Set the recipients of the message.
*
* @param object|array|string $address
* @param string|null $name
*
* @return $this
*/
public function to($address, $name = null)
{
if (config('app.debug')) {
$temp_testing_email = config('commonsystem_constant.TESTING_EMAIL');
if (!empty($temp_testing_email)) {
$testing_email = explode(',', $temp_testing_email);
return $this->setAddress($testing_email, $name, 'to');
}
} else {
return $this->setAddress($address, $name, 'to');
}
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->subject('查找圖片通知')->view('emails.photo.notice')->with(['name'=>$this->message->get("name"),
'url'=>$this->message->get("url")]);
}
}
网友评论