/**
  * 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());
         }
     }
 }
 /**
  * Gets UIDVALIDITY of the given folder
  *
  * @param Folder $folder
  *
  * @return int
  */
 protected function getUidValidity(Folder $folder)
 {
     $this->manager->selectFolder($folder->getGlobalName());
     return $this->manager->getUidValidity();
 }