/** * Process email model sending. * * @param EmailModel $model * @return Email * @throws \Swift_SwiftException */ public function process(EmailModel $model) { $this->assertModel($model); $messageDate = new \DateTime('now', new \DateTimeZone('UTC')); /** @var \Swift_Message $message */ $message = $this->mailer->createMessage(); $message->setDate($messageDate->getTimestamp()); $message->setFrom($this->getAddresses($model->getFrom())); $message->setTo($this->getAddresses($model->getTo())); $message->setSubject($model->getSubject()); $message->setBody($model->getBody(), $model->getType() === 'html' ? 'text/html' : 'text/plain'); $messageId = $message->generateId(); if (!$this->mailer->send($message)) { throw new \Swift_SwiftException('An email was not delivered.'); } $origin = $this->getEmailOrigin($model->getFrom()); $this->emailEntityBuilder->setOrigin($origin); $email = $this->emailEntityBuilder->email($model->getSubject(), $model->getFrom(), $model->getTo(), $messageDate, $messageDate, $messageDate); $email->addFolder($origin->getFolder(FolderType::SENT)); $email->setEmailBody($this->emailEntityBuilder->body($model->getBody(), $model->getType() === 'html', true)); $email->setMessageId($messageId); // persist the email and all related entities such as folders, email addresses etc. $this->emailEntityBuilder->getBatch()->persist($this->getEntityManager()); // associate the email with the target entity if exist if ($model->hasEntity()) { $targetEntity = $this->doctrineHelper->getEntity($model->getEntityClass(), $model->getEntityId()); if ($targetEntity) { $this->emailActivityManager->addAssociation($email, $targetEntity); } } // flush all changes to the database $this->getEntityManager()->flush(); return $email; }
/** * @param ObjectManager $om */ protected function loadEmailsDemo(ObjectManager $om) { $contacts = $om->getRepository('OroCRMContactBundle:Contact')->findAll(); $contactCount = count($contacts); for ($i = 0; $i < 100; ++$i) { $contactRandom = rand(0, $contactCount - 1); /** @var Contact $contact */ $contact = $contacts[$contactRandom]; $owner = $contact->getOwner(); $origin = $this->mailerProcessor->getEmailOrigin($owner->getEmail()); $randomTemplate = array_rand($this->templates); $emailUser = $this->addEmailUser($randomTemplate, $owner, $contact, $origin); if ($i % 7 == 0) { $thread = new EmailThread(); $om->persist($thread); $emailUser->getEmail()->setThread($thread); $randomNumber = rand(1, 7); for ($j = 0; $j < $randomNumber; ++$j) { $eu = $this->addEmailUser($randomTemplate, $owner, $contact, $origin); $eu->getEmail()->setSubject('Re: ' . $emailUser->getEmail()->getSubject()); $eu->getEmail()->setThread($thread); $eu->getEmail()->setHead(false); } } $this->emailEntityBuilder->getBatch()->persist($om); } }
/** * 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(); }
/** * @param ObjectManager $om */ protected function loadEmailsDemo(ObjectManager $om) { $adminUser = $om->getRepository('OroUserBundle:User')->findOneByUsername('admin'); foreach ($this->templates as $index => $template) { $owner = $this->getReference('simple_user'); $simpleUser2 = $this->getReference('simple_user2'); $origin = $this->mailerProcessor->getEmailOrigin($owner->getEmail()); $emailUser = $this->emailEntityBuilder->emailUser($template['Subject'], $owner->getEmail(), $owner->getEmail(), new \DateTime($template['SentAt']), new \DateTime('now'), new \DateTime('now'), Email::NORMAL_IMPORTANCE, "cc{$index}@example.com", "bcc{$index}@example.com"); $emailUser->setFolder($origin->getFolder(FolderType::SENT)); $emailUser->getEmail()->addActivityTarget($owner); $emailUser->getEmail()->addActivityTarget($simpleUser2); $emailUser->getEmail()->setHead(true); $emailUser->setOrganization($owner->getOrganization()); $emailUser->setOwner($owner); $emailBody = $this->emailEntityBuilder->body("Hi,\n" . $template['Text'], false, true); $emailUser->getEmail()->setEmailBody($emailBody); $emailUser->getEmail()->setMessageId(sprintf('<id+&?= %s@%s>', $index, 'bap.migration.generated')); $this->setReference('email_' . ($index + 1), $emailUser->getEmail()); $this->setReference('emailUser_' . ($index + 1), $emailUser); $this->setReference('emailBody_' . ($index + 1), $emailBody); } $emailUser->setOwner($adminUser); $this->setReference('emailUser_for_mass_mark_test', $emailUser); $this->emailEntityBuilder->getBatch()->persist($om); }
/** * {@inheritdoc} */ public function load(ObjectManager $manager) { $this->em = $manager; $this->organization = $manager->getRepository('OroOrganizationBundle:Organization')->getFirst(); $user1 = $this->createUser('Richard', 'Bradley'); $user2 = $this->createUser('Brenda', 'Brock'); $user3 = $this->createUser('Shawn', 'Bryson'); $this->setReference('user_1', $user1); $this->setReference('user_2', $user2); $this->setReference('user_3', $user3); $email1 = $this->createEmail('Test Email 1', 'email1@orocrm-pro.func-test', '*****@*****.**', '*****@*****.**'); $email1->addActivityTarget($user1); $email1->addActivityTarget($user2); $email1->addActivityTarget($user3); $email2 = $this->createEmail('Test Email 1', 'email2@orocrm-pro.func-test', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**'); $email2->addActivityTarget($user1); $this->emailEntityBuilder->getBatch()->persist($this->em); $this->em->flush(); $this->setReference('email_1', $email1); $this->setReference('email_2', $email2); }
/** * Process email model sending. * * @param EmailModel $model * @param EmailOrigin $origin Origin to send email with * * @return EmailUser * @throws \Swift_SwiftException */ public function process(EmailModel $model, $origin = null) { $this->assertModel($model); $messageDate = new \DateTime('now', new \DateTimeZone('UTC')); $parentMessageId = $this->getParentMessageId($model); /** @var \Swift_Message $message */ $message = $this->mailer->createMessage(); if ($parentMessageId) { $message->getHeaders()->addTextHeader('References', $parentMessageId); $message->getHeaders()->addTextHeader('In-Reply-To', $parentMessageId); } $message->setDate($messageDate->getTimestamp()); $message->setFrom($this->getAddresses($model->getFrom())); $message->setTo($this->getAddresses($model->getTo())); $message->setCc($this->getAddresses($model->getCc())); $message->setBcc($this->getAddresses($model->getBcc())); $message->setSubject($model->getSubject()); $message->setBody($model->getBody(), $model->getType() === 'html' ? 'text/html' : 'text/plain'); $this->addAttachments($message, $model); $this->processEmbeddedImages($message, $model); $messageId = '<' . $message->generateId() . '>'; if ($origin === null) { $this->emailOriginHelper->setEmailModel($model); $origin = $this->getEmailOrigin($model->getFrom(), $model->getOrganization()); } $this->processSend($message, $origin); $emailUser = $this->createEmailUser($model, $messageDate, $origin); $emailUser->addFolder($this->getFolder($model->getFrom(), $origin)); $emailUser->getEmail()->setEmailBody($this->emailEntityBuilder->body($message->getBody(), $model->getType() === 'html', true)); $emailUser->getEmail()->setMessageId($messageId); $emailUser->setSeen(true); if ($parentMessageId) { $emailUser->getEmail()->setRefs($parentMessageId); } // persist the email and all related entities such as folders, email addresses etc. $this->emailEntityBuilder->getBatch()->persist($this->getEntityManager()); $this->persistAttachments($model, $emailUser->getEmail()); // associate the email with the target entity if exist $contexts = $model->getContexts(); foreach ($contexts as $context) { $this->emailActivityManager->addAssociation($emailUser->getEmail(), $context); } // flush all changes to the database $this->getEntityManager()->flush(); $event = new EmailBodyAdded($emailUser->getEmail()); $this->eventDispatcher->dispatch(EmailBodyAdded::NAME, $event); return $emailUser; }
/** * @param ObjectManager $om */ protected function loadEmailsDemo(ObjectManager $om) { $contacts = $om->getRepository('OroCRMContactBundle:Contact')->findAll(); $contactCount = count($contacts); for ($i = 0; $i < 100; ++$i) { $contactRandom = rand(0, $contactCount - 1); /** @var Contact $contact */ $contact = $contacts[$contactRandom]; $owner = $contact->getOwner(); $origin = $this->mailerProcessor->getEmailOrigin($owner->getEmail()); $randomTemplate = array_rand($this->templates); $email = $this->emailEntityBuilder->email($this->templates[$randomTemplate]['Subject'], $owner->getEmail(), $contact->getPrimaryEmail()->getEmail(), new \DateTime('now'), new \DateTime('now'), new \DateTime('now')); $email->addFolder($origin->getFolder(EmailFolder::SENT)); $emailBody = $this->emailEntityBuilder->body("Hi,\n" . $this->templates[$randomTemplate]['Text'], false, true); $email->setEmailBody($emailBody); $email->setMessageId(sprintf('id.%s@%s', uniqid(), '@bap.migration.generated')); $this->emailEntityBuilder->getBatch()->persist($om); } }
/** * @param ObjectManager $om */ protected function loadEmailsDemo(ObjectManager $om) { foreach ($this->templates as $index => $template) { $owner = $this->getReference('simple_user'); $simpleUser2 = $this->getReference('simple_user2'); $origin = $this->mailerProcessor->getEmailOrigin($owner->getEmail()); $emailUser = $this->emailEntityBuilder->emailUser($template['Subject'], $owner->getEmail(), $owner->getEmail(), new \DateTime('now'), new \DateTime('now'), new \DateTime('now'), Email::NORMAL_IMPORTANCE, "cc{$index}@example.com", "bcc{$index}@example.com"); $emailUser->setFolder($origin->getFolder(FolderType::SENT)); $emailUser->getEmail()->addActivityTarget($owner); $emailUser->getEmail()->addActivityTarget($simpleUser2); $emailUser->setOrganization($owner->getOrganization()); $emailUser->setOwner($owner); $emailBody = $this->emailEntityBuilder->body("Hi,\n" . $template['Text'], false, true); $emailUser->getEmail()->setEmailBody($emailBody); $emailUser->getEmail()->setMessageId(sprintf('id.%s@%s', uniqid(), '@bap.migration.generated')); $this->setReference('email_' . ($index + 1), $emailUser->getEmail()); $this->setReference('emailBody_' . ($index + 1), $emailBody); } $this->emailEntityBuilder->getBatch()->persist($om); }
/** * Process form * * @param Email $model * @return bool True on successful processing, false otherwise */ public function process(Email $model) { $result = false; if ($this->request->getMethod() === 'GET') { $this->initModel($model); } $this->form->setData($model); if (in_array($this->request->getMethod(), array('POST', 'PUT'))) { $this->form->submit($this->request); if ($this->form->isValid()) { try { $messageDate = new \DateTime('now', new \DateTimeZone('UTC')); $message = $this->mailer->createMessage(); $message->setDate($messageDate->getTimestamp()); $message->setFrom($this->getAddresses($model->getFrom())); $message->setTo($this->getAddresses($model->getTo())); $message->setSubject($model->getSubject()); $message->setBody($model->getBody(), 'text/plain'); $sent = $this->mailer->send($message); if (!$sent) { throw new \Swift_SwiftException('An email was not delivered.'); } $origin = $this->em->getRepository('OroEmailBundle:InternalEmailOrigin')->findOneBy(array('name' => InternalEmailOrigin::BAP)); $this->emailEntityBuilder->setOrigin($origin); $email = $this->emailEntityBuilder->email($model->getSubject(), $model->getFrom(), $model->getTo(), $messageDate, $messageDate, $messageDate); $email->setFolder($origin->getFolder(EmailFolder::SENT)); $emailBody = $this->emailEntityBuilder->body($model->getBody(), false, true); $email->setEmailBody($emailBody); $this->emailEntityBuilder->getBatch()->persist($this->em); $this->em->flush(); $result = true; } catch (\Exception $ex) { $this->logger->error('Email sending failed.', array('exception' => $ex)); $this->form->addError(new FormError($this->translator->trans('oro.email.handler.unable_to_send_email'))); } } } return $result; }
public function testGetBatch() { $this->assertTrue($this->batch === $this->builder->getBatch()); }
/** * @param EmailModel $model * * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ protected function processEmailModel(EmailModel $model) { /** * TODO EmailEntityBuilder::email or EmailEntityBuilder::emailUser should be user here */ $this->assertModel($model); $currentDate = new \DateTime('now', new \DateTimeZone('UTC')); $messageDate = $model->getSentAt() ?: $currentDate; $this->ensureEmailEntitySet($model); $email = $model->getEntity(); // Subject if ($model->getSubject()) { $this->processString($email, 'Subject', $model->getSubject()); } // From if ($model->getFrom()) { $this->processSender($email, $model->getFrom()); } // To if ($model->getTo()) { $this->processRecipients($email, EmailRecipient::TO, $model->getTo()); } // Cc if ($model->getCc()) { $this->processRecipients($email, EmailRecipient::CC, $model->getCc()); } // Bcc if ($model->getBcc()) { $this->processRecipients($email, EmailRecipient::BCC, $model->getBcc()); } // Body if ($model->getBody()) { $this->processBody($email, $model->getBody(), $model->getBodyType()); } elseif ($model->getBodyType()) { $this->processBodyType($email, $model->getBodyType()); } // CreatedAt if ($model->getCreatedAt()) { $email->setCreated($model->getCreatedAt()); } elseif (!$email->getId()) { $email->setCreated($messageDate); } // SentAt if ($model->getSentAt()) { $email->setSentAt($model->getSentAt()); } elseif (!$email->getId()) { $email->setSentAt($messageDate); } // InternalDate if ($model->getInternalDate()) { $email->setInternalDate($model->getInternalDate()); } elseif (!$email->getId()) { $email->setInternalDate($messageDate); } // Importance if (null !== $model->getImportance()) { $this->processImportance($email, $model->getImportance()); } // Head if (null !== $model->isHead()) { $this->processHead($email, $model->isHead()); } // MessageId if (null !== $model->getMessageId()) { $this->processString($email, 'MessageId', $model->getMessageId()); } // XMessageId if (null !== $model->getXMessageId()) { $this->processString($email, 'XMessageId', $model->getXMessageId()); } // XThreadId if (null !== $model->getXThreadId()) { $this->processString($email, 'XThreadId', $model->getXThreadId()); } // Thread if (null !== $model->getThread()) { $this->processThread($email, $model->getThread()); } // Refs if (null !== $model->getRefs()) { $this->processRefs($email, $model->getRefs()); } // process EmailUser entities for each folder $emailUsers = $this->processFolders($email, $model->getFolders()); foreach ($emailUsers as $emailUser) { // ReceivedAt if ($model->getReceivedAt()) { $emailUser->setReceivedAt($model->getReceivedAt()); } elseif (!$email->getId()) { $emailUser->setReceivedAt($messageDate); } // Seen if (null !== $model->isSeen()) { $emailUser->setSeen($model->isSeen()); } $this->emailEntityBuilder->setObject($emailUser); } $this->emailEntityBuilder->getBatch()->persist($this->entityManager); }