I have a larger Zimbra class that I created, but am not quite ready to share with the world, so here are bits and pieces to get an AuthTok and create an account. Hope it helps.
Code:
$adminUser = "user@host.com";
$adminPass = "password";
$adminServer = "zenoss.example.com";
// Auth to the server and get auth token
$data = array(
"Header" => array(
"_jsns" => "urn:zimbra",
"session" => null,
),
"Body" => array(
"AuthRequest" => array(
"_jsns" => "urn:zimbraAdmin",
"name" => $adminUser,
"password" => $adminPass,
),
),
);
$ret = dorequest($data);
$authtok = $ret['authToken'][0]['_content'];
/********************************************************************
* Zimbra: CreateAccountRequest
* arr = array(
* 'name' => email address to create
* 'password' => password to set on new account
* );
*/
function zimbra_CreateAccountRequest($authtok, $arr) {
$data = array(
"Header" => array(
"context" => array(
"_jsns" => "urn:zimbra",
"authToken" => array(
"_content" => $authtok,
),
),
),
"Body" => array(
"CreateAccountRequest" => array(
"_jsns" => "urn:zimbraAdmin",
),
),
);
foreach ($arr as $key => $val) {
if ($key == 'a') {
$data['Body']['CreateAccountRequest'][$key] = $val;
} else {
$data['Body']['CreateAccountRequest'][$key] =
array('_content' => $val);
}
}
print_r($data);
$acct = array();
$rv = $dorequest($data);
return $rv;
}
function dorequest($data, $admin=true, $strip=true) {
$js = json_encode($data);
$url = ($admin ?
sprintf("https://%s:7071/service/admin/soap/", $adminServer) :
sprintf("https://%s/service/soap/", $adminServer)
);
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $js,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
);
curl_setopt_array($ch, $options);
$output = curl_exec($ch);
curl_close($ch);
if ($output === false) { print curl_error($ch); }
$outputarr = json_decode($output);
$arr = $this->object2array($outputarr);
if (!$strip) { return $arr; }
$arr = array_shift($arr['Body']);
return $arr;
}