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

Posted

技术标签:

【中文标题】Laravel Mail::send() 发送到多个 to 或 bcc 地址【英文标题】:Laravel Mail::send() sending to multiple to or bcc addresses 【发布时间】:2014-12-22 11:23:38 【问题描述】:

使用 Laravel 的 Mail::send() 回调时,我似乎无法成功发送到 多个 地址,但是当我只指定 一个 收件人时,该代码确实有效。 p>

我尝试过链接:

// 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() 至所有地址,这样收件人就不会看到邮件正在发送给谁。

【问题讨论】:

显示更多代码。您是否尝试过在那里插入现有的电子邮件。您收到了哪些失败消息? 现有电子邮件是什么意思?如果这就是您的意思,我会将其发送到有效的电子邮件地址?将添加更多带有失败消息的代码。谢谢。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

你可以像这样循环接收者:

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

参见文档here

【讨论】:

【参考方案3】:

试试这个:

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

【讨论】:

【参考方案4】:

如果您打算在一个实例中将一封电子邮件推送给不同的收件人(即抄送多个电子邮件地址),下面的解决方案适用于 Laravel 5.4 及更高版本

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

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

【讨论】:

【参考方案5】:

我正在使用 Laravel 5.6 和通知外观。

如果我设置了一个用逗号分隔电子邮件的变量并尝试发送它,我会收到错误消息: "给定邮件中的地址不符合 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");
            );

我可以发送给一个或多个收件人。 ?

【讨论】:

您可以将其作为 Contacts::pluck('email')->toArray() 而不是创建一个数组元素【参考方案6】:

在 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'

【讨论】:

它给了我这个错误:Address in mailbox given [email] does not comply with RFC 2822, 3.6.2.【参考方案7】:

接受的答案在 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));

【讨论】:

感谢您的回答。节省了我很多时间和悲伤。这种改变是故意的吗,因为对于应该非常简短的东西来说,它似乎有太多的代码。我正在使用变量 $to = [(object) ['name' => 'Example Name', 'email' => 'test@example.com'], (object) ['name' => 'Example Name 2', 'email' => 'test2@example.com']]; 定义我的 to() 函数【参考方案8】:

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

        $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");
        );

【讨论】:

我怎样才能使用$message->to($emails); 但包括recipents的名字? @JCarlos 将电子邮件作为关联数组的键,['email@email.com' => 'Joe', 'email2@email.com' => 'Jack']【参考方案9】:

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

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

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

因此,当您要发送电子邮件时,只需这样做(是的!消息构建器实例的“to”方法接受一个数组):

所以,

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

还有……

$message->to($to);

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

【讨论】:

.env 文件使用的最佳答案 你不应该直接引用 ENV - 使用配置助手。 最佳答案在这里。 有两种方法可以在不更改代码的情况下更改电子邮件地址。您可以使用 .env 文件或通过 Eloquent / table,但对于后者,您需要考虑表结构,因此 .env 是最简单直接的。【参考方案10】:

它对我很好, 如果您有字符串,则只需先将其炸开。

$emails = array();

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

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

【讨论】:

这将向 N 个收件人发送 N 封电子邮件。目标是向 N 个收件人发送 1 封电子邮件。 ^ 为此,使用@Grant 在下面的答案中提到的关联数组['email@email.com' => 'Joe', 'email2@email.com' => 'Jack']【参考方案11】:

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

$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。因此,首先确保您可以只向一个用户发送电子邮件,然后与多个用户一起测试您的代码。

此外,使用这个简单的代码,我的电子邮件都没有发送到免费邮件帐户,我只收到电子邮件到我的付费托管帐户上的收件箱,所以它们可能被一些过滤器捕获(这可能是简单的主题/内容问题,但我提到它是为了以防您没有收到一些电子邮件)。

【讨论】:

感谢您的回复。显然我没有做错任何事情,但是我的工作 IP 无法在我们的域之外中继电子邮件!一切都已排序并正在工作。再次感谢。 @haakym 这就是为什么如果某些东西不起作用,您应该始终尝试使用最简单的代码并确保它可以正常工作。问题通常不是你期望的。 如果我想在某处写下收据的名称,我该怎么做? 这确实 not 不再适用于 laravel 5.3,因为 mailable 尝试访问 ->email 并导致 ErrorException in Mailable.php line 376: Trying to get property of non-object laravel 5.3 的工作代码是......我实际上将创建我的答案,因为它在这里看起来很乱。但请随时将我的答案添加到您接受的答案中。我的回答:***.com/a/39734742/533426 在 Laravel 5.6 中测试,一切正常。但是需要创建数组,如果您要从另一个表中提取电子邮件数据,请将 foreacharray_push 运行到新数组。

以上是关于Laravel Mail::send() 发送到多个 to 或 bcc 地址的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Laravel 5.3 - Mail::send 现在从 Mandrill 返回 null

通过 Madrill SMTP 发送 Laravel 4 电子邮件

Laravel 在不使用 foreach 循环的情况下发送单独的多封邮件

设置山魈模板 Laravel

当我在 laravel 中发送邮件时发送 Html 标签

Laravel邮件密送