/**
  * (@inherit)
  */
 public function setFlags(EmailFolder $folder, Email $email, $flags)
 {
     $repoImapEmail = $this->em->getRepository('OroImapBundle:ImapEmail');
     $uid = $repoImapEmail->getUid($folder->getId(), $email->getId());
     $this->connector->selectFolder($folder->getFullName());
     $this->connector->setFlags($uid, $flags);
 }
 /**
  * Gets UIDVALIDITY of the given folder
  *
  * @param EmailFolder|Folder|string $folder
  *
  * @return int|null
  */
 public function getUidValidity($folder)
 {
     if ($folder instanceof Folder) {
         $folderName = $folder->getGlobalName();
     } elseif ($folder instanceof EmailFolder) {
         $folderName = $folder->getFullName();
     } elseif (is_string($folder)) {
         $folderName = $folder;
     }
     if (!isset($folderName)) {
         throw new \RuntimeException('Invalid argument passed to getUidValidity method');
     }
     try {
         $this->connector->selectFolder($folderName);
         return $this->connector->getUidValidity();
     } catch (\Exception $e) {
         return null;
     }
 }
 /**
  * {@inheritdoc}
  */
 public function loadEmailBody(EmailFolder $folder, Email $email, EntityManager $em)
 {
     /** @var UserEmailOrigin $origin */
     $origin = $folder->getOrigin();
     $config = new ImapConfig($origin->getImapHost(), $origin->getImapPort(), $origin->getImapEncryption(), $origin->getUser(), $this->encryptor->decryptData($origin->getPassword()), $this->imapEmailGoogleOauth2Manager->getAccessTokenWithCheckingExpiration($origin));
     $manager = new ImapEmailManager($this->connectorFactory->createImapConnector($config));
     $manager->selectFolder($folder->getFullName());
     $repo = $em->getRepository('OroImapBundle:ImapEmail');
     $query = $repo->createQueryBuilder('e')->select('e.uid')->innerJoin('e.imapFolder', 'if')->where('e.email = ?1 AND if.folder = ?2')->setParameter(1, $email)->setParameter(2, $folder)->getQuery();
     $loadedEmail = $manager->findEmail($query->getSingleScalarResult());
     if (null === $loadedEmail) {
         throw new EmailBodyNotFoundException($email);
     }
     $builder = new EmailBodyBuilder();
     $builder->setEmailBody($loadedEmail->getBody()->getContent(), $loadedEmail->getBody()->getBodyIsText());
     foreach ($loadedEmail->getAttachments() as $attachment) {
         $builder->addEmailAttachment($attachment->getFileName(), $attachment->getContent(), $attachment->getContentType(), $attachment->getContentTransferEncoding(), $attachment->getContentId());
     }
     return $builder->getEmailBody();
 }
 /**
  * Register EmailFolder object
  *
  * @param EmailFolder $obj
  * @throws \LogicException
  */
 public function addFolder(EmailFolder $obj)
 {
     $key = strtolower(sprintf('%s_%s', $obj->getType(), $obj->getFullName()));
     if (isset($this->folders[$key])) {
         throw new \LogicException(sprintf('The folder "%s" (type: %s) already exists in the batch.', $obj->getFullName(), $obj->getType()));
     }
     $this->folders[$key] = $obj;
 }
 /**
  * Cleans doctrine's UOF to prevent:
  *  - "eating" too much memory
  *  - storing too many object which cause slowness of sync process
  * Tracks time when last batch was saved.
  * Calculates time between batch saves.
  *
  * @param bool             $isFolderSyncComplete
  * @param null|EmailFolder $folder
  */
 protected function cleanUp($isFolderSyncComplete = false, $folder = null)
 {
     $this->emailEntityBuilder->getBatch()->clear();
     /**
      * Clear entity manager.
      */
     $map = $this->entitiesToClear();
     foreach ($map as $entityClass) {
         $this->em->clear($entityClass);
     }
     /**
      * In case folder sync completed and batch save time exceeded limit - throws exception.
      */
     if ($isFolderSyncComplete && $folder != null && $this->dbBatchSaveTime > 0 && $this->dbBatchSaveTime > self::DB_BATCH_TIME) {
         throw new SyncFolderTimeoutException($folder->getOrigin()->getId(), $folder->getFullName());
     } elseif ($isFolderSyncComplete) {
         /**
          * In case folder sync completed without batch save time exceed - reset dbBatchSaveTime.
          */
         $this->dbBatchSaveTime = -1;
     } else {
         /**
          * After batch save - calculate time difference between batches
          */
         if ($this->dbBatchSaveTimestamp !== 0) {
             $this->dbBatchSaveTime = time() - $this->dbBatchSaveTimestamp;
             $this->logger->info(sprintf('Batch save time: "%d" seconds.', $this->dbBatchSaveTime));
         }
     }
     $this->dbBatchSaveTimestamp = time();
 }
 /**
  * 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;
 }
Example #7
0
 public function testFullNameGetterAndSetter()
 {
     $entity = new EmailFolder();
     $entity->setFullName('test');
     $this->assertEquals('test', $entity->getFullName());
 }
 /**
  * Gets ImapEmailFolder entity connected to the given EmailFolder entity
  *
  * @param EmailFolder $folder
  * @return ImapEmailFolder
  */
 protected function getImapFolder(EmailFolder $folder)
 {
     $this->log->notice(sprintf('Load IMAP folder for "%s".', $folder->getFullName()));
     $repo = $this->em->getRepository('OroImapBundle:ImapEmailFolder');
     $query = $repo->createQueryBuilder('f')->where('f.folder = ?1')->setParameter(1, $folder)->getQuery();
     try {
         $imapFolder = $query->getSingleResult();
     } catch (NoResultException $ex) {
         $this->log->notice('IMAP folder does not exist. Create a new one.');
         $imapFolder = new ImapEmailFolder();
         $imapFolder->setFolder($folder);
     }
     return $imapFolder;
 }