Недавно я решил использовать Mandrill для отправки писем. Мне нужно будет отправить около 30 000 электронных писем сразу, и я думал, что пакетная отправка с Mandrill может позаботиться об этом, однако, когда я проверяю журналы API на сайте Mandrill, каждое отправленное письмо отображается как отдельный вызов API (время вызова в 200 мс). Статус результата для каждого отправленного сообщения равно «отправлен».Отправка писем с помощью Mandrill. Async не работает
Из того, что я мог собрать, когда есть более 10 получателей, он должен работать асинхронно, а статус должен быть «поставлен в очередь».
Я отправляю около 600 электронных писем прямо сейчас, а скрипт CRON занимает около 7 минут для выполнения. Это слишком долго.
Вот код:
public function getSendEmails()
{
\Log::info('get-send-emails (start)');
$tasks = $this->task->where('published_at', '>', date('Y-m-d', time()))->whereNotNull('published_at')->get();
foreach ($tasks as $task)
{
$users = $this->user->where('task_id', $task->id)
->where('allow_emails', 1)
->where('activated', 1)
->get();
$users_array = array();
foreach ($users as $user)
{
$users_array[] = array(
'email' => $user->email,
'name' => $user->first_name . ' ' . $user->last_name,
'type' => 'to'
);
}
if (!empty($users_array))
{
$html = View::make('emails.notifications.task')->with('task', $task)->render();
$batches = array_chunk($users_array, ceil($users->count()/1000.0));
foreach($batches as $batch)
{
try
{
$mandrill = new \Mandrill('some API key');
$message = array(
'html' => $html,
'subject' => 'Some Subject!',
'from_email' => '[email protected]',
'from_name' => 'Some Name',
'to' => $batch,
'preserve_recipients' => false
);
$async = true;
$result = $mandrill->messages->send($message, $async);
}
catch(\Mandrill_Error $e)
{
echo 'A mandrill error occurred: ' . get_class($e) . ' - ' . $e->getMessage();
throw $e;
}
}
}
}
\Log::info('get-send-emails (end)');
}
Может сказать, у меня, если я делаю что-то неправильно или это, как долго он должен взять?
Ваш код выглядит хорошо. Что я могу вам посоветовать, нужно активировать отладку (внутри отладки Mandrill.php отложить до истины), а затем проверить внутри вашего журнала php_error, чтобы узнать, сколько времени занимает каждый запрос. По возвращении вы можете связаться с Mandrill для получения дополнительной информации. – yvan