【问题标题】:Laravel Mail::send() sending to multiple to or bcc addressesLaravel Mail::send() 发送到多个 to 或 bcc 地址
【发布时间】: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() 至所有地址,这样收件人就不会看到邮件正在发送给谁。

【问题讨论】:

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

标签: php email laravel laravel-4


【解决方案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 的工作代码是......我实际上将创建我的答案,因为它在这里看起来很乱。但请随时将我的答案添加到您接受的答案中。我的回答:stackoverflow.com/a/39734742/533426
          • 在 Laravel 5.6 中测试,一切正常。但是需要创建数组,如果您要从另一个表中提取电子邮件数据,请将 foreacharray_push 运行到新数组。
          猜你喜欢
          • 2017-10-18
          • 2020-10-30
          • 1970-01-01
          • 2011-09-12
          • 2014-03-19
          • 2013-08-27
          • 2016-04-07
          • 2011-07-03
          • 2012-10-18
          相关资源
          最近更新 更多