예제 #1
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);
 }
예제 #2
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 string               $subject
  * @param string               $messageId
  * @param string               $from
  * @param string|string[]      $to
  * @param string|string[]|null $cc
  * @param string|string[]|null $bcc
  *
  * @return Email
  */
 protected function createEmail($subject, $messageId, $from, $to, $cc = null, $bcc = null)
 {
     $origin = $this->mailerProcessor->getEmailOrigin($this->getReference('simple_user')->getEmail());
     $folder = $origin->getFolder(FolderType::SENT);
     $date = new \DateTime('now', new \DateTimeZone('UTC'));
     $emailUser = $this->emailEntityBuilder->emailUser($subject, $from, $to, $date, $date, $date, Email::NORMAL_IMPORTANCE, $cc, $bcc);
     $emailUser->setFolder($folder);
     $emailUser->getEmail()->setMessageId($messageId);
     return $emailUser->getEmail();
 }
 /**
  * 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();
 }
예제 #5
0
 /**
  * @param EmailModel  $model
  * @param \DateTime   $messageDate
  * @param EmailOrigin $origin
  *
  * @return EmailUser
  */
 protected function createEmailUser(EmailModel $model, $messageDate, EmailOrigin $origin)
 {
     $emailUser = $this->emailEntityBuilder->emailUser($model->getSubject(), $model->getFrom(), $model->getTo(), $messageDate, $messageDate, $messageDate, Email::NORMAL_IMPORTANCE, $model->getCc(), $model->getBcc(), $origin->getOwner(), $origin->getOrganization());
     if ($origin instanceof UserEmailOrigin && $origin->getMailbox() !== null) {
         $emailUser->setOwner(null);
         $emailUser->setMailboxOwner($origin->getMailbox());
     }
     return $emailUser;
 }
예제 #6
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);
     }
 }
예제 #7
0
 /**
  * @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);
 }
예제 #8
0
 /**
  * @param $randomTemplate
  * @param User $owner
  * @param Contact $contact
  * @param EmailOrigin $origin
  *
  * @return EmailUser
  */
 protected function addEmailUser($randomTemplate, $owner, $contact, $origin)
 {
     $emailUser = $this->emailEntityBuilder->emailUser($this->templates[$randomTemplate]['Subject'], $owner->getEmail(), $contact->getPrimaryEmail()->getEmail(), new \DateTime('now'), new \DateTime('now'), new \DateTime('now'));
     $this->setSecurityContext($owner);
     $emailUser->setFolder($origin->getFolder(FolderType::SENT));
     $emailUser->setOwner($owner);
     $emailUser->setOrganization($owner->getOrganization());
     $emailBody = $this->emailEntityBuilder->body("Hi,\n" . $this->templates[$randomTemplate]['Text'], false, true);
     $emailUser->getEmail()->setEmailBody($emailBody);
     $emailUser->getEmail()->setMessageId(sprintf('<id.%s@%s', uniqid(), '@bap.migration.generated>'));
     return $emailUser;
 }
예제 #9
0
 /**
  * @param Email  $email
  * @param string $type
  */
 protected function processBodyType(Email $email, $type)
 {
     $body = $email->getEmailBody();
     if ($body) {
         if ($email->getId()) {
             if ($body->getBodyIsText() !== ($type === true)) {
                 throw $this->createInvalidPropertyException('Body Type', $this->emailBodyTypeTransformer->transform($body->getBodyIsText()), $this->emailBodyTypeTransformer->transform($type));
             }
         } else {
             $body->setBodyIsText($type === true);
         }
     } else {
         $email->setEmailBody($this->emailEntityBuilder->body('', $type !== true, true));
     }
 }
예제 #10
0
 /**
  * Process email model sending.
  *
  * @param EmailModel $model
  *
  * @return EmailUser
  * @throws \Swift_SwiftException
  */
 public function process(EmailModel $model)
 {
     $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 (!$this->mailer->send($message)) {
         throw new \Swift_SwiftException('An email was not delivered.');
     }
     $origin = $this->getEmailOrigin($model->getFrom());
     $emailUser = $this->emailEntityBuilder->emailUser($model->getSubject(), $model->getFrom(), $model->getTo(), $messageDate, $messageDate, $messageDate, Email::NORMAL_IMPORTANCE, $model->getCc(), $model->getBcc(), $origin->getOwner(), $origin->getOrganization());
     $emailUser->setFolder($origin->getFolder(FolderType::SENT));
     $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;
 }
예제 #11
0
 /**
  * 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;
 }
예제 #12
0
 public function testGetBatch()
 {
     $this->assertTrue($this->batch === $this->builder->getBatch());
 }
 /**
  * Creates email entity and register it in the email entity batch processor
  *
  * @param EmailHeader       $email
  * @param EmailFolder $folder
  *
  * @return EmailEntity
  */
 protected function addEmail(EmailHeader $email, EmailFolder $folder)
 {
     $emailEntity = $this->emailEntityBuilder->email($email->getSubject(), $email->getFrom(), $email->getToRecipients(), $email->getSentAt(), $email->getReceivedAt(), $email->getInternalDate(), $email->getImportance(), $email->getCcRecipients(), $email->getBccRecipients());
     $emailEntity->addFolder($folder)->setMessageId($email->getMessageId())->setXMessageId($email->getXMessageId())->setXThreadId($email->getXThreadId());
     return $emailEntity;
 }