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 中测试,一切正常。但是需要创建数组,如果您要从另一个表中提取电子邮件数据,请将 foreach
和 array_push
运行到新数组。以上是关于Laravel Mail::send() 发送到多个 to 或 bcc 地址的主要内容,如果未能解决你的问题,请参考以下文章
升级到 Laravel 5.3 - Mail::send 现在从 Mandrill 返回 null
通过 Madrill SMTP 发送 Laravel 4 电子邮件