Вашият въпрос е разделен на две части:
- Как да извадя своя списък с имейли от MailChimp?
- Как мога да изпращам имейли до произволни имейл адреси?
Първото парче е най-важното тук. Втората част има тон възможни отговори и трябва да бъде доста лесна за изпълнение.
Получаване на списъка от MailChimp
MailChimp предоставя API, който е от решаващо значение. В момента те работят върху v3.0, но v2.0 все още е маркиран като „текущ“, така че ще разчитаме на тази версия на API. За да използвате API, MailChimp препоръчва няколко пакета на трети страни. За този пример използвам mailchimp-api, който може да се инсталира с помощта на composer:
$ 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 доставчик и SwiftMailer, за да се свържете с него. Други алтернативи биха били използването на функцията mail()
на PHP или друга библиотека като 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