| 1 |
<?php |
| 2 |
|
| 3 |
require_once 'Mailchimp/Folders.php'; |
| 4 |
require_once 'Mailchimp/Templates.php'; |
| 5 |
require_once 'Mailchimp/Users.php'; |
| 6 |
require_once 'Mailchimp/Helper.php'; |
| 7 |
require_once 'Mailchimp/Mobile.php'; |
| 8 |
require_once 'Mailchimp/Conversations.php'; |
| 9 |
require_once 'Mailchimp/Ecomm.php'; |
| 10 |
require_once 'Mailchimp/Neapolitan.php'; |
| 11 |
require_once 'Mailchimp/Lists.php'; |
| 12 |
require_once 'Mailchimp/Campaigns.php'; |
| 13 |
require_once 'Mailchimp/Vip.php'; |
| 14 |
require_once 'Mailchimp/Reports.php'; |
| 15 |
require_once 'Mailchimp/Gallery.php'; |
| 16 |
require_once 'Mailchimp/Goal.php'; |
| 17 |
require_once 'Mailchimp/Exceptions.php'; |
| 18 |
|
| 19 |
class Mailchimp { |
| 20 |
|
| 21 |
public $apikey; |
| 22 |
public $ch; |
| 23 |
public $root = 'https://api.mailchimp.com/2.0'; |
| 24 |
public $debug = false; |
| 25 |
|
| 26 |
public static $error_map = array( |
| 27 |
"ValidationError" => "Mailchimp_ValidationError", |
| 28 |
"ServerError_MethodUnknown" => "Mailchimp_ServerError_MethodUnknown", |
| 29 |
"ServerError_InvalidParameters" => "Mailchimp_ServerError_InvalidParameters", |
| 30 |
"Unknown_Exception" => "Mailchimp_Unknown_Exception", |
| 31 |
"Request_TimedOut" => "Mailchimp_Request_TimedOut", |
| 32 |
"Zend_Uri_Exception" => "Mailchimp_Zend_Uri_Exception", |
| 33 |
"PDOException" => "Mailchimp_PDOException", |
| 34 |
"Avesta_Db_Exception" => "Mailchimp_Avesta_Db_Exception", |
| 35 |
"XML_RPC2_Exception" => "Mailchimp_XML_RPC2_Exception", |
| 36 |
"XML_RPC2_FaultException" => "Mailchimp_XML_RPC2_FaultException", |
| 37 |
"Too_Many_Connections" => "Mailchimp_Too_Many_Connections", |
| 38 |
"Parse_Exception" => "Mailchimp_Parse_Exception", |
| 39 |
"User_Unknown" => "Mailchimp_User_Unknown", |
| 40 |
"User_Disabled" => "Mailchimp_User_Disabled", |
| 41 |
"User_DoesNotExist" => "Mailchimp_User_DoesNotExist", |
| 42 |
"User_NotApproved" => "Mailchimp_User_NotApproved", |
| 43 |
"Invalid_ApiKey" => "Mailchimp_Invalid_ApiKey", |
| 44 |
"User_UnderMaintenance" => "Mailchimp_User_UnderMaintenance", |
| 45 |
"Invalid_AppKey" => "Mailchimp_Invalid_AppKey", |
| 46 |
"Invalid_IP" => "Mailchimp_Invalid_IP", |
| 47 |
"User_DoesExist" => "Mailchimp_User_DoesExist", |
| 48 |
"User_InvalidRole" => "Mailchimp_User_InvalidRole", |
| 49 |
"User_InvalidAction" => "Mailchimp_User_InvalidAction", |
| 50 |
"User_MissingEmail" => "Mailchimp_User_MissingEmail", |
| 51 |
"User_CannotSendCampaign" => "Mailchimp_User_CannotSendCampaign", |
| 52 |
"User_MissingModuleOutbox" => "Mailchimp_User_MissingModuleOutbox", |
| 53 |
"User_ModuleAlreadyPurchased" => "Mailchimp_User_ModuleAlreadyPurchased", |
| 54 |
"User_ModuleNotPurchased" => "Mailchimp_User_ModuleNotPurchased", |
| 55 |
"User_NotEnoughCredit" => "Mailchimp_User_NotEnoughCredit", |
| 56 |
"MC_InvalidPayment" => "Mailchimp_MC_InvalidPayment", |
| 57 |
"List_DoesNotExist" => "Mailchimp_List_DoesNotExist", |
| 58 |
"List_InvalidInterestFieldType" => "Mailchimp_List_InvalidInterestFieldType", |
| 59 |
"List_InvalidOption" => "Mailchimp_List_InvalidOption", |
| 60 |
"List_InvalidUnsubMember" => "Mailchimp_List_InvalidUnsubMember", |
| 61 |
"List_InvalidBounceMember" => "Mailchimp_List_InvalidBounceMember", |
| 62 |
"List_AlreadySubscribed" => "Mailchimp_List_AlreadySubscribed", |
| 63 |
"List_NotSubscribed" => "Mailchimp_List_NotSubscribed", |
| 64 |
"List_InvalidImport" => "Mailchimp_List_InvalidImport", |
| 65 |
"MC_PastedList_Duplicate" => "Mailchimp_MC_PastedList_Duplicate", |
| 66 |
"MC_PastedList_InvalidImport" => "Mailchimp_MC_PastedList_InvalidImport", |
| 67 |
"Email_AlreadySubscribed" => "Mailchimp_Email_AlreadySubscribed", |
| 68 |
"Email_AlreadyUnsubscribed" => "Mailchimp_Email_AlreadyUnsubscribed", |
| 69 |
"Email_NotExists" => "Mailchimp_Email_NotExists", |
| 70 |
"Email_NotSubscribed" => "Mailchimp_Email_NotSubscribed", |
| 71 |
"List_MergeFieldRequired" => "Mailchimp_List_MergeFieldRequired", |
| 72 |
"List_CannotRemoveEmailMerge" => "Mailchimp_List_CannotRemoveEmailMerge", |
| 73 |
"List_Merge_InvalidMergeID" => "Mailchimp_List_Merge_InvalidMergeID", |
| 74 |
"List_TooManyMergeFields" => "Mailchimp_List_TooManyMergeFields", |
| 75 |
"List_InvalidMergeField" => "Mailchimp_List_InvalidMergeField", |
| 76 |
"List_InvalidInterestGroup" => "Mailchimp_List_InvalidInterestGroup", |
| 77 |
"List_TooManyInterestGroups" => "Mailchimp_List_TooManyInterestGroups", |
| 78 |
"Campaign_DoesNotExist" => "Mailchimp_Campaign_DoesNotExist", |
| 79 |
"Campaign_StatsNotAvailable" => "Mailchimp_Campaign_StatsNotAvailable", |
| 80 |
"Campaign_InvalidAbsplit" => "Mailchimp_Campaign_InvalidAbsplit", |
| 81 |
"Campaign_InvalidContent" => "Mailchimp_Campaign_InvalidContent", |
| 82 |
"Campaign_InvalidOption" => "Mailchimp_Campaign_InvalidOption", |
| 83 |
"Campaign_InvalidStatus" => "Mailchimp_Campaign_InvalidStatus", |
| 84 |
"Campaign_NotSaved" => "Mailchimp_Campaign_NotSaved", |
| 85 |
"Campaign_InvalidSegment" => "Mailchimp_Campaign_InvalidSegment", |
| 86 |
"Campaign_InvalidRss" => "Mailchimp_Campaign_InvalidRss", |
| 87 |
"Campaign_InvalidAuto" => "Mailchimp_Campaign_InvalidAuto", |
| 88 |
"MC_ContentImport_InvalidArchive" => "Mailchimp_MC_ContentImport_InvalidArchive", |
| 89 |
"Campaign_BounceMissing" => "Mailchimp_Campaign_BounceMissing", |
| 90 |
"Campaign_InvalidTemplate" => "Mailchimp_Campaign_InvalidTemplate", |
| 91 |
"Invalid_EcommOrder" => "Mailchimp_Invalid_EcommOrder", |
| 92 |
"Absplit_UnknownError" => "Mailchimp_Absplit_UnknownError", |
| 93 |
"Absplit_UnknownSplitTest" => "Mailchimp_Absplit_UnknownSplitTest", |
| 94 |
"Absplit_UnknownTestType" => "Mailchimp_Absplit_UnknownTestType", |
| 95 |
"Absplit_UnknownWaitUnit" => "Mailchimp_Absplit_UnknownWaitUnit", |
| 96 |
"Absplit_UnknownWinnerType" => "Mailchimp_Absplit_UnknownWinnerType", |
| 97 |
"Absplit_WinnerNotSelected" => "Mailchimp_Absplit_WinnerNotSelected", |
| 98 |
"Invalid_Analytics" => "Mailchimp_Invalid_Analytics", |
| 99 |
"Invalid_DateTime" => "Mailchimp_Invalid_DateTime", |
| 100 |
"Invalid_Email" => "Mailchimp_Invalid_Email", |
| 101 |
"Invalid_SendType" => "Mailchimp_Invalid_SendType", |
| 102 |
"Invalid_Template" => "Mailchimp_Invalid_Template", |
| 103 |
"Invalid_TrackingOptions" => "Mailchimp_Invalid_TrackingOptions", |
| 104 |
"Invalid_Options" => "Mailchimp_Invalid_Options", |
| 105 |
"Invalid_Folder" => "Mailchimp_Invalid_Folder", |
| 106 |
"Invalid_URL" => "Mailchimp_Invalid_URL", |
| 107 |
"Module_Unknown" => "Mailchimp_Module_Unknown", |
| 108 |
"MonthlyPlan_Unknown" => "Mailchimp_MonthlyPlan_Unknown", |
| 109 |
"Order_TypeUnknown" => "Mailchimp_Order_TypeUnknown", |
| 110 |
"Invalid_PagingLimit" => "Mailchimp_Invalid_PagingLimit", |
| 111 |
"Invalid_PagingStart" => "Mailchimp_Invalid_PagingStart", |
| 112 |
"Max_Size_Reached" => "Mailchimp_Max_Size_Reached", |
| 113 |
"MC_SearchException" => "Mailchimp_MC_SearchException", |
| 114 |
"Goal_SaveFailed" => "Mailchimp_Goal_SaveFailed", |
| 115 |
"Conversation_DoesNotExist" => "Mailchimp_Conversation_DoesNotExist", |
| 116 |
"Conversation_ReplySaveFailed" => "Mailchimp_Conversation_ReplySaveFailed", |
| 117 |
"File_Not_Found_Exception" => "Mailchimp_File_Not_Found_Exception", |
| 118 |
"Folder_Not_Found_Exception" => "Mailchimp_Folder_Not_Found_Exception", |
| 119 |
"Folder_Exists_Exception" => "Mailchimp_Folder_Exists_Exception" |
| 120 |
); |
| 121 |
|
| 122 |
public function __construct($apikey=null, $opts=array()) { |
| 123 |
if (!$apikey) { |
| 124 |
$apikey = getenv('MAILCHIMP_APIKEY'); |
| 125 |
} |
| 126 |
|
| 127 |
if (!$apikey) { |
| 128 |
$apikey = $this->readConfigs(); |
| 129 |
} |
| 130 |
|
| 131 |
if (!$apikey) { |
| 132 |
throw new Mailchimp_Error('You must provide a MailChimp API key'); |
| 133 |
} |
| 134 |
|
| 135 |
$this->apikey = $apikey; |
| 136 |
$dc = "us1"; |
| 137 |
|
| 138 |
if (strstr($this->apikey, "-")){ |
| 139 |
list($key, $dc) = explode("-", $this->apikey, 2); |
| 140 |
if (!$dc) { |
| 141 |
$dc = "us1"; |
| 142 |
} |
| 143 |
} |
| 144 |
|
| 145 |
$this->root = str_replace('https://api', 'https://' . $dc . '.api', $this->root); |
| 146 |
$this->root = rtrim($this->root, '/') . '/'; |
| 147 |
|
| 148 |
if (!isset($opts['timeout']) || !is_int($opts['timeout'])){ |
| 149 |
$opts['timeout'] = 600; |
| 150 |
} |
| 151 |
if (isset($opts['debug'])){ |
| 152 |
$this->debug = true; |
| 153 |
} |
| 154 |
|
| 155 |
|
| 156 |
$this->ch = curl_init(); |
| 157 |
|
| 158 |
if (isset($opts['CURLOPT_FOLLOWLOCATION']) && $opts['CURLOPT_FOLLOWLOCATION'] === true) { |
| 159 |
curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true); |
| 160 |
} |
| 161 |
|
| 162 |
curl_setopt($this->ch, CURLOPT_USERAGENT, 'MailChimp-PHP/2.0.6'); |
| 163 |
curl_setopt($this->ch, CURLOPT_POST, true); |
| 164 |
curl_setopt($this->ch, CURLOPT_HEADER, false); |
| 165 |
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true); |
| 166 |
curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30); |
| 167 |
curl_setopt($this->ch, CURLOPT_TIMEOUT, $opts['timeout']); |
| 168 |
|
| 169 |
|
| 170 |
$this->folders = new Mailchimp_Folders($this); |
| 171 |
$this->templates = new Mailchimp_Templates($this); |
| 172 |
$this->users = new Mailchimp_Users($this); |
| 173 |
$this->helper = new Mailchimp_Helper($this); |
| 174 |
$this->mobile = new Mailchimp_Mobile($this); |
| 175 |
$this->conversations = new Mailchimp_Conversations($this); |
| 176 |
$this->ecomm = new Mailchimp_Ecomm($this); |
| 177 |
$this->neapolitan = new Mailchimp_Neapolitan($this); |
| 178 |
$this->lists = new Mailchimp_Lists($this); |
| 179 |
$this->campaigns = new Mailchimp_Campaigns($this); |
| 180 |
$this->vip = new Mailchimp_Vip($this); |
| 181 |
$this->reports = new Mailchimp_Reports($this); |
| 182 |
$this->gallery = new Mailchimp_Gallery($this); |
| 183 |
$this->goal = new Mailchimp_Goal($this); |
| 184 |
} |
| 185 |
|
| 186 |
public function __destruct() { |
| 187 |
if(is_resource($this->ch)) { |
| 188 |
curl_close($this->ch); |
| 189 |
} |
| 190 |
} |
| 191 |
|
| 192 |
public function call($url, $params) { |
| 193 |
$params['apikey'] = $this->apikey; |
| 194 |
|
| 195 |
$params = json_encode($params); |
| 196 |
$ch = $this->ch; |
| 197 |
|
| 198 |
curl_setopt($ch, CURLOPT_URL, $this->root . $url . '.json'); |
| 199 |
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); |
| 200 |
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); |
| 201 |
curl_setopt($ch, CURLOPT_VERBOSE, $this->debug); |
| 202 |
|
| 203 |
$start = microtime(true); |
| 204 |
$this->log('Call to ' . $this->root . $url . '.json: ' . $params); |
| 205 |
if($this->debug) { |
| 206 |
$curl_buffer = fopen('php://memory', 'w+'); |
| 207 |
curl_setopt($ch, CURLOPT_STDERR, $curl_buffer); |
| 208 |
} |
| 209 |
|
| 210 |
$response_body = curl_exec($ch); |
| 211 |
|
| 212 |
$info = curl_getinfo($ch); |
| 213 |
$time = microtime(true) - $start; |
| 214 |
if($this->debug) { |
| 215 |
rewind($curl_buffer); |
| 216 |
$this->log(stream_get_contents($curl_buffer)); |
| 217 |
fclose($curl_buffer); |
| 218 |
} |
| 219 |
$this->log('Completed in ' . number_format($time * 1000, 2) . 'ms'); |
| 220 |
$this->log('Got response: ' . $response_body); |
| 221 |
|
| 222 |
if(curl_error($ch)) { |
| 223 |
throw new Mailchimp_HttpError("API call to $url failed: " . curl_error($ch)); |
| 224 |
} |
| 225 |
$result = json_decode($response_body, true); |
| 226 |
|
| 227 |
if(floor($info['http_code'] / 100) >= 4) { |
| 228 |
throw $this->castError($result); |
| 229 |
} |
| 230 |
|
| 231 |
return $result; |
| 232 |
} |
| 233 |
|
| 234 |
public function readConfigs() { |
| 235 |
$paths = array('~/.mailchimp.key', '/etc/mailchimp.key'); |
| 236 |
foreach($paths as $path) { |
| 237 |
if(file_exists($path)) { |
| 238 |
$apikey = trim(file_get_contents($path)); |
| 239 |
if ($apikey) { |
| 240 |
return $apikey; |
| 241 |
} |
| 242 |
} |
| 243 |
} |
| 244 |
return false; |
| 245 |
} |
| 246 |
|
| 247 |
public function castError($result) { |
| 248 |
if ($result['status'] !== 'error' || !$result['name']) { |
| 249 |
throw new Mailchimp_Error('We received an unexpected error: ' . json_encode($result)); |
| 250 |
} |
| 251 |
|
| 252 |
$class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Mailchimp_Error'; |
| 253 |
return new $class($result['error'], $result['code']); |
| 254 |
} |
| 255 |
|
| 256 |
public function log($msg) { |
| 257 |
if ($this->debug) { |
| 258 |
error_log($msg); |
| 259 |
} |
| 260 |
} |
| 261 |
} |
| 262 |
|
| 263 |
|
| 264 |
|