/**
  * Given post data and an email message, populate the sender and account on the email message if possible.
  * Also add message recipients and any attachments.
  * @param array $postData
  * @param EmailMessage $emailMessage
  * @param User $userToSendMessagesFrom
  * @return boolean
  */
 public static function resolveEmailMessageFromPostData(array &$postData, CreateEmailMessageForm $emailMessageForm, User $userToSendMessagesFrom)
 {
     $postVariableName = get_class($emailMessageForm);
     Yii::app()->emailHelper->loadOutboundSettingsFromUserEmailAccount($userToSendMessagesFrom);
     $toRecipients = explode(",", $postData[$postVariableName]['recipientsData']['to']);
     // Not Coding Standard
     static::attachRecipientsToMessage($toRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_TO);
     if (ArrayUtil::getArrayValue($postData[$postVariableName]['recipientsData'], 'cc') != null) {
         $ccRecipients = explode(",", $postData[$postVariableName]['recipientsData']['cc']);
         // Not Coding Standard
         static::attachRecipientsToMessage($ccRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_CC);
     }
     if (ArrayUtil::getArrayValue($postData[$postVariableName]['recipientsData'], 'bcc') != null) {
         $bccRecipients = explode(",", $postData[$postVariableName]['recipientsData']['bcc']);
         // Not Coding Standard
         static::attachRecipientsToMessage($bccRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_BCC);
     }
     if (isset($postData['filesIds'])) {
         static::attachFilesToMessage($postData['filesIds'], $emailMessageForm->getModel());
     }
     $emailAccount = EmailAccount::getByUserAndName($userToSendMessagesFrom);
     $sender = new EmailMessageSender();
     $sender->fromName = Yii::app()->emailHelper->fromName;
     $sender->fromAddress = Yii::app()->emailHelper->fromAddress;
     $sender->personOrAccount = $userToSendMessagesFrom;
     $emailMessageForm->sender = $sender;
     $emailMessageForm->account = $emailAccount;
     $emailMessageForm->content->textContent = EmailMessageUtil::resolveTextContent(ArrayUtil::getArrayValue($postData[$postVariableName]['content'], 'htmlContent'), null);
     $box = EmailBox::resolveAndGetByName(EmailBox::NOTIFICATIONS_NAME);
     $emailMessageForm->folder = EmailFolder::getByBoxAndType($box, EmailFolder::TYPE_OUTBOX);
     return $emailMessageForm;
 }
 protected function preFilter($filterChain)
 {
     $sendGridPluginEnabled = (bool) ZurmoConfigurationUtil::getByModuleName('SendGridModule', 'enableSendgrid');
     try {
         if ($sendGridPluginEnabled) {
             SendGridEmailAccount::getByUserAndName(Yii::app()->user->userModel, null);
         } else {
             EmailAccount::getByUserAndName(Yii::app()->user->userModel);
         }
     } catch (NotFoundException $e) {
         $redirectUrl = Yii::app()->request->getParam('redirectUrl');
         if ($sendGridPluginEnabled) {
             try {
                 EmailAccount::getByUserAndName(Yii::app()->user->userModel);
             } catch (NotFoundException $ex) {
                 $messageView = new NoUserEmailConfigurationYetView($redirectUrl);
                 $view = new ModalView($this->controller, $messageView);
                 Yii::app()->getClientScript()->setToAjaxMode();
                 echo $view->render();
                 return false;
             }
         } else {
             $messageView = new NoUserEmailConfigurationYetView($redirectUrl);
             $view = new ModalView($this->controller, $messageView);
             Yii::app()->getClientScript()->setToAjaxMode();
             echo $view->render();
             return false;
         }
     }
     return true;
 }
 /**
  * Given post data and an email message, populate the sender and account on the email message if possible.
  * Also add message recipients and any attachments.
  * @param array $postData
  * @param CreateEmailMessageForm $emailMessageForm
  * @param User $userToSendMessagesFrom
  * @return CreateEmailMessageForm
  */
 public static function resolveEmailMessageFromPostData(array &$postData, CreateEmailMessageForm $emailMessageForm, User $userToSendMessagesFrom)
 {
     $postVariableName = get_class($emailMessageForm);
     $toRecipients = explode(",", $postData[$postVariableName]['recipientsData']['to']);
     // Not Coding Standard
     static::attachRecipientsToMessage($toRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_TO);
     if (ArrayUtil::getArrayValue($postData[$postVariableName]['recipientsData'], 'cc') != null) {
         $ccRecipients = explode(",", $postData[$postVariableName]['recipientsData']['cc']);
         // Not Coding Standard
         static::attachRecipientsToMessage($ccRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_CC);
     }
     if (ArrayUtil::getArrayValue($postData[$postVariableName]['recipientsData'], 'bcc') != null) {
         $bccRecipients = explode(",", $postData[$postVariableName]['recipientsData']['bcc']);
         // Not Coding Standard
         static::attachRecipientsToMessage($bccRecipients, $emailMessageForm->getModel(), EmailMessageRecipient::TYPE_BCC);
     }
     if (isset($postData['filesIds'])) {
         static::attachFilesToMessage($postData['filesIds'], $emailMessageForm->getModel());
     }
     $emailAccount = EmailAccount::getByUserAndName($userToSendMessagesFrom);
     $sender = new EmailMessageSender();
     $sender->fromName = $emailAccount->fromName;
     $sender->fromAddress = $emailAccount->fromAddress;
     $sender->personsOrAccounts->add($userToSendMessagesFrom);
     $emailMessageForm->sender = $sender;
     $emailMessageForm->account = $emailAccount;
     $box = EmailBoxUtil::getDefaultEmailBoxByUser($userToSendMessagesFrom);
     $emailMessageForm->folder = EmailFolder::getByBoxAndType($box, EmailFolder::TYPE_OUTBOX);
     return $emailMessageForm;
 }
