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; }