使用 cURL 在单个脚本中发送 24-25 封电子邮件后,SendGrid v3 API 端点速度变慢

问题描述 投票:0回答:1

我有一个 PHP 脚本,每周使用 SendGrid v3 API 端点向客户发送一次电子邮件。 目前,每周大约发送 90 - 120 封电子邮件。

该脚本使用 cURL 将请求发送到 SendGrid,后者又使用动态模板来定制发送给客户的电子邮件。 然而,我注意到前 24-25 封电子邮件发送得非常快。 随后的电子邮件需要更长的时间才能发送,直到达到停止发送的程度。 每次运行脚本我只能发送大约 53-56 封电子邮件。

该脚本重用了curl句柄,因此,只有第一封电子邮件的发送时间应该更长,因为cURL需要时间来建立连接。 但是,我不确定为什么 cURL 在计数到 25 后还需要时间来发送电子邮件。

起初,我仅使用 1 个 cURL 连接发送电子邮件。 然而,在这个问题之后,我尝试以 20 封为一组发送电子邮件,即发送 20 封电子邮件后,我关闭了 cURL 连接并重新初始化它(我目前仅限于使用 PHP 5.6)

我就此事联系了 SendGrid。 然而,根据他们的日志,他们收到的请求较晚,因为在计数 25 封之后才发出电子邮件。请注意,电子邮件已成功发送。 然而,发送电子邮件的时间不断增加,超过了 25 封电子邮件。 以下是用于发送电子邮件的代码。

如果我能了解一下为什么在发出 24-25 封电子邮件后发送电子邮件需要花费和增加时间,我将不胜感激。

注意:测试时,我还检查了运行脚本的服务器以及本地计算机上的 CPU 利用率和内存使用情况。 在这两种情况下,脚本运行时都没有明显的增加。

$url = 'https://api.sendgrid.com/v3/mail/send';
$curl_headers = array();
$curl_headers[] = 'Content-Type:application/json';
$curl_headers[] = 'Authorization:Bearer [AddBearerTokenHere]';

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_VERBOSE => FALSE,
    CURLOPT_POST => TRUE,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FOLLOWLOCATION => 1,
    CURLOPT_IPRESOLVE       => CURL_IPRESOLVE_V4,
    CURLOPT_HTTPHEADER      => $curl_headers,
    CURLOPT_SSL_VERIFYPEER => FALSE
));

$mails_sent_count = 0;
$batch_size = 20;

foreach($mail_data_to_send AS $key=>$val)
{
    if($mails_sent_count == $batch_size)
    {
        //Re-instantiate the curl connection for the new batch
        if($ch)
        {
            curl_close($ch);
            sleep(1);
        }
        
        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_VERBOSE => FALSE,
            CURLOPT_POST => TRUE,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_IPRESOLVE       => CURL_IPRESOLVE_V4,
            CURLOPT_HTTPHEADER      => $curl_headers,
            CURLOPT_SSL_VERIFYPEER => FALSE
        ));
        
        $mails_sent_count = 0;
    }
    
    $data = [];
    $data['from']['email'] = '[From Email Address]';
    $data['from']['name'] = '[From Name]';
    $data['personalizations'] = array();
    $data['personalizations'][] = array(
        'to'    =>  array(array(
            'email' =>  $val['EmailID']
        )),
        'dynamic_template_data' =>  array(
            'name'  =>  $val['name'],
            'data1' =>  $val['data1'],
            'data2' =>  $val['data2'],
            'data3' =>  $val['data3'],
            'data4' =>  $val['data4'],
            'data5' =>  $val['data5'],
        )
    );
    
    $data['asm']['group_id'] = [Group ID];
    
    if($val['data6'] == 'val1')
    {
        $data['template_id'] = '[Template ID 1]';
    }
    elseif($val['data6'] == 'val2')
    {
        $data['template_id'] = '[Template ID 2]';
    }
    elseif($val['data7'] == 'val3')
    {
        $data['template_id'] = '[Template ID 3]';
    }
    elseif($val['data8'] == 'val4')
    {
        $data['template_id'] = '[Template ID 4]';
    }
    
    $postfields = json_encode($data);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

    $response = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if(curl_errno($ch))
    {
        $curl_error = curl_error($ch);
        
        //Need to log the exception and attempt sending other emails
        //As the error could be only for one particular email
        
        continue;
    }
    elseif(($httpcode == 200) || ($httpcode == 202))
    {
        //Update Email Sent Flag
    }
    else
    {
        /**
         * All other error codes are errors
         */
        //Log error entry
    }
    
    $mails_sent_count++;
}

if($ch)
{
    curl_close($ch);
}
php email curl sendgrid-api-v3 sendgrid-templates
1个回答
0
投票

我们在 javascript sdks 和直接 api 调用方面也面临着同样的问题。我们向 Sendgrid 团队提出了一张票,这就是回复。如果有什么结果,我们将进一步更新。

Response from Sendgrid

https://www.twilio.com/docs/sendgrid/for-developers/sending-email/v3-mail-send-faq#are-there-limits-on-how-often-i-can-send-电子邮件和我可以发送给多少个收件人

© www.soinside.com 2019 - 2024. All rights reserved.