/** * 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(); }