Laravel:使用队列每小时发送 1000 封电子邮件

标签 laravel queue jobs

我有一个包含 5000 条记录(5000 个用户)的用户表,在我的服务器中我每小时只能发送 1000 封电子邮件。 我如何使用队列每小时发送 1000 封电子邮件? 或者如何让队列在循​​环内休眠?

邮件 Controller :

class EmailController extends Controller
{
    public function sendEmail(Request $request){

         $event=(object)['content' => "Hello Laravel fans",'subject' => 'Test Email'];
         $users=User::all();
         App\Jobs\SendReminderEmail::dispatch($users,$event)
    }
}

发送提醒邮件

class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $event;

    public $email;

    public $users;

    public function __construct($users,$event)
    {
        $this->users = $users;

        $this->event = $event;
    }

    public function handle()
    {   
        foreach ($this->users as $user) {

         Mail::to($user->email)->queue(new Reminder($this->event));
        }
    }
}

最佳答案

Laravel 有一个非常适合你的情况的简洁功能,它叫做 Task Scheduling ,您可以每小时调用一次,而不是让作业休眠一小时。

为此,将作业计划添加到位于 App\Console\Kernelschedule() 方法中,如下所示:

protected function schedule(Schedule $schedule)
{
    $schedule->job(new SendReminderEmail)->hourly();
}

我也建议你把工作做成独立的,这将使这个任务简单得多,我在想这样的事情:

class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $event;

    public $users;

    public function __construct()
    {
        $this->users = User::all();

        $this->event = (object)['content' => "Hello Laravel fans",'subject' => 'Test Email'];;
    }

    public function handle()
    {   
        foreach ($this->users as $user) {
            Mail::to($user->email)->queue(new Reminder($this->event));
        }
    }
}

现在你可以摆脱你的 Controller ,因为这个工作将每小时自动执行一次。

请记住,您需要在服务器上运行 cron 以检查是否需要执行作业。如果您想使用 php artisan schedule:run 测试它,您也可以手动运行它。

希望对你有帮助。

关于Laravel:使用队列每小时发送 1000 封电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53117876/

相关文章:

php - Laravel 5.6 奇怪的行为 - Laravel 在重命名后看不到 Controller

Laravel 策略未调用

php - laravel eloquent 获取等于 1 或 0 的记录

python - 并行抓取多个 url 并在队列中插入 lxml 元素

javascript - 解析云后台作业不会通过调用 .success() 停止执行

laravel - 登录后在 Laravel 中进行条件重定向

c++ - 如何打印BFS路径本身而不是此字梯的路径长度?

c++ - 尝试实现无锁队列时发生堆栈溢出

laravel 反序列化/解码作业原始主体

c# - Instagram API 整合