/** * @dataProvider findEmailOriginDataProvider * * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $mailModelExpects * @param string $emailOwner * @param bool $enableUseUserEmailOrigin * @param bool $isOriginsNotEmpty * @param \PHPUnit_Framework_MockObject_MockObject $origin * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $emailOriginsTimes */ public function testFindEmailOrigin($mailModelExpects, $emailOwner, $enableUseUserEmailOrigin, $isOriginsNotEmpty, \PHPUnit_Framework_MockObject_MockObject $origin, $emailOriginsTimes) { $organization = $this->getMock('Oro\\Bundle\\OrganizationBundle\\Entity\\OrganizationInterface'); $collection = new ArrayCollection([$origin]); $originName = 'origin name'; $campaignOwner = null; $origin->expects(self::once())->method('getOrganization')->willReturn($organization); if (true === $enableUseUserEmailOrigin && true === $isOriginsNotEmpty) { $origin->expects(self::once())->method('isActive')->willReturn($isOriginsNotEmpty); $origin->expects(self::once())->method('isSmtpConfigured')->willReturn($isOriginsNotEmpty); } if ('user' === $emailOwner) { $emailOwner = $this->getMockBuilder('Oro\\Bundle\\UserBundle\\Entity\\User')->setMethods(['getEmailOrigins', 'addEmailOrigin'])->disableOriginalConstructor()->getMock(); $emailOwner->expects($emailOriginsTimes)->method('getEmailOrigins')->willReturn($collection); if (false === $enableUseUserEmailOrigin) { $emailOwner->expects(self::once())->method('addEmailOrigin'); } } elseif ('emailBox' === $emailOwner) { $emailOwner = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Mailbox')->setMethods(['getOrigin'])->disableOriginalConstructor()->getMock(); if (true === $isOriginsNotEmpty) { $emailOwner->expects($emailOriginsTimes)->method('getOrigin')->willReturn($collection); } else { $emailOwner->expects($emailOriginsTimes)->method('getOrigin')->willReturn(null); $campaignOwner = $this->getMockBuilder('Oro\\Bundle\\UserBundle\\Entity\\User')->setMethods(['getEmailOrigins', 'addEmailOrigin'])->disableOriginalConstructor()->getMock(); $campaignOwner->expects(self::any())->method('getEmailOrigins')->willReturn($collection); } } $this->emailModel->expects($mailModelExpects)->method('getCampaignOwner')->willReturn($campaignOwner); $this->emailOriginHelper->setEmailModel($this->emailModel); $origin = $this->emailOriginHelper->findEmailOrigin($emailOwner, $organization, $originName, $enableUseUserEmailOrigin); self::assertNotNull($origin); }
/** * 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; }