示例#1
0
 public function testFolderGetterAndSetter()
 {
     $folder = new EmailFolder();
     $imapFolder = new ImapEmailFolder();
     $this->assertNull($imapFolder->getFolder());
     $imapFolder->setFolder($folder);
     $this->assertSame($folder, $imapFolder->getFolder());
 }
 /**
  * @param ArrayCollection|EmailFolder[] $folders
  * @param ImapEmailFolderManager $manager
  */
 protected function createImapEmailFolders($folders, ImapEmailFolderManager $manager)
 {
     foreach ($folders as $folder) {
         if ($folder->getId() === null) {
             $uidValidity = $manager->getUidValidity($folder);
             if ($uidValidity !== null) {
                 $imapEmailFolder = new ImapEmailFolder();
                 $imapEmailFolder->setUidValidity($uidValidity);
                 $imapEmailFolder->setFolder($folder);
                 $this->doctrine->getManager()->persist($imapEmailFolder);
             }
             if ($folder->hasSubFolders()) {
                 $this->createImapEmailFolders($folder->getSubFolders(), $manager);
             }
         }
     }
 }
 /**
  * Moves an email to another folder
  *
  * @param ImapEmail       $imapEmail
  * @param ImapEmailFolder $newImapFolder
  * @param int             $newUid
  */
 protected function moveEmailToOtherFolder(ImapEmail $imapEmail, ImapEmailFolder $newImapFolder, $newUid)
 {
     $this->logger->notice(sprintf('Move "%s" (UID: %d) email from "%s" to "%s". New UID: %d.', $imapEmail->getEmail()->getSubject(), $imapEmail->getUid(), $imapEmail->getImapFolder()->getFolder()->getFullName(), $newImapFolder->getFolder()->getFullName(), $newUid));
     $emailUser = $imapEmail->getEmail()->getEmailUserByFolder($imapEmail->getImapFolder()->getFolder());
     if ($emailUser != null) {
         $emailUser->setFolder($newImapFolder->getFolder());
     }
     $imapEmail->setImapFolder($newImapFolder);
     $imapEmail->setUid($newUid);
 }
示例#4
0
 /**
  * @param ImapEmailFolder $imapFolder
  */
 protected function clearFolder($imapFolder)
 {
     $folder = $imapFolder->getFolder();
     $query = $this->em->getRepository('OroEmailBundle:EmailUser')->getEmailUserByFolder($folder)->getQuery();
     $iterableResult = $query->iterate();
     $i = 0;
     while (($row = $iterableResult->next()) !== false) {
         /** @var EmailUser $emailUser */
         $emailUser = $row[0];
         $email = $emailUser->getEmail();
         $this->em->remove($emailUser);
         $imapEmails = $this->em->getRepository('OroImapBundle:ImapEmail')->findBy(['email' => $email, 'imapFolder' => $imapFolder]);
         foreach ($imapEmails as $imapEmail) {
             $this->em->remove($imapEmail);
         }
         if ($i % self::BATCH_SIZE === 0) {
             $this->em->flush();
             $this->em->clear('OroEmailBundle:EmailUser');
             $this->em->clear('OroImapBundle:ImapEmail');
         }
         ++$i;
     }
     if ($i > 0) {
         $this->logger->notice(sprintf('ImapFolder with ID %s cleared. Removed %d emails.', $imapFolder->getId(), $i));
     }
     $this->em->flush();
 }
 /**
  * Saves emails into the database
  *
  * @param Email[]         $emails
  * @param ImapEmailFolder $imapFolder
  */
 protected function saveEmails(array $emails, ImapEmailFolder $imapFolder)
 {
     $this->emailEntityBuilder->removeEmails();
     $folder = $imapFolder->getFolder();
     $existingUids = $this->getExistingUids($folder, $emails);
     $messageIds = $this->getMessageIds($emails);
     $existingImapEmails = $this->getExistingImapEmails($folder->getOrigin(), $messageIds);
     $existingEmailUsers = $this->getExistingEmailUsers($folder, $messageIds);
     /** @var ImapEmail[] $newImapEmails */
     $newImapEmails = [];
     foreach ($emails as $email) {
         if (!$this->checkOnOldEmailForMailbox($folder, $email, $folder->getOrigin()->getMailbox())) {
             continue;
         }
         if (!$this->checkOnExistsSavedEmail($email, $existingUids)) {
             continue;
         }
         /** @var ImapEmail[] $relatedExistingImapEmails */
         $relatedExistingImapEmails = array_filter($existingImapEmails, function (ImapEmail $imapEmail) use($email) {
             return $imapEmail->getEmail()->getMessageId() === $email->getMessageId();
         });
         try {
             if (!isset($existingEmailUsers[$email->getMessageId()])) {
                 $emailUser = $this->addEmailUser($email, $folder, $email->hasFlag("\\Seen"), $this->currentUser, $this->currentOrganization);
             } else {
                 $emailUser = $existingEmailUsers[$email->getMessageId()];
                 if (!$emailUser->getFolders()->contains($folder)) {
                     $emailUser->addFolder($folder);
                 }
             }
             $imapEmail = $this->createImapEmail($email->getId()->getUid(), $emailUser->getEmail(), $imapFolder);
             $newImapEmails[] = $imapEmail;
             $this->em->persist($imapEmail);
             $this->logger->notice(sprintf('The "%s" (UID: %d) email was persisted.', $email->getSubject(), $email->getId()->getUid()));
         } catch (\Exception $e) {
             $this->logger->warning(sprintf('Failed to persist "%s" (UID: %d) email. Error: %s', $email->getSubject(), $email->getId()->getUid(), $e->getMessage()));
         }
         $this->removeEmailFromOutdatedFolders($relatedExistingImapEmails);
     }
     $this->emailEntityBuilder->getBatch()->persist($this->em);
     // update references if needed
     $changes = $this->emailEntityBuilder->getBatch()->getChanges();
     foreach ($newImapEmails as $imapEmail) {
         foreach ($changes as $change) {
             if ($change['old'] instanceof EmailEntity && $imapEmail->getEmail() === $change['old']) {
                 $imapEmail->setEmail($change['new']);
             }
         }
     }
     $this->em->flush();
     $this->cleanUp();
 }
 /**
  * @param EmailFolderModel $emailFolderModel
  *
  * @return ImapEmailFolder
  */
 protected function createImapEmailFolder(EmailFolderModel $emailFolderModel)
 {
     $imapEmailFolder = new ImapEmailFolder();
     $emailFolder = $emailFolderModel->getEmailFolder();
     $imapEmailFolder->setFolder($emailFolder);
     if ($emailFolderModel->hasParentFolderModel()) {
         $emailFolder->setParentFolder($emailFolderModel->getParentFolderModel()->getEmailFolder());
     }
     $imapEmailFolder->setUidValidity($emailFolderModel->getUidValidity());
     return $imapEmailFolder;
 }
