Я делал так.
Вроде бы все работало, за исключением того, что нельзя записать файл под тем же именем, что и по ссылке. Наверное как то можно и это имя узнать, но это мне было не нужно - поэтому не заморачивался.
Плюс к этому, я так понимаю, этот метод работает, если по публичной ссылке лежит только один файл.
$login = 'login@mail.ru'; //Любой логин на mail.ru
$file = 'https://cloud.mail.ru/public/4iJK/AAABBB'; //Публичная ссылка
$out = __DIR__ . 'file.xlsx'; //Куда записывать файл
$url = 'https://cloud.mail.ru/api/v2/dispatcher?api=2&email=' . $login . '&_=' . time();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$answer = json_decode(curl_exec($ch), true);
curl_close($ch);
$weblink_prefix = $answer['body']['weblink_get'][0]['url'];
$weblink_suffix = str_replace('https://cloud.mail.ru/public', '', $file);
file_put_contents($out, file_get_contents($weblink_prefix . $weblink_suffix));