/** * 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 .= ' ('; } if ($optOut) { $content .= Zurmo::t('EmailMessagesModule', 'Opted Out'); } if ($isInvalid) { if ($optOut) { $content .= ', '; } $content .= Zurmo::t('EmailMessagesModule', 'Invalid'); } if ($optOut || $isInvalid) { $content .= ')'; } } 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(); } }