使用不同的凭据发送批量电子邮件
Sending bulk emails using different credentials
我需要使用来自 laravel 的不同凭据发送数百封电子邮件。
我的每个客户都有 his/hers 个邮件列表,需要提供自己的 SMTP 服务器。我代表客户处理该列表并发送电子邮件。
这就是我目前所拥有的。它正在运行,但速度很慢,而且到目前为止我还没有收到很多电子邮件。当我收到更多电子邮件时,我发现了一个问题。
关于如何改进有什么建议吗?
PS- 我使用 cron 控制台命令并使用内核来安排作业。
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');
}
}
直接在 Web 应用程序中发送电子邮件会大大降低应用程序的响应速度。您应该始终将消息排队。
而不是 Mail::send
您可以使用 Mail::queue
然后从 cron 或手动调用
php artisan queue:work
这将处理队列中的下一个项目。如果队列为空,此命令将不执行任何操作。但是如果队列中有项目,它将获取该项目并尝试执行它。
您无法即时更改电子邮件提供商配置,因此您必须在服务容器中创建 mailer
的新实例。我以前做过,我在自己的 class 中写了一个方法来获取新的邮件程序实例:
/**
* @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');
}
我需要使用来自 laravel 的不同凭据发送数百封电子邮件。 我的每个客户都有 his/hers 个邮件列表,需要提供自己的 SMTP 服务器。我代表客户处理该列表并发送电子邮件。
这就是我目前所拥有的。它正在运行,但速度很慢,而且到目前为止我还没有收到很多电子邮件。当我收到更多电子邮件时,我发现了一个问题。 关于如何改进有什么建议吗?
PS- 我使用 cron 控制台命令并使用内核来安排作业。
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');
}
}
直接在 Web 应用程序中发送电子邮件会大大降低应用程序的响应速度。您应该始终将消息排队。
而不是 Mail::send
您可以使用 Mail::queue
然后从 cron 或手动调用
php artisan queue:work
这将处理队列中的下一个项目。如果队列为空,此命令将不执行任何操作。但是如果队列中有项目,它将获取该项目并尝试执行它。
您无法即时更改电子邮件提供商配置,因此您必须在服务容器中创建 mailer
的新实例。我以前做过,我在自己的 class 中写了一个方法来获取新的邮件程序实例:
/**
* @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');
}