示例#1
0
 /**
  * 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;
 }
 /**
  * Call this method to process all email Messages in the queue. This is typically called by a scheduled job
  * or cron.  This will process all emails in a TYPE_OUTBOX folder or TYPE_OUTBOX_ERROR folder. If the message
  * has already been sent 3 times then it will be moved to a failure folder.
  * @param null $count
  * @param bool $excludePausedCampaignMessages
  * @return int number of queued messages to be sent
  */
 public function sendQueued($count = null, $excludePausedCampaignMessages = true)
 {
     return EmailMessageUtil::sendQueued($this, $count, $excludePausedCampaignMessages);
 }
 /**
  * @depends testSend
  */
 public function testSendRealEmail()
 {
     self::loadEmailHelperWithTestCredentials();
     $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
     if (EmailMessageTestHelper::isSetEmailAccountsTestConfiguration()) {
         $user = User::getByUsername('steve');
         $user->primaryEmail->emailAddress = Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername'];
         $this->assertTrue($user->save());
         Yii::app()->imap->connect();
         Yii::app()->imap->deleteMessages(true);
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(0, $imapStats->Nmsgs);
         $emailMessage = EmailMessageTestHelper::createOutboxEmail($this->user, 'Test email', 'Raw content', ',b>html content</b>end.', 'Zurmo', Yii::app()->emailHelper->outboundUsername, 'Ivica', Yii::app()->params['emailTestAccounts']['userImapSettings']['imapUsername']);
         $filesIds = array();
         $fileTxt = ZurmoTestHelper::createFileModel('testNote.txt');
         $filesIds[] = $fileTxt->id;
         $filePng = ZurmoTestHelper::createFileModel('testImage.png');
         $filesIds[] = $filePng->id;
         $fileZip = ZurmoTestHelper::createFileModel('testZip.zip');
         $filesIds[] = $fileZip->id;
         $filePdf = ZurmoTestHelper::createFileModel('testPDF.pdf');
         $filesIds[] = $filePdf->id;
         EmailMessageUtil::attachFilesToMessage($filesIds, $emailMessage);
         $this->assertEquals('4', count($emailMessage->files));
         Yii::app()->imap->connect();
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(0, $imapStats->Nmsgs);
         $this->assertEquals(1, Yii::app()->emailHelper->getQueuedCount());
         $this->assertEquals(6, Yii::app()->emailHelper->getSentCount());
         Yii::app()->emailHelper->sendQueued();
         $job = new ProcessOutboundEmailJob();
         $this->assertTrue($job->run());
         $this->assertEquals(0, Yii::app()->emailHelper->getQueuedCount());
         $this->assertEquals(7, Yii::app()->emailHelper->getSentCount());
         sleep(30);
         Yii::app()->imap->connect();
         $imapStats = Yii::app()->imap->getMessageBoxStatsDetailed();
         $this->assertEquals(1, $imapStats->Nmsgs);
     }
 }
 public function actionCreateEmailMessage($toAddress = null, $relatedId = null, $relatedModelClassName = null)
 {
     $postData = PostUtil::getData();
     $getData = GetUtil::getData();
     $personOrAccount = self::resolvePersonOrAccountFromGet($relatedId, $relatedModelClassName);
     $emailMessage = new EmailMessage();
     $emailMessageForm = new CreateEmailMessageForm($emailMessage);
     $emailMessageForm->setScenario('createNonDraft');
     $postVariableName = get_class($emailMessageForm);
     if ($toAddress == null && $personOrAccount != null && $personOrAccount->primaryEmail->emailAddress != null) {
         $toAddress = $personOrAccount->primaryEmail->emailAddress;
     }
     if (isset($postData[$postVariableName])) {
         EmailMessageUtil::resolveEmailMessageFromPostData($postData, $emailMessageForm, Yii::app()->user->userModel);
         $this->actionValidateCreateEmailMessage($postData, $emailMessageForm);
         $this->attemptToSaveModelFromPost($emailMessageForm, null, false);
         ZurmoControllerUtil::updatePermissionsWithDefaultForModelByCurrentUser($emailMessageForm->getModel());
         Yii::app()->jobQueue->add('ProcessOutboundEmail');
     } else {
         EmailMessageUtil::resolveSignatureToEmailMessage($emailMessage, Yii::app()->user->userModel);
         EmailMessageUtil::resolvePersonOrAccountToEmailMessage($emailMessage, Yii::app()->user->userModel, $toAddress, $relatedId, $relatedModelClassName);
         $createEmailMessageModalEditView = new CreateEmailMessageModalEditView($this->getId(), $this->getModule()->getId(), $emailMessageForm);
         $view = new ModalView($this, $createEmailMessageModalEditView);
         Yii::app()->getClientScript()->setToAjaxMode();
         echo $view->render();
     }
 }
 /**
  * Renders the noneditable email address content.
  * If the model is a person, and the user accessing this element has right to access the email module,
  * then the email address will be clickable.  When clicked it will open a modal create email window.
  * Takes the model attribute value and converts it into
  * at most 3 items. Email Address display, Opt Out checkbox,
  * and Invalid Email checkbox.
  * @return A string containing the element's content.
  */
 protected function renderControlNonEditable()
 {
     $addressModel = $this->model->{$this->attribute};
     $emailAddress = $addressModel->emailAddress;
     $optOut = $addressModel->optOut;
     $isInvalid = $addressModel->isInvalid;
     $content = null;
     if (!empty($emailAddress)) {
         $content .= EmailMessageUtil::renderEmailAddressAsMailToOrModalLinkStringContent($emailAddress, $this->model);
         if ($optOut || $isInvalid) {
             $content .= '&#160;&#40;';
         }
         if ($optOut) {
             $content .= Zurmo::t('EmailMessagesModule', 'Opted Out');
         }
         if ($isInvalid) {
             if ($optOut) {
                 $content .= ',&#160;';
             }
             $content .= Zurmo::t('EmailMessagesModule', 'Invalid');
         }
         if ($optOut || $isInvalid) {
             $content .= '&#41;';
         }
     }
     return $content;
 }
 /**
  * Should sendgrid user settings be used to send email.
  * @return boolean
  */
 protected function shouldCustomUserSettingsBeUsed()
 {
     if ($this->emailAccount == null) {
         return false;
     }
     $itemData = EmailMessageUtil::getCampaignOrAutoresponderDataByEmailMessage($this->emailMessage);
     if ($itemData != null) {
         $useAutoresponderOrCampaignOwnerMailSettings = (bool) ZurmoConfigurationUtil::getByModuleName('MarketingModule', 'UseAutoresponderOrCampaignOwnerMailSettings');
         if ($this->emailAccount->useCustomOutboundSettings == EmailMessageUtil::OUTBOUND_PERSONAL_SMTP_SETTINGS && $this->emailAccount->outboundHost != '' && $this->emailAccount->outboundUsername != '' && $this->emailAccount->outboundPassword != '' && $useAutoresponderOrCampaignOwnerMailSettings === true) {
             $this->updateMailerDetailsForEmailMessage('smtp', 'personal');
             return true;
         }
         return false;
     } elseif ($this->emailAccount->useCustomOutboundSettings == EmailMessageUtil::OUTBOUND_PERSONAL_SMTP_SETTINGS && $this->emailAccount->outboundHost != '' && $this->emailAccount->outboundUsername != '' && $this->emailAccount->outboundPassword != '') {
         $this->updateMailerDetailsForEmailMessage('smtp', 'personal');
         return true;
     }
     return false;
 }
 /**
  * Send Queued email messages.
  * @param EmailHelper $emailHelper
  * @param null $count
  * @param bool $excludePausedCampaignMessages
  * @return bool
  * @throws NotSupportedException
  */
 public static function sendQueued(EmailHelper $emailHelper, $count = null, $excludePausedCampaignMessages = true)
 {
     assert('is_int($count) || $count == null');
     $outboxQueuedMessages = EmailMessageUtil::getOutboundQueuedMessages($count, $excludePausedCampaignMessages);
     foreach ($outboxQueuedMessages as $emailMessage) {
         $emailHelper->sendImmediately($emailMessage);
     }
     $outboxErrorQueuedMessages = EmailMessageUtil::getOutboundErrorQueuedMessages($count, count($outboxQueuedMessages));
     foreach ($outboxErrorQueuedMessages as $emailMessage) {
         if ($emailMessage->sendAttempts < 3) {
             $emailHelper->sendImmediately($emailMessage);
         } else {
             $emailHelper->processMessageAsFailure($emailMessage);
         }
     }
     return true;
 }
 protected function resolvePhoneAndEmailContent()
 {
     $content = null;
     if ($this->model->officePhone != null) {
         $content .= Yii::app()->phoneHelper->resolvePersonCardViewOfficePhoneNumberContent($this->model->officePhone, $this->model);
     }
     if ($this->model->mobilePhone != null) {
         $content .= Yii::app()->phoneHelper->resolvePersonCardViewMobilePhoneNumberContent($this->model->mobilePhone, $this->model);
     }
     if ($this->model->primaryEmail->emailAddress != null) {
         $emailContent = EmailMessageUtil::renderEmailAddressAsMailToOrModalLinkStringContent($this->model->primaryEmail->emailAddress, $this->model);
         $content .= ZurmoHtml::tag('span', array('class' => 'icon-email'), $emailContent);
     }
     if ($content != null) {
         return ZurmoHtml::tag('div', array('class' => 'contact-details'), $content);
     }
 }
 public function testResolveTextContent()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $htmlContent = "<br>A test message.";
     $textContent = '';
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("\nA test message.", $textContent);
     $htmlContent = "<p>A new test message.</p>";
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("\nA test message.", $textContent);
     $htmlContent = "<p>A test message.</p>";
     $textContent = '';
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("\n\nA test message.", $textContent);
     $htmlContent = "<u>A test</u> <b>message</b>.";
     $textContent = '';
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("A test message.", $textContent);
     $htmlContent = "<u><p>A test</p></u> <b>message</b>.";
     $textContent = '';
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("\n\nA test message.", $textContent);
     $htmlContent = "<br /><p>A test</p> <p>message</p>.";
     $textContent = '';
     $textContent = EmailMessageUtil::resolveTextContent($htmlContent, $textContent);
     $this->assertEquals("\n\n\nA test \n\nmessage.", $textContent);
 }
 /**
  * Send email.
  */
 public function sendEmail()
 {
     $emailMessage = $this->emailMessage;
     if ($this->emailAccount == null) {
         $apiUser = Yii::app()->sendGridEmailHelper->apiUsername;
         $apiPassword = Yii::app()->sendGridEmailHelper->apiPassword;
     } else {
         $apiUser = $this->emailAccount->apiUsername;
         $apiPassword = ZurmoPasswordSecurityUtil::decrypt($this->emailAccount->apiPassword);
     }
     $itemData = EmailMessageUtil::getCampaignOrAutoresponderDataByEmailMessage($this->emailMessage);
     $sendgrid = new SendGrid($apiUser, $apiPassword, array("turn_off_ssl_verification" => true));
     $email = new SendGrid\Email();
     $email->setFrom($this->fromUserEmailData['address'])->setFromName($this->fromUserEmailData['name'])->setSubject($emailMessage->subject)->setText($emailMessage->content->textContent)->setHtml($emailMessage->content->htmlContent)->addUniqueArg("zurmoToken", md5(ZURMO_TOKEN))->addHeader('X-Sent-Using', 'SendGrid-API')->addHeader('X-Transport', 'web');
     //Check if campaign and if yes, associate to email.
     if ($itemData != null) {
         list($itemId, $itemClass, $personId) = $itemData;
         $email->addUniqueArg("itemId", $itemId);
         $email->addUniqueArg("itemClass", $itemClass);
         $email->addUniqueArg("personId", $personId);
     }
     foreach ($this->toAddresses as $emailAddress => $name) {
         $email->addTo($emailAddress, $name);
     }
     foreach ($this->ccAddresses as $emailAddress => $name) {
         $email->addCc($emailAddress);
     }
     foreach ($this->bccAddresses as $emailAddress => $name) {
         $email->addBcc($emailAddress);
     }
     //Attachments
     $attachmentsData = array();
     $tempAttachmentPath = Yii::app()->getRuntimePath() . DIRECTORY_SEPARATOR . 'emailAttachments';
     if (!file_exists($tempAttachmentPath)) {
         mkdir($tempAttachmentPath);
     }
     if (!empty($emailMessage->files)) {
         foreach ($emailMessage->files as $file) {
             $fileName = tempnam($tempAttachmentPath, 'zurmo_');
             $fp = fopen($fileName, 'wb');
             fwrite($fp, $file->fileContent->content);
             fclose($fp);
             $email->addAttachment($fileName, $file->name);
             $attachmentsData[] = $fileName;
         }
     }
     $emailMessage->sendAttempts = $emailMessage->sendAttempts + 1;
     $response = $sendgrid->send($email);
     if ($response->message == 'success') {
         //Here we need to check if
         $emailMessage->error = null;
         $emailMessage->folder = EmailFolder::getByBoxAndType($emailMessage->folder->emailBox, EmailFolder::TYPE_SENT);
         $emailMessage->sentDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time());
     } elseif ($response->message == 'error') {
         $content = Zurmo::t('EmailMessagesModule', 'Response from Server') . "\n";
         foreach ($response->errors as $error) {
             $content .= $error;
         }
         $emailMessageSendError = new EmailMessageSendError();
         $data = array();
         $data['message'] = $content;
         $emailMessageSendError->serializedData = serialize($data);
         $emailMessage->folder = EmailFolder::getByBoxAndType($emailMessage->folder->emailBox, EmailFolder::TYPE_OUTBOX_ERROR);
         $emailMessage->error = $emailMessageSendError;
     }
     if (count($attachmentsData) > 0) {
         foreach ($attachmentsData as $path) {
             unlink($path);
         }
     }
     $saved = $emailMessage->save(false);
     if (!$saved) {
         throw new FailedToSaveModelException();
     }
 }