Exemple #1
0
 /**
  * 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();
 }
Exemple #4
0
 /**
  * @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);
 }
Exemple #6
0
 /**
  * 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;
 }
Exemple #7
0
 /**
  * @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());
 }
Exemple #11
0
 /**
  * @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);
 }