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