private function getNewImapMails(MailAccount $account, $max = 0)
 {
     $received = 0;
     if ($account->getIncomingSsl()) {
         $imap = new Net_IMAP($ret, "ssl://" . $account->getServer(), $account->getIncomingSslPort());
     } else {
         $imap = new Net_IMAP($ret, "tcp://" . $account->getServer());
     }
     if (PEAR::isError($ret)) {
         //Logger::log($ret->getMessage());
         throw new Exception($ret->getMessage());
     }
     $ret = $imap->login($account->getEmail(), self::ENCRYPT_DECRYPT($account->getPassword()));
     $mailboxes = MailAccountImapFolders::getMailAccountImapFolders($account->getId());
     if (is_array($mailboxes)) {
         foreach ($mailboxes as $box) {
             if ($max > 0 && $received >= $max) {
                 break;
             }
             if ($box->getCheckFolder()) {
                 if ($imap->selectMailbox(utf8_decode($box->getFolderName()))) {
                     $oldUids = $account->getUids($box->getFolderName());
                     $numMessages = $imap->getNumberOfMessages(utf8_decode($box->getFolderName()));
                     if (!is_array($oldUids) || count($oldUids) == 0 || PEAR::isError($numMessages) || $numMessages == 0) {
                         $lastReceived = 0;
                         if (PEAR::isError($numMessages)) {
                             //Logger::log($numMessages->getMessage());
                             continue;
                         }
                     } else {
                         $lastReceived = 0;
                         $maxUID = $account->getMaxUID($box->getFolderName());
                         $imin = 1;
                         $imax = $numMessages;
                         $i = floor(($imax + $imin) / 2);
                         while (true) {
                             $summary = $imap->getSummary($i);
                             if (PEAR::isError($summary)) {
                                 $i--;
                                 if ($i == 0) {
                                     break;
                                 }
                                 continue;
                             }
                             $iprev = $i;
                             $uid = $summary[0]['UID'];
                             if ($maxUID > $uid) {
                                 $imin = $i;
                                 $lastReceived = $imin;
                             } else {
                                 if ($maxUID < $uid) {
                                     $imax = $i;
                                 } else {
                                     $lastReceived = $i;
                                     break;
                                 }
                             }
                             $i = floor(($imax + $imin) / 2);
                             if ($i == $iprev) {
                                 break;
                             }
                         }
                     }
                     $uids = MailContents::getUidsFromAccount($account->getId(), $box->getFolderName());
                     // get mails since last received (last received is not included)
                     for ($i = $lastReceived; ($max == 0 || $received < $max) && $i < $numMessages; $i++) {
                         $index = $i + 1;
                         $summary = $imap->getSummary($index);
                         if (PEAR::isError($summary)) {
                             Logger::log($summary->getMessage());
                         } else {
                             if (!in_array($summary[0]['UID'], $uids)) {
                                 if ($imap->isDraft($index)) {
                                     $state = 2;
                                 } else {
                                     $state = 0;
                                 }
                                 $messages = $imap->getMessages($index);
                                 if (PEAR::isError($messages)) {
                                     continue;
                                 }
                                 $content = array_var($messages, $index, '');
                                 if ($content != '') {
                                     try {
                                         $stop_checking = self::SaveMail($content, $account, $summary[0]['UID'], $state, $box->getFolderName());
                                         if ($stop_checking) {
                                             break;
                                         }
                                         $received++;
                                     } catch (Exception $e) {
                                         $mail_file = ROOT . "/tmp/unsaved_mail_" . $summary[0]['UID'] . ".eml";
                                         $res = file_put_contents($mail_file, $content);
                                         if ($res === false) {
                                             $mail_file = ROOT . "/tmp/unsaved_mail_" . gen_id() . ".eml";
                                             $res = file_put_contents($mail_file, $content);
                                             if ($res === false) {
                                                 Logger::log("Could not save mail, and original could not be saved as {$mail_file}, exception:\n" . $e->getMessage());
                                             } else {
                                                 Logger::log("Could not save mail, original mail saved as {$mail_file}, exception:\n" . $e->getMessage());
                                             }
                                         } else {
                                             Logger::log("Could not save mail, original mail saved as {$mail_file}, exception:\n" . $e->getMessage());
                                         }
                                     }
                                 }
                                 // if content
                             }
                         }
                     }
                 }
             }
         }
     }
     $imap->disconnect();
     return $received;
 }
 /**
  * Gets all new mails from a given mail account
  *
  * @param MailAccount $account
  * @return array
  */
 private function getNewPOP3Mails(MailAccount $account, $max = 0)
 {
     $pop3 = new Net_POP3();
     $received = 0;
     // Connect to mail server
     if ($account->getIncomingSsl()) {
         $pop3->connect("ssl://" . $account->getServer(), $account->getIncomingSslPort());
     } else {
         $pop3->connect($account->getServer());
     }
     if (PEAR::isError($ret = $pop3->login($account->getEmail(), self::ENCRYPT_DECRYPT($account->getPassword()), 'USER'))) {
         throw new Exception($ret->getMessage());
     }
     $mailsToGet = array();
     $summary = $pop3->getListing();
     $tmp_uids_to_get = array();
     $uids = MailContents::getUidsFromAccount($account->getId());
     foreach ($summary as $k => $info) {
         if (!in_array($info['uidl'], $uids, true) && !in_array($info['uidl'], $tmp_uids_to_get, true)) {
             $mailsToGet[] = $k;
             $tmp_uids_to_get[] = $info['uidl'];
         }
     }
     if ($max == 0) {
         $toGet = count($mailsToGet);
     } else {
         $toGet = min(count($mailsToGet), $max);
     }
     // fetch newer mails first
     $mailsToGet = array_reverse($mailsToGet, true);
     $checked = 0;
     foreach ($mailsToGet as $idx) {
         if ($toGet <= $checked) {
             break;
         }
         $content = $pop3->getMsg($idx + 1);
         // message index is 1..N
         if ($content != '') {
             $uid = $summary[$idx]['uidl'];
             try {
                 $stop_checking = self::SaveMail($content, $account, $uid, 0, '', null, $received);
                 //$received++;
                 if ($stop_checking) {
                     break;
                 }
             } catch (Exception $e) {
                 $mail_file = ROOT . "/tmp/unsaved_mail_" . $uid . ".eml";
                 $res = file_put_contents($mail_file, $content);
                 if ($res === false) {
                     $mail_file = ROOT . "/tmp/unsaved_mail_" . gen_id() . ".eml";
                     $res = file_put_contents($mail_file, $content);
                     if ($res === false) {
                         Logger::log("Could not save mail, and original could not be saved as {$mail_file}, exception:\n" . $e->getMessage());
                     } else {
                         Logger::log("Could not save mail, original mail saved as {$mail_file}, exception:\n" . $e->getMessage());
                     }
                 } else {
                     Logger::log("Could not save mail, original mail saved as {$mail_file}, exception:\n" . $e->getMessage());
                 }
             }
             unset($content);
             $checked++;
         }
     }
     $pop3->disconnect();
     return $received;
 }