2014-05-07 12 views
8

Próbuję użyć kolejki Mail :: do wysłania i wysłania wiadomości e-mail, ale kiedy zadzwonię do tej funkcji, to po prostu wysyła pocztę, a odpowiedź jest opóźniona ... Pomyślałem, że punkt za pomocą poczty :: kolejkę było stać w kolejce ....Laravel: Jak ustawić kolejkę wiadomości do wysłania później

Chcę odpowiedzią przyszedł natychmiast, bez konieczności oczekiwania na wiadomość e-mail do wysłania

dla np

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

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

I chcesz otrzymać odpowiedź, nie czekając na wysłanie wiadomości. Jak mogę to zrobić?

+0

metoda Mail :: później robi to samo, to po prostu czeka, bez względu na czas mówię to czekać, a odpowiedź jest opóźniona –

+0

Jest to praktycznie niemożliwe. Otrzymasz odpowiedź od serwera wykonanej operacji. –

+0

@GabrielMatusevich czy mogę wiedzieć, czy masz jakieś rozwiązania na ten temat? Też napotykam te same problemy, gdy używam laravel5 – atom2ueki

Odpowiedz

3

Który sterownik kolejki (app/config/queue.php - 'default' param) używasz? Jeśli używasz sync i nie masz skonfigurowanego jednego z innych, to używasz sterownika synchronicznego, który robi dokładnie to, co mówi nazwa: Uruchamia zadanie w kolejce zaraz po utworzeniu zadania.

Musisz skonfigurować serwer MQ, aby rozmawiać z Laravel. Można dostać darmowe konto iron.io do tego, a potem trzeba go skonfigurować, na przykład:

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

Następnie podczas korzystania Mail::queue() będzie naciskać dyspozycję iron.io. Będziesz musiał mieć inny wątek nasłuchujący w kolejce - wystarczy uruchomić php artisan queue:listen i pozostawić go uruchomiony, podczas gdy wiadomości są przekazywane do kolejki.

+1

To jest naprawdę pomocne, ale ja faktycznie szukam jakiegoś sposobu by zrobić to lokalnie bez zależny na innej służbie: P –

+0

co o beanstalkd ?? masz przykład konfiguracji? –

+1

Korzystanie z iron.io naprawdę będzie najszybszym sposobem na jego skonfigurowanie. W przypadku beanstalkd, po zainstalowaniu, powinieneś móc korzystać ze skonfigurowanych ustawień domyślnych - wystarczy zmienić 'default' w linii 18 na' 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 
    ]); 
} 
Powiązane problemy