/** * 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; }
public function testOrigin() { $storage = array(); $origin = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\EmailOrigin')->getMock(); $origin->expects($this->any())->method('getId')->will($this->returnValue(1)); $this->batch->expects($this->never())->method('getOrigin'); $this->batch->expects($this->exactly(2))->method('addOrigin')->will($this->returnCallback(function ($origin) use(&$storage) { $storage[$origin->getId()] = $origin; })); $result = $this->builder->setOrigin($origin); $this->assertEquals(1, $result->getId()); $this->assertTrue($result === $this->builder->setOrigin($origin)); }
/** * 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; }