2014-05-07 11 views
8

Sto cercando di utilizzare Mail :: queue per inviare e-mail, ma quando chiamo questa funzione è semplice inviare la posta e la risposta è in ritardo ... Ho pensato che il punto di usare mail :: coda era a fare la fila ....Laravel: Come accodare i messaggi da spedire in seguito

voglio la risposta arrivò immediatamente, senza dover attendere l'e-mail da inviare

per esempio

Mail::queue('emails.template', $data, function($message) { 
    $message->to('[email protected]'); 
    $message->subject('Notificacion'); 
}); 

return Response::json(array('error' => 0, 'message' => 'Ok')); 

I desidera ricevere la risposta senza attendere l'invio della posta. Come posso farlo ???

+0

Il metodo Mail :: tardi fa la stessa cosa, si aspetta solo tutto il tempo dico che aspettare e la risposta è ritardata –

+0

E 'praticamente impossibile. Riceverai risposta dal server eseguito dall'operazione. –

+0

@GabrielMatusevich posso sapere se hai qualche soluzione a riguardo? Ho anche riscontrato gli stessi problemi durante l'utilizzo di laravel5 – atom2ueki

risposta

3

Quale driver di coda (app/config/queue.php - 'default' param) si utilizza? Se si utilizza sync e non si è impostato uno degli altri, si utilizza il driver sincrono, che esegue esattamente ciò che dice il nome: esegue l'attività in coda non appena viene creata l'attività.

È necessario configurare un server MQ per Laravel con cui parlare. È possibile ottenere un account gratuito iron.io per questo, e quindi è necessario configurarlo, per esempio:

'iron' => array(
    'driver' => 'iron', 
    'project' => 'iron-io-project-id', 
    'token' => 'iron-io-queue-token', 
    'queue' => 'queue-name', 
), 

Poi, quando si utilizza Mail::queue() che spingerà le istruzioni per iron.io. Dovrai quindi avere un altro thread in ascolto sulla coda: esegui semplicemente php artisan queue:listen e lascialo in esecuzione mentre i messaggi vengono inviati alla coda.

+1

Questo è davvero utile, ma in realtà sto cercando un modo per farlo localmente senza dipendere da un altro servizio: P –

+0

che dire di beanstalkd ?? hai un esempio di configurazione per questo? –

+1

Usare iron.io sarà davvero il modo più veloce per farlo configurare. Per beanstalkd, una volta installato, dovresti essere in grado di usare i valori predefiniti configurati - cambia semplicemente "default" sulla riga 18 in "beanstalkd". – Wogan

-1
/** 
* Get all email recipients and include their user details for Mailgun's 
* template tags - %recipient.userToken% 
*/ 
private function getRecipients() 
{ 
    foreach (User::get() as $user) 
    { 
     $this->recipients[$user->email] = [ 
      'id' => $user->id, 
      'userToken' => $user->user_token, 
      'first_name' => $user->first_name, 
      'last_name' => $user->last_name, 
      'email' => $user->email 
     ]; 
    } 
} 

private function sendEmail() 
{ 
    $subject = 'Demo Subject'; 
    /** 
    * Data for the Blade template 
    */ 
    $data = [ 
     'foo' => 'bar' 
    ]; 
    // Inline the CSS for the email 
    $inliner = new InlineEmail('emails.some-email', $data); 
    $content = $inliner->convert(); 

    // Create Emails table entry for this email. Used for Mailgun webhooks 
    $email = Email::create(['user_id' => $this->userId, 'subject' => $subject, 'email_id' => str_random()]); 

    // Prepare the email addresses 
    $emailAddresses = array_column($this->recipients, 'email'); 

    $this->mailgun->sendMessage('demo.org', [ 
     "from" => '[email protected]', 
     "to" => implode(',', $emailAddresses), // Comma separated list of email addresses 
     "subject" => $subject, 
     "html" => $content, // Inlined CSS HTML from Blade 
     "text" => "Plain text message here", 
     "recipient-variables" => json_encode($this->recipients), // Required for batch sending, matches to recipient details 
     "v:messageId" => $email->id, // Custom variable used for webhooks 
    ]); 
} 
Problemi correlati