将电子邮件数组传递给Job class Mail :: to

时间:2017-05-20 19:05:44

标签: php arrays email laravel-5 laravel-5.4

我可以发送单个电子邮件,但是当涉及多个电子邮件时,作业类无法将其发送给多个用户。

以下代码运行正常并向一位用户发送电子邮件

$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');
        });

3 个答案:

答案 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);
    }
}