/** * {@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; }