使用 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 发送邮件。异步不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHPMailer 和 Mandrill 发送模板

IOS JSON 从 Mandrill 发送电子邮件

抄送收件人的 Mandrill 合并变量不起作用

无法使用 laravel + mandrill 发送 html 电子邮件

mc:edit 在带有 Mandrill Javascript API 的 Mailchimp 模板中不起作用

使用 PHP 使用 Mandrill 发送电子邮件