Kerio API – PHP get users mailboxes,sizes and quotas

Spread the love
<?php
// Kerio Connect API endpoint and credentials
$api_cookie = "/tmp/kerio-api-cookie";
$kerioUrl = "https://yourserver.com:4040/admin/api/jsonrpc/";    // FILL YOUR SERVER
$username = "----------";    //FILL - USERNAME
$password = "----------";    //FILL - PASSWORD

// Create cURL handle
$ch = curl_init($kerioUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:application/json"));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, $api_cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $api_cookie);

// ---- LOGIN ----
$loginRequest = array(
    "jsonrpc" => "2.0",
    "id" => 1,
    "method" => "Session.login",
    "params" => array(
        "userName" => $username,
        "password" => $password,
        "application" => array(
            "name" => "MailboxExportScript",
            "vendor" => "ExampleVendor",
            "version" => "1.0"
        )
    )
);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($loginRequest));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$loginResponse = json_decode(curl_exec($ch), true);

if (!isset($loginResponse['result']['token'])) {
    die("Login failed: " . json_encode($loginResponse));
}

$token = $loginResponse['result']['token'];

// Add token header for future requests
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Content-Type: application/json",
    "X-Token: " . $token
));

// ---- GET DOMAINS ----
$getDomainsQuery = array(
    "jsonrpc" => "2.0",
    "id" => 2,
    "method" => "Domains.get",
    "params" => array(
        "query" => array(
            "fields" => array("id", "name")
        )
    )
);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($getDomainsQuery));
$domainsResponse = json_decode(curl_exec($ch), true);

if (!isset($domainsResponse['result']['list'])) {
    die("Failed to get domains: " . json_encode($domainsResponse));
}

// ---- LOOP DOMAINS ----
foreach ($domainsResponse["result"]["list"] as $domain) {
    $domainId = $domain["id"];

    // ---- GET USERS FOR DOMAIN ----
    $getUsersInDomainQuery = array(
        "jsonrpc" => "2.0",
        "id" => 3,
        "method" => "Users.get",
        "params" => array(
            "domainId" => $domainId,
            "query" => array(
                "fields" => array("id", "loginName","consumedSize","diskSizeLimit")
            )
        )
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($getUsersInDomainQuery));
    $usersResponse = json_decode(curl_exec($ch), true);
    //print_r($domain["name"]); // Debugging line
    //print_r($usersResponse); // Debugging line

     if (isset($usersResponse['result']['list'])) {
        foreach ($usersResponse['result']['list'] as $user) {
            $username = $user['loginName'] . '@' . $domain["name"];

            // --- Used space ---
            $usedVal = $user['consumedSize']['value'];
            $usedUnit = $user['consumedSize']['units'];
            $usedMB = convertToMB($usedVal, $usedUnit);

            // --- Limit ---
            if (!empty($user['diskSizeLimit']['isActive'])) {
                $limitVal = $user['diskSizeLimit']['limit']['value'];
                $limitUnit = $user['diskSizeLimit']['limit']['units'];
                $limitMB = convertToMB($limitVal, $limitUnit);
                $limitStr = $limitMB;
            } else {
                $limitStr = '0';
            }

            echo "{$username},{$usedMB},{$limitStr}\n";  //HERE YOU CAN EDIT YOUR OUTPUT
        }
    }
}

// --- Helper: convert any unit to MB ---
function convertToMB($value, $unit) {
    switch (strtolower($unit)) {
        case 'bytes':
            return round($value / 1048576);
        case 'kilobytes':
            return round($value / 1024);
        case 'megabytes':
            return round($value);
        case 'gigabytes':
            return round($value * 1024);
        default:
            return $value; // Unknown unit
    }
}

?>

Buy Me a Coffee