it-roy-ru.com

Laravel Mail :: send () отправка на несколько адресов или скрытых адресов

Кажется, я не могу успешно отправить на несколько адресов при использовании обратного вызова Mail::send() от Laravel, однако код работает, когда я указываю только one получателя.

Я пробовал цепочку:

// for example
$emails = array("[email protected]", "[email protected]");
$input = Input::all();

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

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

и передавая массив:

// for example
$emails = array("[email protected]", "[email protected]");
$input = Input::all();

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

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

но ни один из них не работает, и я получаю сообщения об ошибках при возврате Mail :: failures (), var_dump () из Mail :: failures () показывает адреса электронной почты, на которые я пытался отправить, например:

array(2) {
  [0]=>
  string(18) "[email protected]"
  [1]=>
  string(18) "[email protected]"
}

Ясно, что делаю что-то не так, буду признателен за любую помощь, так как я тоже не понимаю API: http://laravel.com/api/4.2/Illuminate/Mail/Message.html#method_to

Я понимаю, что мог бы поместить метод Mail::send() в цикл for/foreach и Mail::send() для каждого адреса электронной почты, но это не кажется мне оптимальным решением, я надеялся, что смогу также ->bcc() для всех адресов, как только работал, чтобы получатели не видели, кому еще отправляется письмо.

47
haakym

Я проверил это, используя следующий код:

$emails = ['[email protected]', '[email protected]','[email protected]'];

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. Поэтому сначала убедитесь, что вы можете отправить электронную почту только одному пользователю, а затем протестируйте свой код со многими пользователями. 

Более того, с помощью этого простого кода ни одно из моих электронных писем не было доставлено на бесплатные почтовые учетные записи, я получал только электронные письма на входящие почтовые ящики, которые у меня есть на моих учетных записях платного хостинга, поэтому, вероятно, они были перехвачены некоторыми фильтрами (возможно, это простая тема/контент, но Я упоминал об этом только на тот случай, если вы не получили несколько писем).

85
Marcin Nabiałek

Если вы хотите отправлять электронные письма одновременно всем администраторам, вы можете сделать что-то вроде этого:

В вашем файле .env добавьте все электронные письма в виде значений, разделенных запятыми:

[email protected],[email protected],[email protected]

поэтому, когда вы собираетесь отправить письмо, просто сделайте это (да! метод 'to' экземпляра построителя сообщений принимает массив):

Так,

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

а также...

$message->to($to);

теперь будет отправлять почту всем админам.

15
Abhishek

принятый ответ не работает не больше работает с laravel 5.3, потому что mailable пытается получить доступ к ->email и приводит к 

ErrorException в строке 376 Mailable.php: Попытка получить свойство не-объект

рабочий код для Laravel 5.3 это: 

$users_temp = explode(',', '[email protected],[email protected]');
    $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));
9
Toskan

В Laravel 5.6, если вы хотите передать несколько электронных писем с именами, вам нужно передать массив ассоциативных массивов. Пример помещения нескольких получателей в массив $to:

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

Исправлено два получателя:

$to = [['email' => '[email protected]', 'name' => 'User One'], 
       ['email' => '[email protected]', 'name' => 'User Two']];

Ключ 'name' не является обязательным. Вы можете установить его на 'name' => NULL или не добавлять в ассоциативный массив, тогда будет использоваться только 'email'.

5
plus5volt

Я использую 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('[email protected]', 'Some Company Name')
                        ->replyTo($emailReply, $nameReply)
                        ->bcc($contactList, 'Contact List')
                        ->subject("Subject title");
            });

Мне удалось отправить одному или нескольким получателям. ????

0
Alexandre Ribeiro

Это прекрасно работает - у меня есть доступ к объекту запроса и массиву электронной почты

        $emails = ['[email protected]', '[email protected]'];
        Mail::send('emails.lead', ['name' => $name, 'email' => $email, 'phone' => $phone], function ($message) use ($request, $emails)
        {
            $message->from('[email protected]', 'Joe Smoe');
//            $message->to( $request->input('email') );
            $message->to( $emails);
            //Add a subject
            $message->subject("New Email From Your site");
        });
0
Radmation

Приведенное ниже решение позволяет отправлять одно электронное письмо на несколько адресов одновременно. Он отлично работает с Laravel 5.4 и выше . Например,, если следующие адреса электронной почты являются желаемыми получателями, скажем: '[email protected]', '[email protected]', '[email protected] .com ',' [email protected] ',' [email protected] ',

Mail::to('[email protected]')
    ->cc(['[email protected]','[email protected]','[email protected]','[email protected]'])
    ->send(new document());

где document это любой класс, который дополнительно настраивает вашу электронную почту.

0
Dunsin Olubobokun