public function testFolderGetterAndSetter() { $folder = new EmailFolder(); $imapFolder = new ImapEmailFolder(); $this->assertNull($imapFolder->getFolder()); $imapFolder->setFolder($folder); $this->assertSame($folder, $imapFolder->getFolder()); }
/** * 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 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(); }