/**
  * Get email ids and create iterator
  *
  * @param EmailOrigin $origin
  * @param ImapEmailFolder $imapFolder
  * @param EmailFolder $folder
  *
  * @return ImapEmailIterator
  */
 protected function getEmailIterator(EmailOrigin $origin, ImapEmailFolder $imapFolder, EmailFolder $folder)
 {
     if ($origin->getMailbox()) {
         // build search query for emails sync
         $sqb = $this->manager->getSearchQueryBuilder();
         if ($origin->getSynchronizedAt() && $folder->getSynchronizedAt()) {
             if ($folder->getType() === FolderType::SENT) {
                 $sqb->sent($folder->getSynchronizedAt());
             } else {
                 $sqb->received($folder->getSynchronizedAt());
             }
         }
         $searchQuery = $sqb->get();
         $this->logger->info(sprintf('Loading emails from "%s" folder ...', $folder->getFullName()));
         $this->logger->info(sprintf('Query: "%s".', $searchQuery->convertToSearchString()));
         $emails = $this->manager->getEmails($searchQuery);
     } else {
         $lastUid = $this->em->getRepository('OroImapBundle:ImapEmail')->findLastUidByFolder($imapFolder);
         $this->logger->info(sprintf('Previous max email UID "%s"', $lastUid));
         $emails = $this->manager->getEmailsUidBased(sprintf('%s:*', ++$lastUid));
     }
     return $emails;
 }
 /**
  * @param EmailFolder $folder
  * @param Email $email
  * @param array $existingUids
  *
  * @return bool
  */
 protected function allowSaveEmail(EmailFolder $folder, Email $email, array $existingUids)
 {
     if ($folder->getSynchronizedAt() > $email->getSentAt()) {
         $this->logger->info(sprintf('Skip "%s" (UID: %d) email, because it was sent earlier than the last synchronization was done', $email->getSubject(), $email->getId()->getUid()));
         return false;
     }
     if (in_array($email->getId()->getUid(), $existingUids)) {
         $this->logger->info(sprintf('Skip "%s" (UID: %d) email, because it is already synchronised.', $email->getSubject(), $email->getId()->getUid()));
         return false;
     }
     return true;
 }