Задержка между электронной почтой с использованием очереди в laravel - PullRequest
0 голосов
/ 20 ноября 2019

Ситуация такова, что я загружаю .csv, который содержит 50 электронных писем, например. Как я могу задержать отправку двух писем, потому что бесплатный пакет mailtrap позволил ограничить скорость отправки в 10 секунд всего двумя письмами. Так что мне нужно задержать в течение 10 секунд. Это то, что я пробовал, но письмо по-прежнему отправлять в пакетном режиме.

    for ($i = 0; $i < $count; $i++) {

        $participant = new Participant();
        $participant->p_name = $participantArray[0][$i]['name'];
        $participant->p_email = $participantArray[0][$i]['email'];
        $participant->p_address = $participantArray[0][$i]['address'];
        $participant->p_postcode = $participantArray[0][$i]['postcode'];
        $participant->p_city = $participantArray[0][$i]['city'];
        $participant->p_state = $participantArray[0][$i]['state'];
        $participant->p_contact = $participantArray[0][$i]['contactno'];
        $confirmation_code = str_random(30);
        $participant->confirmation_code = $confirmation_code;
        $participant->save();
        $participant->campaign()->attach($request->campaign_id);

        $details = [
            'email' => $participantArray[0][$i]['email'],
            'confirmation_code' => $confirmation_code
        ];

        $emailJob = (new SendEmail($details))->delay(Carbon::now()->addSeconds(10));
        dispatch($emailJob);
    }

1 Ответ

1 голос
/ 20 ноября 2019

Самым простым способом, вероятно, было бы создание экземпляра углерода вне цикла, а затем добавление к нему. В настоящее время вы говорите Laravel отложить работу на 10 секунд от времени каждой итерации, но между (и более вероятно) будет меньше 1 мс между каждой итерацией, поэтому задания будут обрабатываться примерно в одно и то же время.

$now = now();

for ($i = 0; $i < $count; $i++) {

    //The rest of your code

    dispatch(new SendEmail($details))->delay($now->addSeconds(10));
}

Выше будет означать, что он будет добавлять 10 секунд к предыдущему времени. Если вы хотите, чтобы первая работа запускалась сразу (а затем откладывала каждую последующую на 10 секунд), вы можете добавить к экземпляру углерода после установки задержки для работы:

$now = now();

for ($i = 0; $i < $count; $i++) {

    //The rest of your code

    dispatch(new SendEmail($details))->delay($now);

    $now->addSeconds(10);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...