簡體   English   中英

為什么 Laravel 郵件隊列中的收件人堆積如山?

[英]Why recipients in Laravel Mail queue are stacking up?

我正在嘗試向用戶批量發送電子郵件。 我根據 laravel 文檔設置了隊列和主管,但是郵件中的收件人堆積如山,我真的不知道出了什么問題,因為代碼中的一切看起來都很好。 這是我排隊郵件的方式。

$message = (new \App\Mail\EmailUpdate(request('subject'),request('message')))->onQueue('emailsDefault');
foreach($users as $user){
    \Mail::to($user)->queue($message);
}

我認為從數據庫中選擇用戶段肯定存在一些問題。 但是我嘗試使用php artisan tinker ,它顯示了完美的結果。 這是我從數據庫中獲取用戶集合的方法。

$users = User::join('user_metas','users.id','=','user_metas.user_id')
             ->where('meta_key','plan')
             ->where('meta_value','free')
             ->select('users.id')
             ->get();

在電子郵件的收件人部分,我可以看到收件人數量有所增加。 這是它在 mailtrap.io 中的樣子。

檢查電子郵件的“收件人”部分

任何幫助,將不勝感激。 我不知道我在這里缺少什么。 這是我的EmailUpdate Mailable

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class EmailUpdate extends Mailable
{
    use Queueable, SerializesModels;

    public $subject;
    public $update;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($subject,$update)
    {
        $this->subject = $subject;
        $this->update = $update;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.emailUpdate')
                    ->subject($this->subject);
    }
}

我更新了以下代碼:

$message = (new \App\Mail\EmailUpdate(request('subject'),request('message')))->onQueue('emailsDefault');
foreach($users as $user){
    \Mail::to($user)->queue($message);
}

到以下代碼:

foreach($users as $user){
    $message = (new \App\Mail\EmailUpdate(request('subject'),request('message')))->onQueue('emailsDefault');
    \Mail::to($user)->queue($message);
}

它正在工作! 我不知道為什么會發生這種情況,因為我們沒有在$message實例中定義用戶。 如果有人知道這種情況發生的原因,我很想知道。

讓我們嘗試對代碼進行一個小的重構。

$users = User::join('user_metas','users.id','=','user_metas.user_id')
             ->where('meta_key','plan')
             ->where('meta_value','free')
             ->select('users.id')
             ->get();

$email = new \App\Mail\EmailUpdate(request('subject'),request('message')));
    foreach ($users as $user) {
        Mail::queue(email);
    }

這是因為我不確定你的:Mail::to()->queue();

無論如何最后檢查,failed_jobs 表中是否有任何作業失敗?

您可以將可郵寄對象的“to”屬性設置為空

$message = (new \App\Mail\EmailUpdate(request('subject'),request('message')))->onQueue('emailsDefault');
foreach($users as $user){
    $message->to = [];
    \Mail::to($user)->queue($message);
}

或者在您自己回答時為每次迭代創建一個新實例

foreach($users as $user){
    $message = (new \App\Mail\EmailUpdate(request('subject'),request('message')))->onQueue('emailsDefault');
    \Mail::to($user)->queue($message);
}

為什么? Idk,顯然每個 Mail::to() 迭代都在 to 屬性中堆疊地址而不是設置一個新地址。

享受 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM