Отправка массовых писем с использованием разных учетных данных

Мне нужно отправить сотни электронных писем, используя разные учетные данные из Laravel. Каждый мой клиент имеет свой список рассылки и должен предоставить свой собственный SMTP-сервер. Я обрабатываю этот список и отправляю электронные письма от имени клиента.

Это то, что я до сих пор. Это работает, но очень медленно, и у меня пока мало писем. Я вижу проблему, когда получаю больше писем. Любые предложения о том, как улучшить?

PS - я использую консольную команду cron и использую Kernel для планирования работы.

public function sendMailings($allMailings) {

    foreach ($allMailings as $email) {
        Config::set('mail.host', $email['smtpServer']);
        Config::set('mail.port', $email['smtpPort']); 
        Config::set('mail.username', $email['smtpUser']);
        Config::set('mail.password', $email['smtpPassword']); 
        Config::set('mail.encryption', $email['smtpProtocol']);            
        Config::set('mail.frommmail', trim($email['fromEmail'])); 
        Config::set('mail.fromuser', trim($email['fromUser'])); 
        Config::set('mail.subject', trim($email['subject'])); 
        Config::set('mail.toEmail', trim($email['toEmail'])); 
        Config::set('mail.toName', trim($email['toName'])); 
        Config::set('mail.pretend', false); 

        $email_body = $email['emailBody'];

        Mail::send('emails.availability, compact('email_body')
                , function($message) {
            $message->from(config('mail.username'), config('mail.fromUser'));
            $message->replyTo(config('mail.frommmail'), config('mail.fromUser'));
            $message->to(config('mail.toEmail'), config('mail.toName'))->subject(config('mail.subject'));
        }); 
        Log::info('Mail was sent');
    }
}

2 ответа

Решение

Вы не можете изменять конфигурации провайдера электронной почты на лету, поэтому вы должны сделать новый экземпляр mailer в сервисном контейнере. Я сделал это раньше, я написал метод в своем собственном классе, чтобы получить новый экземпляр почтовой программы:

 /**
 * @return Mailer
 */
protected function getMailer()
{
    // Changing mailer configuration
    config(['mail.driver' => static::getName()]);

    // Register new instance of mailer on-the-fly
    (new MailServiceProvider($this->container))->register();

    // Get mailer instance from service container
    return $this->container->make('mailer');
}

Отправка сообщений электронной почты непосредственно в веб-приложение может значительно замедлить отзывчивость вашего приложения. Вы должны всегда ставить свои сообщения в очередь.

Вместо Mail::send Ты можешь использовать Mail::queue

а потом из cron или вручную звонить

php artisan queue:work

Это обработает следующий элемент в очереди. Эта команда ничего не сделает, если очередь пуста. Но если в очереди есть элемент, он извлечет элемент и попытается выполнить его.

Другие вопросы по тегам