コード例 #1
0
 public function testFolderGetterAndSetter()
 {
     $folder = new EmailFolder();
     $imapFolder = new ImapEmailFolder();
     $this->assertNull($imapFolder->getFolder());
     $imapFolder->setFolder($folder);
     $this->assertSame($folder, $imapFolder->getFolder());
 }
コード例 #2
0
 /**
  * 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);
 }
コード例 #3
0
ファイル: ImapClearManager.php プロジェクト: hugeval/platform
 /**
  * @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();
 }
コード例 #4
0
 /**
  * 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();
 }
コード例 #5
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();
 }
コード例 #6
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();
 }