Отправить всю базу пользователей по электронной почте в одном скрипте PHP?
Мне интересно, как люди обрабатывают электронную почту своих пользователей. Я использую PHP и SendGrid обрабатывает электронные письма. Вариант использования - это информационный бюллетень.
Когда я отправляю себе 50 электронных писем в тестировании, сценарий уже занимает довольно много времени, и я беспокоюсь, что приложение истечет, если будет идти больше писем за раз.
Я на самом деле не хочу отправлять себе 100, потом 1000, потом 10000 писем, чтобы узнать, что проверяет верхний предел.
Я запускаю это на средней EC2 Linux, если это полезно.
1 ответ
Есть несколько способов сделать это с помощью SendGrid.
Отправить электронную почту в параллель
Вполне вероятно, что вы в настоящее время отправляете свои электронные письма в серии (то есть отправляете одно электронное письмо, ждете его отправки, а затем отправляете следующее). Это означает, что если вам потребуется 1 секунда, чтобы отправить электронное письмо, вам потребуется 100 секунд, чтобы отправить сотню.
К счастью, библиотека cURL в PHP позволяет отправлять много запросов POST параллельно, а не последовательно.
// An array of the emails you want to send to:
$emails = array("joe@example.org", "sue@example.com");
$credentials = array("api_user" => YOUR_SENDGRID_USERNAME, "api_key" => YOUR_SENDGRID_PASSWORD);
$multi_handle = curl_multi_init();
$handles = array();
// Loop through each email and create a cURL Handle for the email
// The cURL handle will POST an email to SendGrid with the proper info
foreach ($emails as $key => $email) {
// Create an email data object with your credentials in it,
// we'll POST this to SendGrid
$email_data = $credentials;
// Fill out all the information you want for the email
$email_data = array(
"to" => $email,
"from" => "you@example.net",
"subject" => generate_subject(),
"html" => generate_html(),
"text" => generate_text()
);
$handles[$key] = curl_init();
curl_setopt($handles[$key], CURLOPT_URL, "https://api.sendgrid.com/api/mail.send.json");
curl_setopt($handles[$key], CURLOPT_POST, 1);
curl_setopt($handles[$key], CURLOPT_POSTFIELDS, $email_data);
curl_setopt($handles[$key], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multi_handle, $handles[$key]);
}
$running = null;
// Run through each cURL handle and execute it.
do {
curl_multi_exec($multi_handle, $running);
} while ($running);
curl_multi_close($multi_handle);
Этот метод хорошо работает, если у вас есть много уникальных электронных писем, которые вы хотите отправить, однако он все равно приводит к куче запросов POST с вашего сервера, которые являются медленными и требуют больших ресурсов. Там часто лучший способ.
Отправка электронной почты с использованием SMTPAPI
SendGrid имеет SMTPAPI
что позволяет отправлять до 10000 электронных писем с помощью одного запроса POST, используя to
параметр. Вы можете сделать эти письма полу-уникальными, используя substitution
теги.
Для этого вы должны сделать что-то вроде следующего:
// An array of the emails you want to send to:
$emails = array("joe@example.org", "sue@example.com");
// Encode it into the SendGrid SMTPAPI Format
$smtpapi = array( "to" => $emails );
$params = array(
"api_user" => YOUR_SENDGRID_USERNAME,
"api_key" => YOUR_SENDGRID_PASSWORD,
"to" => "you@example.com",
"subject" => "testing from curl",
"html" => "testing body",
"text" => "testing body",
"from" => "you@example.com",
"x-smtpapi" => json_encode($smtpapi);
);
$request = "https://api.sendgrid.com/api/mail.send.json";
// Generate curl request
$session = curl_init($request);
// Tell curl to use HTTP POST
curl_setopt ($session, CURLOPT_POST, true);
// Tell curl that this is the body of the POST
curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
// Tell curl not to return headers, but do return the response
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
// obtain response
$response = curl_exec($session);
curl_close($session);
Однако, вероятно, лучше сделать это с PHP-библиотекой SendGrid
$emails = array("joe@example.org", "sue@example.com");
$sendgrid = new SendGrid(YOUR_SENDGRID_USERNAME, YOUR_SENDGRID_PASSWORD);
$email = new SendGrid\Email();
$email->setTos($emails)->
setFrom('me@bar.com')->
setSubject('Subject goes here')->
setText('Hello World!')->
setHtml('<strong>Hello World!</strong>');
$sendgrid->send($email);
очереди
Наконец, вы можете использовать очередь и отправлять все электронные письма от другого процесса, чтобы ускорить время выполнения, информацию о том, как это сделать, есть в этом ответе Stackru.