secure = $secure; $this->apiUrl = parse_url("http://api.mailchimp.com/" . $this->version . "/?output=php"); $this->api_key = $apikey; } function setTimeout($seconds){ if (is_int($seconds)){ $this->timeout = $seconds; return true; } } function getTimeout(){ return $this->timeout; } function useSecure($val){ if ($val===true){ $this->secure = true; } else { $this->secure = false; } } function lists($filters=array ( ), $start=0, $limit=25) { $params = array(); $params["filters"] = $filters; $params["start"] = $start; $params["limit"] = $limit; return $this->callServer("lists", $params); } function listMergeVars($id) { $params = array(); $params["id"] = $id; return $this->callServer("listMergeVars", $params); } function listMergeVarAdd($id, $tag, $name, $options=array ( )) { $params = array(); $params["id"] = $id; $params["tag"] = $tag; $params["name"] = $name; $params["options"] = $options; return $this->callServer("listMergeVarAdd", $params); } function listMergeVarUpdate($id, $tag, $options) { $params = array(); $params["id"] = $id; $params["tag"] = $tag; $params["options"] = $options; return $this->callServer("listMergeVarUpdate", $params); } function listMergeVarDel($id, $tag) { $params = array(); $params["id"] = $id; $params["tag"] = $tag; return $this->callServer("listMergeVarDel", $params); } function listInterestGroupings($id) { $params = array(); $params["id"] = $id; return $this->callServer("listInterestGroupings", $params); } function listInterestGroupAdd($id, $group_name, $grouping_id=NULL) { $params = array(); $params["id"] = $id; $params["group_name"] = $group_name; $params["grouping_id"] = $grouping_id; return $this->callServer("listInterestGroupAdd", $params); } function listInterestGroupDel($id, $group_name, $grouping_id=NULL) { $params = array(); $params["id"] = $id; $params["group_name"] = $group_name; $params["grouping_id"] = $grouping_id; return $this->callServer("listInterestGroupDel", $params); } function listInterestGroupUpdate($id, $old_name, $new_name, $grouping_id=NULL) { $params = array(); $params["id"] = $id; $params["old_name"] = $old_name; $params["new_name"] = $new_name; $params["grouping_id"] = $grouping_id; return $this->callServer("listInterestGroupUpdate", $params); } function listInterestGroupingAdd($id, $name, $type, $groups) { $params = array(); $params["id"] = $id; $params["name"] = $name; $params["type"] = $type; $params["groups"] = $groups; return $this->callServer("listInterestGroupingAdd", $params); } function listInterestGroupingUpdate($grouping_id, $name, $value) { $params = array(); $params["grouping_id"] = $grouping_id; $params["name"] = $name; $params["value"] = $value; return $this->callServer("listInterestGroupingUpdate", $params); } function listInterestGroupingDel($grouping_id) { $params = array(); $params["grouping_id"] = $grouping_id; return $this->callServer("listInterestGroupingDel", $params); } function listSubscribe($id, $email_address, $merge_vars=NULL, $email_type='html', $double_optin=true, $update_existing=false, $replace_interests=true, $send_welcome=false) { $params = array(); $params["id"] = $id; $params["email_address"] = $email_address; $params["merge_vars"] = $merge_vars; $params["email_type"] = $email_type; $params["double_optin"] = $double_optin; $params["update_existing"] = $update_existing; $params["replace_interests"] = $replace_interests; $params["send_welcome"] = $send_welcome; return $this->callServer("listSubscribe", $params); } function listUnsubscribe($id, $email_address, $delete_member=false, $send_goodbye=true, $send_notify=true) { $params = array(); $params["id"] = $id; $params["email_address"] = $email_address; $params["delete_member"] = $delete_member; $params["send_goodbye"] = $send_goodbye; $params["send_notify"] = $send_notify; return $this->callServer("listUnsubscribe", $params); } function listUpdateMember($id, $email_address, $merge_vars, $email_type='', $replace_interests=true) { $params = array(); $params["id"] = $id; $params["email_address"] = $email_address; $params["merge_vars"] = $merge_vars; $params["email_type"] = $email_type; $params["replace_interests"] = $replace_interests; return $this->callServer("listUpdateMember", $params); } function listBatchSubscribe($id, $batch, $double_optin=true, $update_existing=false, $replace_interests=true) { $params = array(); $params["id"] = $id; $params["batch"] = $batch; $params["double_optin"] = $double_optin; $params["update_existing"] = $update_existing; $params["replace_interests"] = $replace_interests; return $this->callServer("listBatchSubscribe", $params); } function listBatchUnsubscribe($id, $emails, $delete_member=false, $send_goodbye=true, $send_notify=false) { $params = array(); $params["id"] = $id; $params["emails"] = $emails; $params["delete_member"] = $delete_member; $params["send_goodbye"] = $send_goodbye; $params["send_notify"] = $send_notify; return $this->callServer("listBatchUnsubscribe", $params); } function listMembers($id, $status='subscribed', $since=NULL, $start=0, $limit=100) { $params = array(); $params["id"] = $id; $params["status"] = $status; $params["since"] = $since; $params["start"] = $start; $params["limit"] = $limit; return $this->callServer("listMembers", $params); } function listMemberInfo($id, $email_address) { $params = array(); $params["id"] = $id; $params["email_address"] = $email_address; return $this->callServer("listMemberInfo", $params); } function listMemberActivity($id, $email_address) { $params = array(); $params["id"] = $id; $params["email_address"] = $email_address; return $this->callServer("listMemberActivity", $params); } function getAccountDetails() { $params = array(); return $this->callServer("getAccountDetails", $params); } function listsForEmail($email_address) { $params = array(); $params["email_address"] = $email_address; return $this->callServer("listsForEmail", $params); } function campaignsForEmail($email_address) { $params = array(); $params["email_address"] = $email_address; return $this->callServer("campaignsForEmail", $params); } /** * "Ping" the MailChimp API - a simple method you can call that will return a constant value as long as everything is good. Note * than unlike most all of our methods, we don't throw an Exception if we are having issues. You will simply receive a different * string back that will explain our view on what is going on. * * @section Helper * @example xml-rpc_ping.php * * @return string returns "Everything's Chimpy!" if everything is chimpy, otherwise returns an error message */ function ping() { $params = array(); return $this->callServer("ping", $params); } /** * Internal function - proxy method for certain XML-RPC calls | DO NOT CALL * @param mixed Method to call, with any parameters to pass along * @return mixed the result of the call */ function callMethod() { $params = array(); return $this->callServer("callMethod", $params); } /** * Actually connect to the server and call the requested methods, parsing the result * You should never have to call this function manually */ function callServer($method, $params) { $dc = "us1"; if (strstr($this->api_key,"-")){ list($key, $dc) = explode("-",$this->api_key,2); if (!$dc) $dc = "us1"; } $host = $dc.".".$this->apiUrl["host"]; $params["apikey"] = $this->api_key; $this->errorMessage = ""; $this->errorCode = ""; $sep_changed = false; //sigh, apparently some distribs change this to & by default if (ini_get("arg_separator.output")!="&"){ $sep_changed = true; $orig_sep = ini_get("arg_separator.output"); ini_set("arg_separator.output", "&"); } $post_vars = $this->httpBuildQuery($params); if ($sep_changed){ ini_set("arg_separator.output", $orig_sep); } $payload = "POST " . $this->apiUrl["path"] . "?" . $this->apiUrl["query"] . "&method=" . $method . " HTTP/1.0\r\n"; $payload .= "Host: " . $host . "\r\n"; $payload .= "User-Agent: MCAPIwp/" . $this->version ."\r\n"; $payload .= "Content-type: application/x-www-form-urlencoded\r\n"; $payload .= "Content-length: " . strlen($post_vars) . "\r\n"; $payload .= "Connection: close \r\n\r\n"; $payload .= $post_vars; ob_start(); if ($this->secure){ $sock = @fsockopen("ssl://".$host, 443, $errno, $errstr, 30); } else { $sock = @fsockopen($host, 80, $errno, $errstr, 30); } if(!$sock) { $this->errorMessage = "Could not connect (ERR $errno: $errstr)"; $this->errorCode = "-99"; ob_end_clean(); return false; } $response = ""; fwrite($sock, $payload); stream_set_timeout($sock, $this->timeout); $info = stream_get_meta_data($sock); while ((!feof($sock)) && (!$info["timed_out"])) { $response .= fread($sock, $this->chunkSize); $info = stream_get_meta_data($sock); } fclose($sock); ob_end_clean(); if ($info["timed_out"]) { $this->errorMessage = "Could not read response (timed out)"; $this->errorCode = -98; return false; } list($headers, $response) = explode("\r\n\r\n", $response, 2); $headers = explode("\r\n", $headers); $errored = false; foreach($headers as $h){ if (substr($h,0,26)==="X-MailChimp-API-Error-Code"){ $errored = true; $error_code = trim(substr($h,27)); break; } } if(ini_get("magic_quotes_runtime")) $response = stripslashes($response); $serial = unserialize($response); if($response && $serial === false) { $response = array("error" => "Bad Response. Got This: " . $response, "code" => "-99"); } else { $response = $serial; } if($errored && is_array($response) && isset($response["error"])) { $this->errorMessage = $response["error"]; $this->errorCode = $response["code"]; return false; } elseif($errored){ $this->errorMessage = "No error message was found"; $this->errorCode = $error_code; return false; } return $response; } /** * Re-implement http_build_query for systems that do not already have it */ function httpBuildQuery($params, $key=null) { $ret = array(); foreach((array) $params as $name => $val) { $name = urlencode($name); if($key !== null) { $name = $key . "[" . $name . "]"; } if(is_array($val) || is_object($val)) { $ret[] = $this->httpBuildQuery($val, $name); } elseif($val !== null) { $ret[] = $name . "=" . urlencode($val); } } return implode("&", $ret); } } ?>