Exemple #4
0
 /**
  * @depends testResolveAndGetByUserAndName
  */
 public function testGetByUserAndName()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $emailAccount = EmailAccount::getByUserAndName($super);
     $this->assertEquals('Default', $emailAccount->name);
     $this->assertEquals($super, $emailAccount->user);
     $this->assertEquals($super->getFullName(), $emailAccount->fromName);
     $this->assertEquals('*****@*****.**', $emailAccount->fromAddress);
     $this->assertEquals(0, $emailAccount->useCustomOutboundSettings);
     $this->assertEquals('smtp', $emailAccount->outboundType);
 }
 protected function preFilter($filterChain)
 {
     try {
         EmailAccount::getByUserAndName(Yii::app()->user->userModel);
     } catch (NotFoundException $e) {
         $redirectUrl = Yii::app()->request->getParam('redirectUrl');
         $messageView = new NoUserEmailConfigurationYetView($redirectUrl);
         $view = new ModalView($this->controller, $messageView);
         Yii::app()->getClientScript()->setToAjaxMode();
         echo $view->render();
         return false;
     }
     return true;
 }
 /**
  * Load user's outbound settings from user's email account or the system settings
  * @param User   $user
  * @param string $name  EmailAccount name or null for default name
  */
 public function loadOutboundSettingsFromUserEmailAccount(User $user, $name = null)
 {
     $userEmailAccount = EmailAccount::getByUserAndName($user, $name);
     if ($userEmailAccount->useCustomOutboundSettings == EmailMessageUtil::OUTBOUND_PERSONAL_SMTP_SETTINGS) {
         $settingsToLoad = array_merge(static::$settingsToLoad, array('fromName', 'fromAddress'));
         foreach ($settingsToLoad as $keyName) {
             if ($keyName == 'outboundPassword') {
                 $keyValue = ZurmoPasswordSecurityUtil::decrypt($userEmailAccount->{$keyName});
                 $this->{$keyName} = $keyValue;
             } else {
                 $this->{$keyName} = $userEmailAccount->{$keyName};
             }
         }
     } else {
         $this->loadOutboundSettings();
         $this->fromName = strval($user);
         $this->fromAddress = $this->resolveFromAddressByUser($user);
     }
 }
 public function testSendMessagePopulatesEmailAccountSettings()
 {
     $jane = User::getByUsername('jane');
     Yii::app()->user->userModel = $jane;
     $emailHelper = new EmailHelper();
     EmailMessageTestHelper::createEmailAccount($jane);
     $emailAccount = EmailAccount::getByUserAndName($jane);
     $emailAccount->useCustomOutboundSettings = EmailMessageUtil::OUTBOUND_PERSONAL_SMTP_SETTINGS;
     $emailAccount->outboundType = 'abc';
     $emailAccount->outboundPort = 11;
     $emailAccount->outboundHost = 'dumb.domain';
     $emailAccount->outboundUsername = '******';
     $emailAccount->outboundPassword = '******';
     $emailAccount->outboundSecurity = 'ssl';
     $emailAccount->save();
     $emailMessage = EmailMessageTestHelper::createOutboxEmail($jane, 'Test email', 'Raw content', 'Html content', 'Zurmo', Yii::app()->emailHelper->outboundUsername, 'John Doe', Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername']);
     $emailMessage->account = $emailAccount;
     $emailMessage->save();
     $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(0, Yii::app()->emailHelper->getSentCount());
     Yii::app()->emailHelper->sendQueued();
     $job = new ProcessOutboundEmailJob();
     $this->assertTrue($job->run());
     //Since user email account has invalid settings message is not sent
     $this->assertContains('Connection could not be established with host dumb.domain', strval($emailMessage->error));
     $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
     $this->assertEquals(0, Yii::app()->emailHelper->getSentCount());
 }
 /**
  * @depends testLoadOutboundSettings
  */
 public function testLoadOutboundSettingsFromUserEmailAccount()
 {
     $billy = User::getByUsername('billy');
     Yii::app()->user->userModel = $billy;
     $emailHelper = new EmailHelper();
     //Load outbound setting when no EmailAccount was created
     try {
         $emailHelper->loadOutboundSettingsFromUserEmailAccount($billy);
     } catch (NotFoundException $e) {
         $this->addToAssertionCount(1);
     }
     //Load outbound setting when EmailAccount useCustomOutboundSettings = false
     EmailMessageTestHelper::createEmailAccount($billy);
     $emailHelper->loadOutboundSettingsFromUserEmailAccount($billy);
     $this->assertEquals('smtp', $emailHelper->outboundType);
     $this->assertEquals(25, $emailHelper->outboundPort);
     $this->assertEquals('xxx', $emailHelper->outboundHost);
     $this->assertNull($emailHelper->outboundUsername);
     $this->assertNull($emailHelper->outboundPassword);
     $this->assertNull($emailHelper->outboundSecurity);
     $this->assertEquals($emailHelper->defaultTestToAddress, $emailHelper->fromAddress);
     $this->assertEquals(strval($billy), $emailHelper->fromName);
     //Load outbound setting when EmailAccount useCustomOutboundSettings = true
     $emailAccount = EmailAccount::getByUserAndName($billy);
     $emailAccount->useCustomOutboundSettings = true;
     $emailAccount->outboundType = 'xyz';
     $emailAccount->outboundPort = 55;
     $emailAccount->outboundHost = 'zurmo.com';
     $emailAccount->outboundUsername = '******';
     $emailAccount->outboundPassword = '******';
     $emailAccount->outboundSecurity = 'ssl';
     $emailAccount->save();
     $emailHelper->loadOutboundSettingsFromUserEmailAccount($billy);
     $this->assertEquals('xyz', $emailHelper->outboundType);
     $this->assertEquals(55, $emailHelper->outboundPort);
     $this->assertEquals('zurmo.com', $emailHelper->outboundHost);
     $this->assertEquals('billy', $emailHelper->outboundUsername);
     $this->assertEquals('billypass', $emailHelper->outboundPassword);
     $this->assertEquals('ssl', $emailHelper->outboundSecurity);
     $this->assertEquals($billy->getFullName(), $emailHelper->fromName);
     $this->assertEquals('*****@*****.**', $emailHelper->fromAddress);
 }
 public function testResolveEmailMessageFromPostData()
 {
     $billy = User::getByUsername('billy');
     Yii::app()->user->userModel = $billy;
     //Test with no users/person in recipients
     $emailMessage = new EmailMessage();
     $emailMessageForm = new CreateEmailMessageForm($emailMessage);
     $postVariableName = get_class($emailMessageForm);
     $postData = array($postVariableName => array('recipientsData' => array('to' => 'a@zurmo.com,b@zurmo.com', 'cc' => 'c@zurmo.com,d@zurmo.com', 'bcc' => 'e@zurmo.com,f@zurmo.com'), 'subject' => 'Test Email From Post', 'content' => array('htmlContent' => 'This is a test email')));
     $emailMessageForm = EmailMessageUtil::resolveEmailMessageFromPostData($postData, $emailMessageForm, $billy);
     //Message should have 6 recipients 2 of each type
     $this->assertEquals('6', count($emailMessageForm->getModel()->recipients));
     $recipients = $emailMessageForm->getModel()->recipients;
     $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[0]->type);
     $this->assertEquals(EmailMessageRecipient::TYPE_TO, $recipients[1]->type);
     $this->assertEquals(EmailMessageRecipient::TYPE_CC, $recipients[2]->type);
     $this->assertEquals(EmailMessageRecipient::TYPE_CC, $recipients[3]->type);
     $this->assertEquals(EmailMessageRecipient::TYPE_BCC, $recipients[4]->type);
     $this->assertEquals(EmailMessageRecipient::TYPE_BCC, $recipients[5]->type);
     $this->assertEquals('*****@*****.**', $recipients[0]->toAddress);
     $this->assertEquals('*****@*****.**', $recipients[1]->toAddress);
     $this->assertEquals('*****@*****.**', $recipients[2]->toAddress);
     $this->assertEquals('*****@*****.**', $recipients[3]->toAddress);
     $this->assertEquals('*****@*****.**', $recipients[4]->toAddress);
     $this->assertEquals('*****@*****.**', $recipients[5]->toAddress);
     $this->assertEquals('', $recipients[0]->toName);
     $this->assertEquals('', $recipients[1]->toName);
     $this->assertEquals('', $recipients[2]->toName);
     $this->assertEquals('', $recipients[3]->toName);
     $this->assertEquals('', $recipients[4]->toName);
     $this->assertEquals('', $recipients[5]->toName);
     //Recipients are not personOrAccount
     $this->assertCount(0, $recipients[0]->personsOrAccounts);
     $this->assertCount(0, $recipients[1]->personsOrAccounts);
     $this->assertCount(0, $recipients[2]->personsOrAccounts);
     $this->assertCount(0, $recipients[3]->personsOrAccounts);
     $this->assertCount(0, $recipients[4]->personsOrAccounts);
     $this->assertCount(0, $recipients[5]->personsOrAccounts);
     //The message should go to billy's box
     $this->assertEquals(EmailBox::USER_DEFAULT_NAME, $emailMessageForm->folder->emailBox->name);
     //The message should go to the default outbox folder
     $this->assertEquals(EmailFolder::getDefaultOutboxName(), $emailMessageForm->folder->name);
     $this->assertEquals(EmailFolder::TYPE_OUTBOX, $emailMessageForm->folder->type);
     //The sender should be populated with details from the users email account
     $emailAccount = EmailAccount::getByUserAndName($billy);
     $this->assertEquals($emailAccount->fromName, $emailMessageForm->sender->fromName);
     $this->assertEquals($emailAccount->fromAddress, $emailMessageForm->sender->fromAddress);
     //Test with null in cc/bcc
     $emailMessage = new EmailMessage();
     $emailMessageForm = new CreateEmailMessageForm($emailMessage);
     $postVariableName = get_class($emailMessageForm);
     $postData = array($postVariableName => array('recipientsData' => array('to' => '*****@*****.**', 'cc' => null, 'bcc' => null), 'subject' => 'Test Email From Post', 'content' => array('htmlContent' => 'This is a test email')));
     $emailMessageForm = EmailMessageUtil::resolveEmailMessageFromPostData($postData, $emailMessageForm, $billy);
     $this->assertEquals('1', count($emailMessageForm->getModel()->recipients));
     $this->assertEquals(EmailMessageRecipient::TYPE_TO, $emailMessageForm->getModel()->recipients[0]->type);
     $this->assertEquals('*****@*****.**', $emailMessageForm->getModel()->recipients[0]->toAddress);
     //Test with with contacts in recipients
     $emailMessage = new EmailMessage();
     $emailMessageForm = new CreateEmailMessageForm($emailMessage);
     $postVariableName = get_class($emailMessageForm);
     $postData = array($postVariableName => array('recipientsData' => array('to' => '*****@*****.**', 'cc' => null, 'bcc' => null), 'subject' => 'Test Email From Post', 'content' => array('htmlContent' => 'This is a test email')));
     $emailMessageForm = EmailMessageUtil::resolveEmailMessageFromPostData($postData, $emailMessageForm, $billy);
     $this->assertEquals('1', count($emailMessageForm->getModel()->recipients));
     $this->assertEquals(EmailMessageRecipient::TYPE_TO, $emailMessageForm->getModel()->recipients[0]->type);
     $this->assertEquals('*****@*****.**', $emailMessageForm->getModel()->recipients[0]->toAddress);
     $contacts = Contact::getByName('sally sallyson');
     $this->assertTrue($emailMessageForm->getModel()->recipients[0]->personsOrAccounts[0]->isSame($contacts[0]));
     //Test with attachments
     $email = new Email();
     $filesIds = array();
     $fileDocx = ZurmoTestHelper::createFileModel('testNote.txt');
     $filesIds[] = $fileDocx->id;
     $fileTxt = ZurmoTestHelper::createFileModel('testImage.png');
     $filesIds[] = $fileTxt->id;
     $emailMessage = new EmailMessage();
     $emailMessageForm = new CreateEmailMessageForm($emailMessage);
     $postVariableName = get_class($emailMessageForm);
     $postData = array($postVariableName => array('recipientsData' => array('to' => '*****@*****.**', 'cc' => null, 'bcc' => null), 'subject' => 'Test Email From Post', 'content' => array('htmlContent' => 'This is a test email')), 'filesIds' => $filesIds);
     $emailMessageForm = EmailMessageUtil::resolveEmailMessageFromPostData($postData, $emailMessageForm, $billy);
     $this->assertEquals(2, count($emailMessageForm->getModel()->files));
 }