In this blog post we learn how php class can create and manage email accounts using the cPanel API. It can send HTTP requests to the cPanel API of a hosting account to perform several types of operations to manage email accounts.
Currently this class has following functions:
- check if a given email account exists
- create a new email account
- get the list of created email accounts
- change the password of an email account
- delete an email account.
Currently this class has following functions:
- check if a given email account exists
- create a new email account
- get the list of created email accounts
- change the password of an email account
- delete an email account.
For use this class first create a file name "class.email.php" without double quote. And copy following code , paste and save.
<?php /* Online PHP Examples with Source Code website: http://4evertutorials.blogspot.com/ */ class cPanelEmailManager { private $cpanelHost; private $cpanelPort; private $username; private $password; private $logcurl; private $cookiefile; private $curlfile; private $emailArray; private $cpsess; /** * Constructor * @param string $user cPanel username * @param string $pass cPanel password * @param string $host cPanel domain * @param int $port cPanel domain */ public function __construct($user,$pass,$host,$port=2083){ $this->cpanelHost = $host; $this->cpanelPort = $port; $this->username = $user; $this->password = $pass; $this->logcurl = false; $this->cookiefile = "cpmm/cpmm_cookie_".rand(99999, 9999999).".txt"; $this->LogIn(); } /** * Checks if an email address exists * @param string $Needle Email address to check * @param bool $FullEmailOnly If false, will return true with or without the domain attached * @return bool */ public function emailExists($Needle, $FullEmailOnly = false){ $Haystack = empty($this->emailArray) ? $this->getEmails() : $this->emailArray; foreach($Haystack as $H){ if($FullEmailOnly === true && $H['email'] == $Needle){ return true; }else if($FullEmailOnly !== true && ($H['user'] == $Needle || $H['email'] == $Needle)){ return true; } } return false; } /** * Creates a new email address * @param string $email Complete mail address to create, ie. myemail@mydomain.com * @param string $password Password for new email * @param string $quota Disk Space Quota, 0 for unlimited * @return bool */ public function createEmail($email,$password,$quota = 0){ if($this->emailExists($email,true)){ return "Email address ".$email." already exist"; } $e = explode("@",$email); $params = 'user='.$this->username.'&pass='.$this->password;; $url = "https://".$this->cpanelHost.":".$this->cpanelPort.$this->cpsess."/json-api/cpanel". "?cpanel_jsonapi_version=2". "&cpanel_jsonapi_func=addpop". "&cpanel_jsonapi_module=Email&". "email=".$e[0]."&". "domain=".$e[1]."&". "password=".urlencode($password)."&". "quota=".$quota; $answer = json_decode($this->Request($url,$params), true); $this->getEmails(true); return ($answer["cpanelresult"]["data"][0]['result'] === 1) ? true : false; } /** * Deletes an email address * @param string $email Complete mail address to delete, ie. myemail@mydomain.com * @return bool */ public function deleteEmail($email){ if(!$this->emailExists($email,true)){ return "Email address ".$email." does not exist"; } $e = explode("@",$email); $params = 'user='.$this->username.'&pass='.$this->password;; $url = "https://".$this->cpanelHost.":".$this->cpanelPort.$this->cpsess."/json-api/cpanel". "?cpanel_jsonapi_version=2". "&cpanel_jsonapi_func=delpop". "&cpanel_jsonapi_module=Email&". "email=".$e[0]."&". "domain=".$e[1]; $answer = json_decode($this->Request($url,$params), true); $this->getEmails(true); return ($answer["cpanelresult"]["data"][0]['result'] === 1) ? true : false; } /** * Changes a password * @param string $email Complete email of account, ie. myemail@mydomain.com * @param string $newPW New password * @return bool */ public function changePW($email, $newPW){ if(!$this->emailExists($email,true)){ return "Email address ".$email." does not exist"; } $e = explode("@",$email); $params = 'user='.$this->username.'&pass='.$this->password;; $url = "https://".$this->cpanelHost.":".$this->cpanelPort.$this->cpsess."/json-api/cpanel". "?cpanel_jsonapi_version=2". "&cpanel_jsonapi_func=passwdpop". "&cpanel_jsonapi_module=Email&". "email=".$e[0]."&". "domain=".$e[1]."&". "password=".urlencode($newPW); $answer = json_decode($this->Request($url,$params), true); $this->getEmails(true); return ($answer["cpanelresult"]["data"][0]['result'] === 1) ? true : false; } /** * Lists all email accounts and their properties * @param int $pageSize Number of results per page * @param int $currentPage Page number to start from * @param bool $paginate Return in pages * @param bool $sort Sort the results * @param bstring $sortby Column to sort by, ie. "email", "_diskused", "mtime", or "domain" * @return array */ public function listEmails($pageSize = 10, $currentPage = 1, $paginate = true, $sort = true, $sortby = "user"){ $params = 'user='.$this->username.'&pass='.$this->password;; $url = "https://".$this->cpanelHost.":".$this->cpanelPort.$this->cpsess."/json-api/cpanel". "?cpanel_jsonapi_version=2". "&cpanel_jsonapi_func=listpopswithdisk". "&cpanel_jsonapi_module=Email". "&api2_paginate=".($paginate === false ? 0 : 1). "&api2_paginate_size=".$pageSize. "&api2_paginate_start=".$currentPage. "&api2_sort=".($sort === false ? 0 : 1). "&api2_sort_column=".$sortby. "&api2_sort_method=alphabet". "&api2_sort_reverse=0"; $answer = $this->Request($url,$params); $emails = json_decode($answer, true); $this->emailArray = $emails["cpanelresult"]["data"]; return $this->emailArray; } /** * Turns cURL logging on * @param int $curlfile Path to curl log file * @return array */ public function logCurl($curlfile = "cpmm/cpmm_curl_log.txt"){ if(!file_exists($curlfile)){ try{ fopen($curlfile, "w"); }catch(Exception $ex){ if(!file_exists($curlfile)){ return $ex.'Cookie file missing.'; exit; } return true; } }else if(!is_writable($curlfile)){ return 'Cookie file not writable.'; exit; } $this->logcurl = true; return true; } /** * Returns a complete list of emails and their properties * @access private */ private function getEmails($refresh = false){ if(!empty($this->emailArray) && !$refresh){ return $this->emailArray; } $params = 'user='.$this->username.'&pass='.$this->password;; $url = "https://".$this->cpanelHost.":".$this->cpanelPort.$this->cpsess."/json-api/cpanel". "?cpanel_jsonapi_version=2". "&cpanel_jsonapi_func=listpopswithdisk". "&cpanel_jsonapi_module=Email"; $answer = $this->Request($url,$params); $emails = json_decode($answer, true); $this->emailArray = $emails["cpanelresult"]["data"]; return $this->emailArray; } /** * Starts a session on the cPanel server * @access private */ private function LogIn(){ $url = 'https://'.$this->cpanelHost.":".$this->cpanelPort."/login/?login_only=1"; $url .= "&user=".$this->username."&pass=".urlencode($this->password); $answer = $this->Request($url); $answer = json_decode($answer, true); if(isset($answer['status']) && $answer['status'] == 1){ $this->cpsess = $answer['security_token']; $this->homepage = 'https://'.$this->cpanelHost.":".$this->cpanelPort.$answer['redirect']; } } /** * Makes an HTTP request * @access private */ private function Request($url,$params=array()){ if($this->logcurl){ $curl_log = fopen($this->curlfile, 'a+'); } if(!file_exists($this->cookiefile)){ try{ fopen($this->cookiefile, "w"); }catch(Exception $ex){ if(!file_exists($this->cookiefile)){ echo $ex.'Cookie file missing.'; exit; } } }else if(!is_writable($this->cookiefile)){ echo 'Cookie file not writable.'; exit; } $ch = curl_init(); $curlOpts = array( CURLOPT_URL => $url, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0', CURLOPT_SSL_VERIFYPEER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_COOKIEJAR => realpath($this->cookiefile), CURLOPT_COOKIEFILE => realpath($this->cookiefile), CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTPHEADER => array( "Host: ".$this->cpanelHost, "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language: en-US,en;q=0.5", "Accept-Encoding: gzip, deflate", "Connection: keep-alive", "Content-Type: application/x-www-form-urlencoded") ); if(!empty($params)){ $curlOpts[CURLOPT_POST] = true; $curlOpts[CURLOPT_POSTFIELDS] = $params; } if($this->logcurl){ $curlOpts[CURLOPT_STDERR] = $curl_log; $curlOpts[CURLOPT_FAILONERROR] = false; $curlOpts[CURLOPT_VERBOSE] = true; } curl_setopt_array($ch,$curlOpts); $answer = curl_exec($ch); if (curl_error($ch)) { echo curl_error($ch); exit; } curl_close($ch); if($this->logcurl){ fclose($curl_log); } return (@gzdecode($answer)) ? gzdecode($answer) : $answer; } } ?>
Following is working example:
<?php /* Online PHP Examples with Source Code website: http://4evertutorials.blogspot.com/ */ // include the library require("class.email.php"); // cPanel domain or IP $host = "mywebsite.com"; // cPanel Username $user = "cPanel_Username"; // cPanel Password $pass = "cPanel_Password"; if($host == "mywebsite.com"){ echo "Put your cPanel credentials in and remove line ".__LINE__." from the example script before running."; exit; } // initialize the class $cpmm = new cPanelEmailManager($user, $pass, $host); // Create a new email address $email = "newemail@mywebsite.com"; $password = "mybadpassword"; $result = $cpmm->createEmail($email,$password); echo "Email ($email) ".($result ? "successfully" : "not")." created.
"; // Check if an email exists $email = "newemail@mywebsite.com"; $result = $cpmm->emailExists($email); echo "Email ($email) ".($result ? "does" : "does not")." exist.
"; // Change an email password $email = "newemail@mywebsite.com"; $newPassword = "mybetterpassword"; $result = $cpmm->changePW($email,$newPassword); echo ($result ? "Changed" : "Could not change")." password for email $email.
"; // Delete an email account $email = "newemail@mywebsite.com"; $result = $cpmm->deleteEmail($email); echo ($result ? "Deleted" : "Could not delete")." email account $email.
"; // List email accounts $pageSize = 15; $pageNo = 1; $result = $cpmm->listEmails($pageSize, $pageNo); var_dump($result); ?>
5 comments:
Thank you very much!!! It's what i was looking for!
You just missing in construct part:
$this->curlfile = "logs/cpmm_curl_log.txt";
Thanks! But I'm getting the following errors:
Warning: fopen(cpmm/cpmm_cookie_7223868.txt): failed to open stream: No such file or directory in /home/celcit/public_html/mailer2/app/class.email.php on line 220
Warning: curl_setopt_array(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set in /home/celcit/public_html/mailer2/app/class.email.php on line 255
Warning: fopen(cpmm/cpmm_cookie_7223868.txt): failed to open stream: No such file or directory in /home/celcit/public_html/mailer2/app/class.email.php on line 220
Warning: curl_setopt_array(): CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set in /home/celcit/public_html/mailer2/app/class.email.php on line 255
array(2) { ["reason"]=> string(13) "Access denied" ["result"]=> string(1) "0" }
Hi @pablo,
You have "Access denied" as reason in you error,
you need to add valid values in $host, $user, $pass variables.
hi my friend i wish to help me to resolve my problem i try this code you explain it so how can i add html form so as to add delete changpass emails and when i try it in my cpanel giv me "Put your cPanel credentials in and remove line ".__LINE__." from the example script before running."which line you mean to Chang it thanx alot
Post a Comment