Ваш вопрос разбит на две части:
- Как получить список адресов электронной почты из MailChimp?
- Как я могу отправлять электронные письма на произвольные адреса электронной почты?
Первый блок здесь самый важный. Второй фрагмент содержит тонну возможных ответов, и его должно быть довольно легко выполнить.
Получение списка из MailChimp
MailChimp предоставляет критически важный API. В настоящее время они работают над версией 3.0, но версия 2.0 по-прежнему помечена как «текущая», поэтому мы будем полагаться на эту версию API. Для использования API MailChimp рекомендует несколько сторонних пакетов. В этом примере я использую mailchimp-api, который можно установить с помощью композитора:
$ composer require drewm/mailchimp-api
Чтобы пройти аутентификацию в MailChimp, вам понадобится ключ API. MailChimp предоставляет полные инструкции для получения ключа API, но краткая версия это:
Щелкните имя своего профиля, чтобы развернуть панель учетной записи, и выберите «Учетная запись».
Щелкните раскрывающееся меню «Дополнительно» и выберите «Ключи API».
Скопируйте существующий ключ API или нажмите кнопку «Создать ключ».
Назовите свой ключ описательно, чтобы вы знали, какое приложение использует этот ключ.
Затем вам нужен ваш идентификатор списка для списка, из которого вы хотите получать электронные письма. Опять же, MailChimp предоставляет лучшую документацию для этого. . Идентификатор моего списка представлял собой строку из 10 символов, содержащую как буквы, так и цифры.
Наконец, мы пишем PHP:
$apiKey = /*Your API key*/;
$listId = /*Your List ID*/;
$MailChimp = new \Drewm\MailChimp($apiKey);
$args = array(
'id' => $listId,
);
$result = $MailChimp->call('lists/members', $args);
//Check for any errors first, if none have occured, build the email list.
if(isset($result['status']) && $result['status'] == 'error'){
throw new Exception('call to Mailchimp API has failed.');
} else {
$emails = array();
//Build an array of emails for users that are currently subscribed.
foreach($result['data'] as $recipient){
if($recipient['status'] == 'subscribed' && !empty($recipient['email'])){
$emails[] = $recipient['email'];
}
}
}
$MailChimp->call('lists/members', $args)
возвращает очень объемный ответ JSON с много интересной информации. Если вы сохраняли персонализированную информацию через настройки слияния в MailChimp, они будут доступны в этом ответе JSON. Однако, чтобы сделать этот пример максимально простым, я только проверил, подписан ли пользователь и сохранил ли его адрес электронной почты.
В конце этого блока $emails
сохранит все адреса электронной почты в вашем списке. Поскольку при этом каждый раз вызывается API, любой, кто отпишется от вашей рассылки в MailChimp, также будет удален здесь.
На этом этапе может возникнуть возможная ошибка. Если у вас большой список (я тестировал только 4), вы можете столкнуться с проблемой памяти, когда PHP пытается построить огромный массив $emails
. Если вы столкнулись с этой проблемой, вам следует разделить чтение электронных писем на более мелкие блоки и отправлять такие электронные письма.
Отправка массовой электронной почты с помощью PHP
Другие рекомендуют использовать Mandrill для массовой рассылки электронной почты. Это плохая идея. Mandrill — это дочерняя служба MailChimp, предназначенная для отправки транзакционных em> электронная почта — MailChimp предназначен для массовых рассылок (например, информационных бюллетеней).
Существует множество способов отправки электронных писем с помощью PHP, я предпочитаю использовать Sendgrid в качестве провайдера SMTP и < href="http://swiftmailer.org/" rel="nofollow noreferrer">SwiftMailer для подключения к нему. Другими альтернативами могут быть использование PHP-функции mail()
или другой библиотеки, такой как PHPMailer.
Вы можете установить SwiftMailer с помощью Composer:
$ composer require swiftmailer/swiftmailer @stable
Я более подробно расскажу о службах SwiftMailer и SMTP (хотя и в немного другом контексте) в этот вопрос а>. Но этот пример сделает то, что нужно.
$sendgridUser = /*SendGridUsername*/;
$sendgridPassword = /*SendGridPassword*/;
$subject = "Thank you for using MailChimp Lists!";
$fromAddress = "[email protected]";
$fromName = "Hayden Pierce";
$body = file_get_contents(/*path to content (body.html)*/);
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
->setUsername($sendgridUser)
->setPassword($sendgridPassword)
;
foreach($emails as $email){
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject($subject)
->setFrom(array($fromAddress => $fromName))
->setTo($email)
->setBody($body);
$mailer->send($message);
exit();
}
Для простоты я прочитал все тело из статического HTML-файла. Вы можете рассмотреть возможность использования механизма шаблонов, такого как Twig, чтобы лучше реализовать его с помощью шаблонов.
Весь этот код вместе выглядит так:
//Loading in composer dependencies
require "vendor/autoload.php";
//Provided by Mailchimp account settings
$apiKey = /*MailChimp API keys*/;
$listId = /*MailChimp List id*/;
$sendgridUser = /*SendGridUser*/;
$sendgridPassword = /*SendGridPassword*/;
$subject = /*The subject line of your email*/;
$fromAddress = /*The email address for your FROM line*/;
$fromName = /*The name in your FROM line*/;
$body = file_get_contents(/*path to your html content*/);
$MailChimp = new \Drewm\MailChimp($apiKey);
$args = array(
'id' => $listId,
);
$result = $MailChimp->call('lists/members', $args);
//Check for any errors first, if none have occurred, build the email list.
if(isset($result['status']) && $result['status'] == 'error'){
throw new Exception('call to Mailchimp API has failed.');
} else {
$emails = array();
//Build an array of emails for users that are currently subscribed.
foreach($result['data'] as $recipient){
if($recipient['status'] == 'subscribed' && !empty($recipient['email'])){
$emails[] = $recipient['email'];
}
}
}
//Setup for sending emails to an arbitrary list of emails using Sendgrid.
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
->setUsername($sendgridUser)
->setPassword($sendgridPassword)
;
foreach($emails as $email){
//Send emails to each user.
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject($subject)
->setFrom(array($fromAddress => $fromName))
->setTo($email)
->setBody($body);
$mailer->send($message);
}
person
HPierce
schedule
20.08.2015