使用 Mandrill 发送邮件。异步不起作用
Posted
技术标签:
【中文标题】使用 Mandrill 发送邮件。异步不起作用【英文标题】:Sending mails with Mandrill. Async doesn't work 【发布时间】:2014-07-12 11:02:12 【问题描述】:最近我决定使用 Mandrill 发送电子邮件。我需要一次发送大约 30 000 封电子邮件,我认为使用 Mandrill 批量发送可以解决这个问题,但是当我在 Mandrill 网站上检查 API 日志时,每封发送的电子邮件都显示为单独的 API 调用(大约 200 毫秒的调用时间) )。每封已发送电子邮件的结果状态都等于“已发送”。
据我所知,当有超过 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' => 'some@email.com',
'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 中将调试设置为 true),然后检查您的 php_error 日志以查看每个请求需要多长时间。根据它的返回,您可以联系 Mandrill 以获取更多信息 【参考方案1】:看起来您正在将数组分解为由少数几个收件人组成的块。假设您有 10 个用户(所以 $users->count()
是 10),您使用这一行将批量大小设置为 1,因为 ceil(10/1000.0)
将返回 1:
$batches = array_chunk($users_array, ceil($users->count()/1000.0));
即使有 30,000 个收件人,您也需要将每个批次设置为 30 个收件人(因此仍然是相对较小的批次)。您可能希望将其更改为类似这样,以使每批都有 1000 个收件人:
$batches = array_chunk($users_array, 1000);
【讨论】:
是的,我刚刚意识到这一点。谢谢! :) 嗨,只是一个简单的问题,通过这种方式,假设您有 30k 个收件人分成 1000 个批次。将保留收件人设置为 false 并将同步设置为 true,这将发送 30 1000 个收件人相互隐藏的电子邮件,还是会发送 30,000 封单独的电子邮件?以上是关于使用 Mandrill 发送邮件。异步不起作用的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 laravel + mandrill 发送 html 电子邮件