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