示例#7
0
 /**
  * @param ImapEmailFolder $imapFolder
  */
 protected function clearFolder(ImapEmailFolder $imapFolder)
 {
     $folder = $imapFolder->getFolder();
     $q = $this->em->createQueryBuilder()->select('eu')->from('OroEmailBundle:EmailUser', 'eu')->andWhere('eu.folder = :folder')->setParameter('folder', $folder)->getQuery();
     $iterableResult = $q->iterate();
     $i = 0;
     while (($row = $iterableResult->next()) !== false) {
         /** @var EmailUser $emailUser */
         $emailUser = $row[0];
         $email = $emailUser->getEmail();
         $this->em->remove($emailUser);
         $imapEmail = $this->em->getRepository('OroImapBundle:ImapEmail')->findOneBy(['email' => $email, 'imapFolder' => $imapFolder]);
         if ($imapEmail !== null) {
             $this->em->remove($imapEmail);
         }
         if ($i % self::BATCH_SIZE === 0) {
             $this->em->flush();
             $this->em->clear('OroEmailBundle:EmailUser');
             $this->em->clear('OroImapBundle:ImapEmail');
         }
         ++$i;
     }
     $this->em->flush();
 }
示例#8
0
 /**
  * @param ImapEmailFolder $imapFolder
  */
 protected function clearFolder($imapFolder)
 {
     $folder = $imapFolder->getFolder();
     $limit = self::BATCH_SIZE;
     $offset = 0;
     $i = 0;
     while ($result = $this->em->getRepository('OroEmailBundle:EmailUser')->getEmailUserByFolder($folder, $limit, $offset)->getQuery()->getResult()) {
         foreach ($result as $emailUser) {
             /** @var EmailUser $emailUser */
             $emailUser->removeFolder($folder);
             $email = $emailUser->getEmail();
             if ($emailUser->getFolders()->isEmpty()) {
                 $this->em->remove($emailUser);
             }
             $imapEmails = $this->em->getRepository('OroImapBundle:ImapEmail')->findBy(['email' => $email, 'imapFolder' => $imapFolder]);
             foreach ($imapEmails as $imapEmail) {
                 $this->em->remove($imapEmail);
             }
             ++$i;
         }
         $this->em->flush();
         $this->cleanUp();
     }
     if ($i > 0) {
         $this->logger->notice(sprintf('ImapFolder with ID %s cleared. Removed %d emails.', $imapFolder->getId(), $i));
     }
     $this->em->flush();
     $this->cleanUp();
 }
 /**
  * @param string   $folderName
  * @param string   $folderFullName
  * @param int      $uidValidity
  * @param int|null $id
  *
  * @return ImapEmailFolder
  */
 protected function createImapFolder($folderName, $folderFullName, $uidValidity, $id = null)
 {
     $folder = new EmailFolder();
     $folder->setName($folderName)->setFullName($folderFullName);
     $imapFolder = new ImapEmailFolder();
     $imapFolder->setFolder($folder)->setUidValidity($uidValidity);
     if ($id !== null) {
         ReflectionUtil::setId($imapFolder, $id);
     }
     return $imapFolder;
 }
 /**
  * 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;
 }