/** * 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; }
/** * @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)); }