Laravel Mail :: send()发送到多个或bcc地址

时间:2014-10-27 09:55:40

标签: php email laravel laravel-4

使用Laravel的Mail::send()回调时,我似乎无法成功发送到多个地址,但是当我只指定一个时,代码可以正常工作收件人。

我尝试过链接:

// for example
$emails = array("myemail1@email.com", "myemail2@email.com");
$input = Input::all();

Mail::send('emails.admin-company', array('body' => Input::get('email_body')), 
function($message) use ($emails, $input) {
    $message
    ->from('admin@admin.org', 'Administrator')
    ->subject('Admin Subject');

        foreach ($emails as $email) {
            $message->to($email);
        }
});

并传递一个数组:

// for example
$emails = array("myemail1@email.com", "myemail2@email.com");
$input = Input::all();

Mail::send('emails.admin-company', array('body' => Input::get('email_body')), 
    function($message) use ($emails, $input) {
        $message
        ->from('admin@admin.org', 'Administrator')
        ->subject('Admin Subject');

        $message->to($emails);
});

但似乎都没有工作,我在返回Mail :: failures()时收到失败消息,Mail :: failures()的var_dump()显示我尝试发送到的电子邮件地址,例如:

array(2) {
  [0]=>
  string(18) "myemail1@email.com"
  [1]=>
  string(18) "myemail2@email.com"
}

显然做错了什么,我会很感激任何帮助,因为我不理解API:http://laravel.com/api/4.2/Illuminate/Mail/Message.html#method_to

我意识到我可以将Mail::send()方法放在for / foreach循环中,并将Mail::send()放在每个电子邮件地址中,但这对我来说并不是最佳解决方案,我是希望一旦一切正常,我也能够->bcc()到所有地址,这样收件人就不会看到邮件发送给谁了。

11 个答案:

答案 0 :(得分:86)

我已使用以下代码对其进行了测试:

$emails = ['myoneemail@esomething.com', 'myother@esomething.com','myother2@esomething.com'];

Mail::send('emails.welcome', [], function($message) use ($emails)
{    
    $message->to($emails)->subject('This is test e-mail');    
});
var_dump( Mail:: failures());
exit;

结果 - 失败的空数组。

但当然您需要正确配置app/config/mail.php。因此,首先要确保您只能向一个用户发送电子邮件,然后与许多用户一起测试您的代码。

