我可以发送单个电子邮件,但是当涉及多个电子邮件时,作业类无法将其发送给多个用户。
以下代码运行正常并向一位用户发送电子邮件
$email = new Report($this->user);
Mail::to($this->user->email)->queue($email);
即使对电子邮件进行硬编码也是如此
$email = new Report($this->user);
Mail::to("example@hello.com")->queue($email);
但是,当我传递多个或一组电子邮件时,作业失败:
$email = new Report($this->user);
$all_admin = User::select('email')->where('role',2)->get()->pluck('email')->toArray();
$all_admins = json_encode($all_admin, true);
Mail::to($all_admins )->queue($email);
此代码在句柄函数的App \ Jobs \ ReportAdmin文件中编写。
我在没有使用作业的情况下发送了一系列电子邮件
类似的东西:
Mail::send('emails.report', ['firstname'=>$firstname,'lastname'=>$lastname], function ($message)
{
$message->from('hello@example.com', 'auto-reply email');
$message->to($all_admins);
$message->subject('subject');
});
答案 0 :(得分:1)
尝试改变这一点:
$all_admins = json_encode($all_admin, true);
为此:
$all_admins = implode(';', $all_admin);
这应该为您提供有效的字符串格式。
修改强>
您也可以尝试使用itteration:
$email = new Report($this->user);
$all_admin = User::select('email')->where('role',2)->get()
->pluck('email')->toArray();
$all_admins = json_encode($all_admin, true);
foreach ($all_admin as $admin) {
Mail::to($admin)->queue($email);
}
这是更好的解决方案,因为每封电子邮件都将由一份作业发送。
答案 1 :(得分:1)
来自文档
要发送邮件,请使用Mail Facade上的to方法。 to方法接受电子邮件地址,用户实例或用户集合。
这样做。
$email = new Report($this->user);
$admins = User::select('email')->where('role', 2)->get();
Mail::to($admins)->queue($email);
这是引擎盖下发生的事情。如果您想使用不同的方式加载电子邮件列表。
public function to($address, $name = null)
{
return $this->setAddress($address, $name, 'to');
}
protected function setAddress($address, $name = null, $property = 'to')
{
foreach ($this->addressesToArray($address, $name) as $recipient) {
$recipient = $this->normalizeRecipient($recipient);
$this->{$property}[] = [
'name' => isset($recipient->name) ? $recipient->name : null,
'address' => $recipient->email,
];
}
return $this;
}
protected function addressesToArray($address, $name)
{
if (! is_array($address) && ! $address instanceof Collection) {
$address = is_string($name) ? [['name' => $name, 'email' => $address]] : [$address];
}
return $address;
}
protected function normalizeRecipient($recipient)
{
if (is_array($recipient)) {
return (object) $recipient;
} elseif (is_string($recipient)) {
return (object) ['email' => $recipient];
}
return $recipient;
}
答案 2 :(得分:0)
我使用了for循环,它可以工作。
不知道这是否是解决此问题的最佳方式。
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$email = new Report($this->user);
$all_admin = User::select('email')->where('role',2)->get()->pluck('email')->toArray();
$count = count($all_admin);
for($i = 0; $i<$count; $i++)
{
Mail::to($all_admin[$i])->queue($email);
}
}