/**
  * {@inheritdoc}
  */
 public function process(EmailOrigin $origin, $syncStartTime)
 {
     // make sure that the entity builder is empty
     $this->emailEntityBuilder->clear();
     $this->initEnv($origin);
     // iterate through all folders and do a synchronization of emails for each one
     $imapFolders = $this->syncFolders($origin);
     foreach ($imapFolders as $imapFolder) {
         $folder = $imapFolder->getFolder();
         // ask an email server to select the current folder
         $folderName = $folder->getFullName();
         $this->manager->selectFolder($folderName);
         // register the current folder in the entity builder
         $this->emailEntityBuilder->setFolder($folder);
         // build a search query
         $sqb = $this->manager->getSearchQueryBuilder();
         if ($origin->getSynchronizedAt() && $folder->getSynchronizedAt()) {
             if ($folder->getType() === FolderType::SENT) {
                 $sqb->sent($folder->getSynchronizedAt());
             } else {
                 $sqb->received($folder->getSynchronizedAt());
             }
         }
         // sync emails using this search query
         $lastSynchronizedAt = $this->syncEmails($imapFolder, $sqb->get());
         // update synchronization date for the current folder
         $folder->setSynchronizedAt($lastSynchronizedAt > $syncStartTime ? $lastSynchronizedAt : $syncStartTime);
         $this->em->flush($folder);
         $this->cleanUp(true, $imapFolder->getFolder());
     }
     // run removing of empty outdated folders every N synchronizations
     if ($origin->getSyncCount() > 0 && $origin->getSyncCount() % self::CLEANUP_EVERY_N_RUN == 0) {
         $this->cleanupOutdatedFolders($origin);
     }
 }
 /**
  * Performs a synchronization of emails for the given email origin.
  *
  * @param EmailOrigin $origin
  */
 public function process(EmailOrigin $origin)
 {
     // make sure that the entity builder is empty
     $this->emailEntityBuilder->clear();
     // get a list of emails belong to any object, for example an user or a contacts
     $emailAddressBatches = $this->getKnownEmailAddressBatches($origin->getSynchronizedAt());
     // iterate through all folders and do a synchronization of emails for each one
     $folders = $this->getFolders($origin);
     foreach ($folders as $folder) {
         // register the current folder in the entity builder
         $this->emailEntityBuilder->setFolder($folder);
         // ask an email server to select the current folder
         $folderName = $folder->getFullName();
         $this->manager->selectFolder($folderName);
         // check that a state of the current folder is valid
         $imapFolder = $this->getImapFolder($folder);
         if ($imapFolder->getUidValidity() !== $this->manager->getUidValidity()) {
             $imapFolder->setUidValidity($this->manager->getUidValidity());
             $this->em->persist($imapFolder);
             $this->em->flush();
         }
         $this->log->notice(sprintf('Loading emails from "%s" folder ...', $folderName));
         foreach ($emailAddressBatches as $emailAddressBatch) {
             // build a search query
             $sqb = $this->manager->getSearchQueryBuilder();
             if ($origin->getSynchronizedAt() && $folder->getSynchronizedAt() && !$emailAddressBatch['needFullSync']) {
                 $sqb->sent($folder->getSynchronizedAt());
             }
             $sqb->openParenthesis();
             $sqb->openParenthesis();
             $this->addEmailAddressesToSearchQueryBuilder($sqb, 'from', $emailAddressBatch['items']);
             $sqb->closeParenthesis();
             $sqb->openParenthesis();
             $this->addEmailAddressesToSearchQueryBuilder($sqb, 'to', $emailAddressBatch['items']);
             $sqb->orOperator();
             $this->addEmailAddressesToSearchQueryBuilder($sqb, 'cc', $emailAddressBatch['items']);
             // not all IMAP servers support search by BCC, for example imap-mail.outlook.com does not
             //$sqb->orOperator();
             //$this->addEmailAddressesToSearchQueryBuilder($sqb, 'bcc', $emailAddressBatch['items']);
             $sqb->closeParenthesis();
             $sqb->closeParenthesis();
             // load emails using this search query
             $this->loadEmails($folder, $sqb->get());
         }
     }
 }
 /**
  * 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;
 }