此外,使用这个简单的代码,我的电子邮件都没有发送到免费邮箱帐户,我只收到了我收费主机帐户收件箱的电子邮件,所以可能是他们被一些过滤器抓住了(它是#;;可能是简单的主题/内容问题,但我提到它只是为了你还没有收到一些电子邮件)。

答案 1 :(得分:15)

如果您想同时向所有管理员发送电子邮件,您可以执行以下操作:

在.env文件中,将所有电子邮件添加为逗号分隔值:

ADMIN_EMAILS=admin1@site.com,admin2@site.com,admin3@site.com

所以当您要发送电子邮件时,请执行此操作(是的!消息构建器实例的'to'方法接受数组):

所以,

$to = explode(',', env('ADMIN_EMAILS'));

和...

$message->to($to);

现在将邮件发送给所有管理员。

答案 2 :(得分:9)

接受的答案 不再使用laravel 5.3工作,因为mailable尝试访问->email并导致

  

Mailable.php第376行中的ErrorException:尝试获取属性   非对象

laravel 5.3的工作代码是:

$users_temp = explode(',', 'first@example.com,second@example.com');
    $users = [];
    foreach($users_temp as $key => $ut){
      $ua = [];
      $ua['email'] = $ut;
      $ua['name'] = 'test';
      $users[$key] = (object)$ua;
    }
 Mail::to($users)->send(new OrderAdminSendInvoice($o));

答案 3 :(得分:5)

使用Laravel 5.6,如果要传递多个带有名称的电子邮件,则需要传递关联数组数组。将多个收件人推送到$to数组的示例:

$to[] = array('email' => $email, 'name' => $name);

修正了两位收件人:

$to = [['email' => 'user.one@example.com', 'name' => 'User One'], 
       ['email' => 'user.two@example.com', 'name' => 'User Two']];

'名称'密钥不是强制性的。您可以将其设置为'name' => NULL或不添加到关联数组,然后只会使用'email'

答案 4 :(得分:1)

您可以像这样循环遍历收件人:

foreach (['taylor@example.com', 'dries@example.com'] as $recipient) {
    Mail::to($recipient)->send(new OrderShipped($order));
}

请参阅文档here

答案 5 :(得分:0)

这很好用 - 我可以访问请求对象和电子邮件数组

        $emails = ['tester@blahdomain.com', 'anotheremail@blahdomian.com'];
        Mail::send('emails.lead', ['name' => $name, 'email' => $email, 'phone' => $phone], function ($message) use ($request, $emails)
        {
            $message->from('no-reply@yourdomain.com', 'Joe Smoe');
//            $message->to( $request->input('email') );
            $message->to( $emails);
            //Add a subject
            $message->subject("New Email From Your site");
        });

答案 6 :(得分:0)

以下解决方案允许您同时将一封电子邮件发送到多个地址。它在 Laravel 5.4及更高版本中可以正常使用。 例如,如果以下电子邮件地址是您想要的收件人,请说: 'dunsin.olubobokun@domain.com','paul.yomi@domain.com','stack.overflow@domain.com','abc.xyz@domain.com','def.ghi@domain。 com'

Mail::to('dunsin.olubobokun@domain.com')
    ->cc(['paul.yomi@domain.com','stack.overflow@domain.com','abc.xyz@domain.com','def.ghi@domain.com'])
    ->send(new document());

其中 document 是可以进一步自定义电子邮件的任何类。

答案 7 :(得分:0)

我正在使用Laravel 5.6和Notifications Facade。

如果我设置了一个用逗号分隔电子邮件的变量并尝试发送它,则会收到错误消息: “给定邮件中的地址不符合RFC 2822,3.6.2”

因此,为了解决该问题,我从@Toskan那里获得了解决方法,并编写了以下代码。

        // Get data from Database
        $contacts = Contacts::select('email')
            ->get();

        // Create an array element
        $contactList = [];
        $i=0;

        // Fill the array element
        foreach($contacts as $contact){
            $contactList[$i] = $contact->email;
            $i++;
        }

        .
        .
        .

        \Mail::send('emails.template', ['templateTitle'=>$templateTitle, 'templateMessage'=>$templateMessage, 'templateSalutation'=>$templateSalutation, 'templateCopyright'=>$templateCopyright], function($message) use($emailReply, $nameReply, $contactList) {
                $message->from('myemail@somecompany.com', 'Some Company Name')
                        ->replyTo($emailReply, $nameReply)
                        ->bcc($contactList, 'Contact List')
                        ->subject("Subject title");
            });

发送给一个或多个收件人对我来说很有效。

答案 8 :(得分:0)

尝试一下:

$toemail = explode(',', str_replace(' ', '', $request->toemail));

答案 9 :(得分:0)

这就是我在我的多供应商电子商务项目之一中所做的。

$vendorEmails[0]    =    'myemail@gmail.com';
    foreach ($this->order->products as $orderProduct){
        $vendorEmails[$count] = \App\User::find($orderProduct->user_id)->email;
        $count++;
    }

    return $this->from('from_email_@gmail.com', 'Made In India')
        ->to($this->order->billing_email, $this->order->billing_first_name . ' ' . $this->order->billing_last_name)
        ->bcc('bcc@email.com')
        ->cc($vendorEmails)
        ->subject('Order Placed Successfully - Made In India - ' . $this->order->generated_order_id)
        ->markdown('emails.orderplaced');
}

答案 10 :(得分:-10)

对我很好, 如果你有一个字符串,那么先简单地爆炸它。

$ emails = array();

Mail::send('emails.maintenance',$mail_params, function($message) use ($emails) {
    foreach ($emails as $email) {
        $message->to($email);
    }

    $message->subject('My Email');
});