<?php


$webuidir = "";

$port = 143;
$ssl = false;
$server = '';
$username = '';
$password = '';


$opts = 'h:s:P:u:p:';
$lopts = array(
                'webui:',
                'server:',
                'port:',
                'username:',
                'password:',
                'help'
              );


if($options = getopt($opts, $lopts)) {

   if(isset($options['webui'])) { $webuidir = $options['webui']; }
   if(isset($options['server'])) { $server = $options['server']; }
   if(isset($options['port'])) { $port = $options['port']; }
   if(isset($options['username'])) { $username = $options['username']; }
   if(isset($options['password'])) { $password = $options['password']; }

   if(isset($options['help'])) { usage(); }
}


if($webuidir == '' || $server == '' || $username == '') { usage(); }

if($port == 993) { $ssl = true; }

$pwd = getcwd();

chdir($webuidir);

require_once 'Zend/Mail/Protocol/Imap.php';
require_once 'Zend/Mail/Storage/Imap.php';


chdir($pwd);


try {
   $imap = new Zend_Mail_Protocol_Imap($server, $port, $ssl);

   $login = $imap->login($username, $password);

   if($login) {
      print "login OK\n";
      $storage = new Zend_Mail_Storage_Imap($imap);
      download_users_emails($storage);

   } else {
      print "login FAILED at $server for $username\n";
   }
}
catch (Zend_Mail_Protocol_Exception $e) {
   print "ERR connecting\n";
}




function download_users_emails($storage) {
   global $imap;
   $count = 0;

   $folders = new RecursiveIteratorIterator($storage->getFolders(), RecursiveIteratorIterator::SELF_FIRST);

   foreach ($folders as $folder) {

      $__folder = preg_replace("/\W/", "_", $folder);

      if($folder->isSelectable()) {
         $storage->selectFolder($folder);
         $num = $storage->countMessages();

         $__folder = preg_replace("/\W/", "_", $folder);

         print "processing $folder ($num messages)\n";

         $count += saveMessages($storage, $__folder, $num);
      }
   }

   print "downloaded $count messages\n";

   return $count;
}


function saveMessages($storage, $folder = '', $num = 0) {
   global $username;
   $count = 0;

   $messages = $storage->piler_batch_fetch(1, $num);

   while(list($k, $v) = each($messages)) {
      $uuid = $storage->getUniqueId($k);

      $tmpname = "piler-" . $username . "-" . $folder . "-" . $k . "-" . $uuid . ".eml";
      $f = fopen($tmpname, "w+");
      if($f){
         fwrite($f, $v['RFC822.HEADER'] . $v['RFC822.TEXT']);
         fclose($f);

         $count++;
      }
   }

   return $count;
}


function usage() {
   print "\nUsage: " . __FILE__ . "\n\n";
   print "\t--webui <path to webui directory>\n";
   print "\t--server <imap server name>\n";
   print "\t--port <port number> [default: 143]\n";
   print "\t--username <imap username>\n";
   print "\t--password <imap password>\n";
   print "\t--help\n\n";

   exit;
}