emailKey = isset($emailKey) ? $emailKey : null; // If a context wasn't specified, use the current request. $application = PKPApplication::getApplication(); $request = $application->getRequest(); if ($context === null) $context = $request->getContext(); $this->includeSignature = $includeSignature; // Use current user's locale if none specified $this->locale = isset($locale) ? $locale : AppLocale::getLocale(); // Record whether or not to BCC the sender when sending message $this->bccSender = $request->getUserVar('bccSender'); $this->addressFieldsEnabled = true; if (isset($this->emailKey)) { $emailTemplateDao = DAORegistry::getDAO('EmailTemplateDAO'); $emailTemplate = $emailTemplateDao->getEmailTemplate($this->emailKey, $this->locale, $context == null ? 0 : $context->getId()); } $userSig = ''; $user = defined('SESSION_DISABLE_INIT')?null:$request->getUser(); if ($user && $this->includeSignature) { $userSig = $user->getLocalizedSignature(); if (!empty($userSig)) $userSig = "
" . $userSig; } if (isset($emailTemplate)) { $this->setSubject($emailTemplate->getSubject()); $this->setBody($emailTemplate->getBody() . $userSig); $this->enabled = $emailTemplate->getEnabled(); } else { $this->setBody($userSig); $this->enabled = true; } // Default "From" to user if available, otherwise site/context principal contact $this->emailHeader = ''; if ($user) { $this->setFrom($user->getEmail(), $user->getFullName()); } elseif (is_null($context) || is_null($context->getSetting('contactEmail'))) { $site = $request->getSite(); $this->setFrom($site->getLocalizedContactEmail(), $site->getLocalizedContactName()); } else { $this->setFrom($context->getSetting('contactEmail'), $context->getSetting('contactName')); $this->emailHeader = $context->getSetting('emailHeader'); } if ($context) { $this->setSubject('[' . $context->getLocalizedAcronym() . '] ' . $this->getSubject()); } $this->context = $context; $this->params = array(); } /** * Disable or enable the address fields on the email form. * NOTE: This affects the displayed form ONLY; if disabling the address * fields, callers should manually clearAllRecipients and add/set * recipients just prior to sending. * @param $addressFieldsEnabled boolean */ function setAddressFieldsEnabled($addressFieldsEnabled) { $this->addressFieldsEnabled = $addressFieldsEnabled; } /** * Get the enabled/disabled state of address fields on the email form. * @return boolean */ function getAddressFieldsEnabled() { return $this->addressFieldsEnabled; } /** * Check whether or not there were errors in the user input for this form. * @return boolean true iff one or more error messages are stored. */ function hasErrors() { return ($this->errorMessages != null); } /** * Assigns values to e-mail parameters. * @param $params array Associative array of variables to supply to the email template */ function assignParams($params = array()) { $application = PKPApplication::getApplication(); $request = $application->getRequest(); $site = $request->getSite(); if ($this->context) { // Add context-specific variables $dispatcher = $application->getDispatcher(); $params = array_merge(array( 'principalContactSignature' => $this->context->getSetting('contactName'), 'contextName' => $this->context->getLocalizedName(), 'contextUrl' => $dispatcher->url($request, ROUTE_PAGE, $this->context->getPath()), ), $params); } else { // No context available $params = array_merge(array( 'principalContactSignature' => $site->getLocalizedContactName(), ), $params); } if (!defined('SESSION_DISABLE_INIT') && ($user = $request->getUser())) { // Add user-specific variables $params = array_merge(array( 'senderEmail' => $user->getEmail(), 'senderName' => $user->getFullName(), ), $params); } // Add some general variables $params = array_merge(array( 'siteTitle' => $site->getLocalizedTitle(), ), $params); $this->params = $params; } /** * Returns true if the email template is enabled; false otherwise. * @return boolean */ function isEnabled() { return $this->enabled; } /** * Processes form-submitted addresses for inclusion in * the recipient list * @param $currentList array Current recipient/cc/bcc list * @param $newAddresses array "Raw" form parameter for additional addresses */ function &processAddresses($currentList, &$newAddresses) { foreach ($newAddresses as $newAddress) { $regs = array(); // Match the form "My Name " if (PKPString::regexp_match_get('/^([^<>' . "\n" . ']*[^<> ' . "\n" . '])[ ]*<(?P' . PCRE_EMAIL_ADDRESS . ')>$/i', $newAddress, $regs)) { $currentList[] = array('name' => $regs[1], 'email' => $regs['email']); } elseif (PKPString::regexp_match_get('/^' . PCRE_EMAIL_ADDRESS . ')>?$/i', $newAddress, $regs)) { $currentList[] = array('name' => '', 'email' => $regs['email']); } elseif ($newAddress != '') { $this->errorMessages[] = array('type' => MAIL_ERROR_INVALID_EMAIL, 'address' => $newAddress); } } return $currentList; } /** * Send the email. * @return boolean false if there was a problem sending the email */ function send() { if (isset($this->context)) { $signature = $this->context->getSetting('emailSignature'); if (strstr($this->getBody(), '{$templateSignature}') === false) { $this->setBody($this->getBody() . "
" . $signature); } else { $this->setBody(str_replace('{$templateSignature}', $signature, $this->getBody())); } $envelopeSender = $this->context->getSetting('envelopeSender'); if (!empty($envelopeSender) && Config::getVar('email', 'allow_envelope_sender')) $this->setEnvelopeSender($envelopeSender); } $user = defined('SESSION_DISABLE_INIT')?null:Request::getUser(); if ($user && $this->bccSender) { $this->addBcc($user->getEmail(), $user->getFullName()); } // Replace variables in message with values $this->replaceParams(); return parent::send(); } /** * Replace template variables in the message body. * @param $params array Parameters to assign (augments anything provided via setParams) */ function replaceParams() { $subject = $this->getSubject(); $body = $this->getBody(); foreach ($this->params as $key => $value) { if (!is_object($value)) { // $value is checked to identify URL pattern if (filter_var($value, FILTER_VALIDATE_URL) != false) { $body = $this->manageURLValues($body, $key, $value); } else { $body = str_replace('{$' . $key . '}', $value, $body); } } $subject = str_replace('{$' . $key . '}', $value, $subject); } $this->setSubject($subject); $this->setBody($body); } /** * Assigns user-specific values to email parameters, sends * the email, then clears those values. * @param $params array Associative array of variables to supply to the email template * @return boolean false if there was a problem sending the email */ function sendWithParams($params) { $savedHeaders = $this->getHeaders(); $savedSubject = $this->getSubject(); $savedBody = $this->getBody(); $this->assignParams($params); $ret = $this->send(); $this->setHeaders($savedHeaders); $this->setSubject($savedSubject); $this->setBody($savedBody); return $ret; } /** * Clears the recipient, cc, and bcc lists. * @param $clearHeaders boolean if true, also clear headers * @return void */ function clearRecipients($clearHeaders = true) { $this->setData('recipients', null); $this->setData('ccs', null); $this->setData('bccs', null); if ($clearHeaders) { $this->setData('headers', null); } } /** * Finds and changes appropriately URL valued template parameter keys. * @param $targetString string The string that contains the original {$key}s template variables * @param $key string The key we are looking for, and has an URL as its $value * @param $value string The value of the $key * @return string the $targetString replaced appropriately */ function manageURLValues($targetString, $key, $value) { // If the value is URL, we need to find if $key resides in a href={$...} pattern. preg_match_all('/=[\\\'"]{\\$' . preg_quote($key) . '}/', $targetString, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE); // if we find some ={$...} occurences of the $key in the email body, then we need to replace them with // the corresponding value if ($matches) { // We make the change backwords (last offset replaced first) so that smaller offsets correctly mark the string they supposed to. for($i = count($matches)-1; $i >= 0; $i--) { $match = $matches[$i][0]; $targetString = substr_replace($targetString, str_replace('{$' . $key . '}', $value, $match[0]), $match[1], strlen($match[0])); } } // all the ={$...} patterns have been replaced - now we can change the remaining URL $keys with the following pattern $value = "$value"; $targetString = str_replace('{$' . $key . '}', $value, $targetString); return $targetString; } } ?>