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