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;
 }
Exemple #2
0
/*$authMethod=false;
if ( PEAR::isError( $ret = $imap->login( $user , $passwd , $authMethod ) ) ) {
    echo "Unable to login! reason:" . $ret->getMessage() . "\n";
    exit();
}
*/
if (PEAR::isError($ret = $imap->login($user, $passwd))) {
    echo "Unable to login! reason:" . $ret->getMessage() . "\n";
    exit;
}
/*********************
***
    Let's show the Mailbox  related methods
***
*********************/
$imap->selectMailbox('inbox');
//$mailboxes=$imap->getMailboxes('');
$mailboxes = $imap->getMailboxes('inbox.INBOX2', 2);
$mailboxes = $imap->getMailboxes('inbox');
//$mailboxes=$imap->listsubscribedMailboxes('inbox');
echo "Here is the list of all mailboxes:\n\n";
prettyMailboxList($imap, $mailboxes);
$mailboxes = $imap->listsubscribedMailboxes('inbox');
echo "Here is the list of all mailboxes you are subscribed:\n\n";
prettyMailboxList($imap, $mailboxes);
//$mailboxes=0;
//echo "PITERROR|" . print_r( $imap->_socket->eof()) . "|\n";
//echo $imap->getDebugDialog();
//exit();
$folder_delim = $imap->getHierarchyDelimiter();
echo "Folder Delim:|{$folder_delim}|\n";
 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)) {
         throw new Exception($ret->getMessage());
     }
     $ret = $imap->login($account->getEmail(), self::ENCRYPT_DECRYPT($account->getPassword()), null, false);
     $mailboxes = MailAccountImapFolders::getMailAccountImapFolders($account->getId());
     if (is_array($mailboxes)) {
         foreach ($mailboxes as $box) {
             if ($max > 0 && $received >= $max) {
                 break;
             }
             if ($box->getCheckFolder()) {
                 //if the account is configured to mark as read emails on server call selectMailBox else call examineMailBox.
                 if ($account->getMarkReadOnServer() > 0 ? $imap->selectMailbox(utf8_decode($box->getFolderName())) : $imap->examineMailbox(utf8_decode($box->getFolderName()))) {
                     $oldUids = $account->getUids($box->getFolderName(), 1);
                     $numMessages = $imap->getNumberOfMessages(utf8_decode($box->getFolderName()));
                     if (!is_array($oldUids) || count($oldUids) == 0 || PEAR::isError($numMessages) || $numMessages == 0) {
                         if (PEAR::isError($numMessages)) {
                             continue;
                         }
                     }
                     // determine the starting uid and number of message
                     $max_uid = $account->getMaxUID($box->getFolderName());
                     $max_summary = null;
                     if ($max_uid) {
                         $max_summary = $imap->getSummary($max_uid, true);
                         if (PEAR::isError($max_summary)) {
                             Logger::log($max_summary->getMessage());
                             throw new Exception($max_summary->getMessage());
                         }
                     }
                     //check if our last mail is on mail server
                     if ($max_summary) {
                         $is_last_mail_on_mail_server = true;
                     } else {
                         $is_last_mail_on_mail_server = false;
                     }
                     //Server Data
                     $server_max_summary = $imap->getSummary($numMessages);
                     $server_max_uid = null;
                     if (PEAR::isError($server_max_summary)) {
                         Logger::log($server_max_summary->getMessage());
                     } else {
                         $server_max_uid = $server_max_summary[0]['UID'];
                     }
                     $server_min_summary = $imap->getSummary(1, false);
                     $server_min_uid = null;
                     if (PEAR::isError($server_min_summary)) {
                         Logger::log($server_min_summary->getMessage());
                     } else {
                         $server_min_uid = $server_min_summary[0]['UID'];
                     }
                     if ($max_uid) {
                         if ($is_last_mail_on_mail_server) {
                             $lastReceived = $max_summary[0]['MSG_NUM'];
                         } else {
                             if ($max_uid < $server_min_uid) {
                                 $lastReceived = 1;
                             } else {
                                 // $max_uid is betwen $server_min_uid and $server_max_uid
                                 if ($server_max_uid) {
                                     $diff_uids = $server_max_uid - $max_uid;
                                     $lastReceived = $numMessages - $diff_uids;
                                 } else {
                                     //get the complete server list of uids and msgids since $max_uid
                                     $server_uids_list = $imap->getMessagesListUid($max_uid . ':*');
                                     if (count($server_uids_list)) {
                                         $lastReceived = $server_uids_list[0]["msg_id"];
                                     } else {
                                         $lastReceived = 1;
                                     }
                                 }
                             }
                             $lastReceived = $lastReceived - 1;
                         }
                     } else {
                         //we don't have any mails on the system yet
                         $lastReceived = 0;
                     }
                     if ($lastReceived < 0) {
                         $lastReceived = 0;
                     }
                     // 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 ($summary[0]['UID']) {
                                 if ($imap->isDraft($index)) {
                                     $state = 2;
                                 } else {
                                     $state = 0;
                                 }
                                 //get the state (read/unread) from the server
                                 if ($imap->isSeen($index)) {
                                     $read = 1;
                                 } else {
                                     $read = 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(), $read, $received);
                                         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;
 }
$username2 = '';
$password2 = '';
# folder to use for testing the SORT feature
$testFolder = 'INBOX';
$enableSTARTTLS = true;
$startTime = microtime(true);
print "<pre>";
set_include_path('../egw-pear' . PATH_SEPARATOR . '/usr/share/php' . PATH_SEPARATOR . get_include_path());
require_once 'Net/IMAP.php';
print "<h1><span style='color:red;'>ATTENTION: THIS OUTPUT CONTAINS YOUR USERNAME AND PASSWORD!!!</span></h1>";
$elapsedTime = microtime(true) - $startTime;
print "<h1> {$elapsedTime} :: Login as user {$username1} </h1>";
$imapClient = new Net_IMAP($host, $port, $enableSTARTTLS);
$imapClient->setDebug(true);
$imapClient->login($username1, $password1, true, false);
$imapClient->selectMailbox($testFolder);
if (!empty($username2) && !empty($password2)) {
    $elapsedTime = microtime(true) - $startTime;
    print "<h1> {$elapsedTime} :: Login as user {$username2} </h1>";
    $imapClient2 = new Net_IMAP($host);
    $imapClient2->setDebug(true);
    $imapClient2->login($username2, $password2, true, false);
}
$elapsedTime = microtime(true) - $startTime;
print "<h1> {$elapsedTime} :: Getting hierarchy delimiter </h1>";
$delimiter = $imapClient->getHierarchyDelimiter();
print "delimiter is: {$delimiter}<br>";
$elapsedTime = microtime(true) - $startTime;
print "<h1> {$elapsedTime} :: List all folders </h1>";
$imapClient->getMailboxes();
$elapsedTime = microtime(true) - $startTime;