2016-07-19 4 views
1

Мне нужно отправить сотни писем с использованием разных учетных данных из 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'); 
    } 
} 

ответ

0

Вы не можете изменять конфигурацию почтовых провайдеров «на лету», поэтому вы должны создать новый экземпляр 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'); 
} 
0

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

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

, а затем из хрон или вручную вызвать

php artisan queue:work

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

+0

К сожалению, я уже работаю его через хроны консольной команды через Kernel – Andrew

+0

@ Андрей Вот интересный ответ HTTP: // StackOverflow. com/a/26323505/706466 (упорядочение по домену и поддержание связи в сети) –

+0

@ Андрю Я думаю, что все еще очереди сообщений позволят вам выполнить их асинхронно (быстрее) (возможно, с этим https://github.com/barryvdh/laravel-async-queue) –

Смежные вопросы