2016-07-19 7 views
1

Ich muss Hunderte von E-Mails mit unterschiedlichen Anmeldeinformationen von Laravel senden. Jeder Kunde von mir hat seine/ihre Mail-Liste und muss seinen eigenen SMTP-Server bereitstellen. Ich verarbeite diese Liste und sende E-Mails im Auftrag des Kunden.Senden von Massen-E-Mails mit unterschiedlichen Anmeldeinformationen

Das ist was ich bisher habe. Es funktioniert, aber es ist sehr langsam und ich habe bisher nicht viele E-Mails. Ich sehe ein Problem, wenn ich mehr E-Mails bekomme. Irgendwelche Vorschläge zur Verbesserung?

PS- Ich benutze Cron Console Command und verwenden Sie Kernel, um den Job zu planen.

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'); 
    } 
} 

Antwort

0

Sie können die Konfiguration des E-Mail-Providers nicht sofort ändern, daher müssen Sie im Servicebehälter eine neue Instanz von mailer anlegen. Ich habe vor, ich eine Methode in meiner eigenen Klasse schrieb neue Mailer-Instanz zu erhalten:

/** 
* @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

Das Senden von E-Mail-Nachrichten direkt in der Webanwendung kann die Reaktionsfähigkeit Ihrer Anwendung drastisch verlangsamen. Sie sollten Ihre Nachrichten immer in eine Warteschlange stellen.

Statt Mail::send können Sie verwenden Mail::queue

und dann von cron oder rufen Sie manuell

php artisan queue:work

, dass der nächste Punkt auf der Warteschlange verarbeitet. Dieser Befehl wird nichts tun, wenn die Warteschlange leer ist. Wenn jedoch ein Element in der Warteschlange ist, wird es das Element abrufen und versuchen, es auszuführen.

+0

Sorry, ich laufe es bereits über den Befehl cron-Konsole über Kernel – Andrew

+0

@ Andrew Hier interessante Antwort http: // Stackoverflow. com/a/26323505/706466 (Reihenfolge nach Domäne, und die Verbindung aufrecht zu erhalten) –

+0

@Andrew Ich denke, noch Warteschlangen Nachrichten können Sie sie auf eine asynchrone Weise (schneller) ausführen lassen (vielleicht mit diesem https://github.com/barryvdh/Laravel-Async-Queue) –