2014-10-27 10 views
32

io non riesco a trasmettere con successo per multipla indirizzi quando si utilizza Mail::send() callback di laravel, il codice non funziona tuttavia quando ho specificare solo uno destinatario.laravel Mail :: send() l'invio a più o bcc affronta

Ho provato concatenamento:

// 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); 
     } 
}); 

e passando un array:

// 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); 
}); 

ma nessuno dei due sembra funzionare e ricevo messaggi di errore quando si ritorna mail :: guasti(), un var_dump() di mail :: guasti() mostra gli indirizzi email che ho cercato di trasmettere, ad esempio:

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

Chiaramente facendo s omething sbagliato, gradirebbe qualsiasi aiuto come io non sto capendo l'API sia: http://laravel.com/api/4.2/Illuminate/Mail/Message.html#method_to

mi rendo conto ho potuto mettere il metodo Mail::send() in una per/foreach loop e Mail::send() per ogni indirizzo e-mail, ma questo non sembra Per essere la soluzione ottimale, speravo che sarei stato in grado di inviare ->bcc() a tutti gli indirizzi, una volta che tutto funzionava, in modo che i destinatari non vedessero a chi altri spedire la posta.

+0

Mostra altro codice. Hai provato a inserire le e-mail esistenti. Quali messaggi di errore ricevi? –

+0

Cosa intendi per e-mail esistenti? Lo invio a indirizzi email validi se è questo che intendi? Aggiungerà più codice con i messaggi di errore. Grazie. – haakym

risposta

66

ho provato utilizzando il seguente codice:

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

Risultato - array vuoto per i guasti.

Ma ovviamente è necessario configurare correttamente il tuo app/config/mail.php. Quindi assicurati prima di poter inviare e-mail a un solo utente e poi testare il codice con molti utenti.

Inoltre utilizzando questo semplice codice nessuna delle mie e-mail sono state consegnate agli account di posta, ho ricevuto solo e-mail per le caselle di posta che ho sui miei account di hosting a pagamento, quindi probabilmente sono stati catturati da alcuni filtri (è forse un argomento semplice/problema relativo ai contenuti, ma l'ho menzionato solo nel caso in cui non abbiate ricevuto alcune e-mail).

+0

Grazie per la risposta. Apparentemente non stavo facendo niente di male, ma il mio IP al lavoro non era abilitato a ritrasmettere e-mail al di fuori del nostro dominio! Tutto ordinato e funzionante ora. Grazie ancora. – haakym

+8

@haakym Ecco perché se qualcosa non funziona, dovresti sempre cercare di usare il codice più semplice e assicurarti che funzioni senza problemi. Spesso i problemi non sono dove ti aspetti che siano. –

+1

Se voglio scrivere da qualche parte il nome delle ricevute, come posso farlo? –

-8

funziona per me bene, se si dispone di una stringa, quindi semplicemente esplodere prima.

$ email = array();

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

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

Ciò invierebbe N email a N destinatari. L'obiettivo è inviare 1 email a N destinatari. – KalC

9

Se si desidera inviare messaggi di posta elettronica contemporaneamente a tutti gli amministratori, si può fare qualcosa di simile:

Nel file .env aggiungere tutti i messaggi di posta elettronica come valori separati da virgola:

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

così quando invii l'e-mail basta fare questo (sì! Il metodo 'a' dell'istanza del generatore di messaggi accetta un array):

Quindi,

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

e ...

$message->to($to); 

sarà ora inviare la mail a tutti gli amministratori.

+0

Risposta migliore per l'uso del file .env –

+0

Non si deve fare riferimento direttamente a ENV: utilizzare l'helper di configurazione. – voidstate

0

Questa grande opera - ho accesso l'oggetto della richiesta e l'array email

 $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

Come posso usare '' '$ message-> to ($ email);' '' ma includere il nome dei destinatari? – JCarlos

+0

@JCarlos ha l'email come chiave dell'array associativo, '['[email protected]' => 'Joe', '[email protected]' => 'Jack']' – Grant

7

la risposta accettata non non lavoro più a lungo con laravel 5.3 perché mailable tenta di accedere ->email e si traduce in

ErrorException in Mailable.php linea 376: Cercando di ottenere la proprietà di non oggetto

un codice di lavoro per laravel 5.3 è questo:

$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)); 
+0

Grazie per questa risposta. Mi ha risparmiato un sacco di tempo e dolore. Questo cambiamento è intenzionale perché sembra troppo codice per qualcosa che dovrebbe essere una mano molto corta. Sto definendo la mia funzione to() usando una variabile '$ to = [(oggetto) ['nome' => 'Nome Esempio', 'email' => '[email protected]'], (oggetto) ['nome '=>' Esempio Nome 2 ',' email '=>' [email protected] ']]; ' – Anthony

+0

La risposta accettata, tuttavia, funziona per me in Laravel 5.4 – GTCrais

Problemi correlati