2014-05-07 13 views
8

Tôi đang cố gắng sử dụng hàng đợi Mail :: gửi và gửi email, nhưng khi tôi gọi chức năng này, nó sẽ gửi thư đơn giản và phản hồi bị trì hoãn ... Tôi nghĩ rằng điểm của việc sử dụng thư :: đợi đã phải xếp hàng ....Laravel: Cách xếp hàng thư để gửi sau

tôi muốn đáp lại đến ngay lập tức, không cần phải chờ đợi cho các email được gửi

cho ví dụ

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

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

tôi muốn nhận được phản hồi mà không phải đợi thư được gửi. Tôi có thể làm điều đó như thế nào ???

+0

Phương thức Mail :: sau đó thực hiện tương tự, nó chỉ đợi bất kỳ lúc nào tôi chờ và phản hồi bị trễ –

+0

Thực tế là không thể. Bạn sẽ nhận được phản hồi từ máy chủ của bạn hoạt động của bạn thực hiện. –

+0

@GabrielMatusevich Tôi có thể biết liệu bạn có nhận được bất kỳ giải pháp nào về vấn đề này không? Tôi cũng gặp các vấn đề tương tự khi sử dụng laravel5 – atom2ueki

Trả lời

3

Trình điều khiển xếp hàng (app/config/queue.php - 'default' param) nào bạn đang sử dụng? Nếu bạn đang sử dụng sync và chưa thiết lập một trong số những người khác, thì bạn đang sử dụng trình điều khiển đồng bộ, thực hiện chính xác những gì tên cho biết: Chạy tác vụ xếp hàng của bạn ngay sau khi tác vụ được tạo.

Bạn cần định cấu hình máy chủ MQ cho Laravel để trò chuyện. Bạn có thể có được một tài khoản miễn phí iron.io cho điều này, và sau đó bạn cần phải cấu hình nó, ví dụ:

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

Sau đó, khi bạn sử dụng Mail::queue() nó sẽ đẩy các hướng dẫn để iron.io. Sau đó, bạn sẽ phải có một luồng khác đang nghe trên hàng đợi - chỉ cần chạy php artisan queue:listen và để nó chạy trong khi các thư được đẩy vào hàng đợi.

+1

Điều này thực sự hữu ích nhưng tôi thực sự đang tìm kiếm một số cách để làm điều này cục bộ mà không phụ thuộc vào dịch vụ khác: P –

+0

những gì về beanstalkd ?? Bạn có một cấu hình ví dụ cho nó? –

+1

Sử dụng iron.io thực sự sẽ là cách nhanh nhất để thiết lập. Đối với beanstalkd, một khi bạn cài đặt nó, bạn sẽ chỉ có thể sử dụng các mặc định được cấu hình - chỉ cần thay đổi 'default' trên dòng 18 thành' 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 
    ]); 
} 
Các vấn đề liên quan