OwlCyberSecurity - MANAGER
Edit File: Notification.php
<?php /** * @copyright Copyright (c) 2009-2022 ThemeCatcher (https://www.themecatcher.net) */ class Quform_Notification { /** * @var array */ protected $config = array(); /** * @var Quform_Form */ protected $form; /** * @var Quform_Options */ protected $options; /** * @param array $config * @param Quform_Form $form * @param Quform_Options $options */ public function __construct(array $config, Quform_Form $form, Quform_Options $options) { $this->setConfig($config); $this->form = $form; $this->options = $options; } /** * Send the notification */ public function send() { do_action('quform_pre_get_mailer_config', $this, $this->form); do_action('quform_pre_get_mailer_config_' . $this->getIdentifier(), $this, $this->form); $config = $this->getMailerConfig(); do_action('quform_post_get_mailer_config', $this, $this->form); do_action('quform_post_get_mailer_config_' . $this->getIdentifier(), $this, $this->form); if (is_array($config)) { add_action('phpmailer_init', array($this, 'processHooks')); wp_mail($config['to'], $config['subject'], $config['message'], $config['headers'], $config['attachments']); remove_action('phpmailer_init', array($this, 'processHooks')); do_action('quform_post_send_notification', $this, $this->form); do_action('quform_post_send_notification_' . $this->getIdentifier(), $this, $this->form); } } /** * Replace variable tokens within the recipient fields. * * @param array $recipient * @return array */ protected function replaceVariables(array $recipient) { $recipient['address'] = $this->form->replaceVariables($recipient['address']); $recipient['name'] = $this->form->replaceVariables($recipient['name']); return $recipient; } /** * Returns the config value for the given $key * * @param string $key * @param null $default * @return mixed The config value or $default if not set */ public function config($key, $default = null) { $value = Quform::get($this->config, $key, $default); if ($value === null) { $value = Quform::get(call_user_func(array(get_class($this), 'getDefaultConfig')), $key, $default); } return $value; } /** * Set the config value for the given $key or multiple values using an array * * @param string|array $key Key or array of key/values * @param mixed $value Value or null if $key is array * @return $this */ public function setConfig($key, $value = null) { if (is_array($key)) { foreach($key as $k => $v) { $this->config[$k] = $v; } } else { $this->config[$key] = $value; } return $this; } /** * Get the parameters to pass to the mail function * * @return array|false The mailer config array or false if this notification should not be sent */ public function getMailerConfig() { $config = array( 'to' => array(), 'headers' => array(), 'subject' => $this->form->replaceVariables($this->config('subject')), 'message' => '', 'attachments' => array() ); $recipients = array(); $emailValidator = new Quform_Validator_Email(); if ($this->config('conditional')) { foreach($this->config('conditionals') as $conditional) { if (count($conditional['logicRules']) && $this->form->checkLogicAction($conditional['logicAction'], $conditional['logicMatch'], $conditional['logicRules'])) { foreach ($conditional['recipients'] as $recipient) { $recipient = $this->replaceVariables($recipient); if ($emailValidator->isValid($recipient['address'])) { $recipients[] = $recipient; } } } } if ( ! count($recipients)) { if ($this->config('conditionalFallback') == 'do_not_send') { return false; } else { foreach ($this->config('recipients') as $recipient) { $recipient = $this->replaceVariables($recipient); if ($emailValidator->isValid($recipient['address'])) { $recipients[] = $recipient; } } } } } else { foreach ($this->config('recipients') as $recipient) { $recipient = $this->replaceVariables($recipient); if ($emailValidator->isValid($recipient['address'])) { $recipients[] = $recipient; } } } foreach ($recipients as $recipient) { $formatted = $this->formatRecipient($recipient); switch ($recipient['type']) { case 'to': $config['to'][] = $formatted; break; case 'cc': $config['headers'][] = 'Cc: ' . $formatted; break; case 'bcc': $config['headers'][] = 'Bcc: ' . $formatted; break; case 'reply': $config['headers'][] = 'Reply-to: ' . $formatted; break; } } if (Quform::isNonEmptyString($this->config('from.address'))) { $from = $this->replaceVariables($this->config('from')); if ($emailValidator->isValid($from['address'])) { $config['headers'][] = 'From: ' . $this->formatRecipient($from); } } if ($this->config('format') == 'html' || $this->config('format') == 'multipart') { $config['headers'][] = sprintf('Content-type: text/html; charset=%s', apply_filters('wp_mail_charset', get_bloginfo('charset'))); $config['message'] = $this->config('html'); if ($this->config('autoFormat')) { $config['message'] = nl2br($config['message']); } $config['message'] = $this->form->replaceVariables($config['message'], 'html'); if ($this->isRtl()) { $config['message'] = sprintf('<div dir="rtl">%s</div>', $config['message']); } $config['message'] = $this->wrapHtmlMessage($config['message']); } else { $config['message'] = $this->form->replaceVariables($this->config('text')); } foreach ($this->config('attachments') as $attachment) { if ($attachment['source'] == 'element') { $element = $this->form->getElementById($attachment['element']); if ($element instanceof Quform_Attachable && $element->hasAttachments()) { foreach ($element->getAttachments() as $file) { if (is_file($file)) { $config['attachments'][] = $file; } } } } elseif ($attachment['source'] == 'media') { if (is_array($attachment['media'])) { foreach ($attachment['media'] as $medium) { $post = get_post($medium['id']); if ($post instanceof WP_Post && $post->post_type == 'attachment') { $file = get_attached_file($post->ID); if (is_file($file)) { $config['attachments'][] = $file; } } } } } } $config = apply_filters('quform_notification_mailer_config', $config, $this, $this->form); $config = apply_filters('quform_notification_mailer_config_' . $this->getIdentifier(), $config, $this, $this->form); return $config; } /** * Is this notification RTL? * * @return bool */ public function isRtl() { if ($this->config('rtl') == 'inherit') { return $this->form->isRtl(); } return $this->config('rtl') == 'yes'; } /** * Run hooks before the email is sent * * @param \PHPMailer\PHPMailer\PHPMailer|PHPMailer $mailer */ public function processHooks($mailer) { do_action('quform_pre_send_notification', $mailer, $this, $this->form); do_action('quform_pre_send_notification_' . $this->getIdentifier(), $mailer, $this, $this->form); } /** * Format the given recipient for an email header * * @param array $recipient * @return string */ protected function formatRecipient(array $recipient) { if (Quform::isNonEmptyString($recipient['name'])) { $formatted = sprintf('%s <%s>', $recipient['name'], $recipient['address']); } else { $formatted = $recipient['address']; } return $formatted; } /** * Wraps the given message in outer HTML tags * * @param string $message * @return string */ protected function wrapHtmlMessage($message) { $start = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=%s" /> <title></title> </head> <body style="margin:0;padding:%s;">'; $start = sprintf( $start, esc_attr(apply_filters('wp_mail_charset', get_bloginfo('charset'))), esc_attr(Quform::addCssUnit($this->config('padding'))) ); $start = apply_filters('quform_notification_html_start', $start, $this); $start = apply_filters('quform_notification_html_start_' . $this->getIdentifier(), $start, $this); $end = '</body></html>'; $end = apply_filters('quform_notification_html_end', $end, $this); $end = apply_filters('quform_notification_html_end_' . $this->getIdentifier(), $end, $this); return $start . $message . $end; } /** * Get the notification unique ID * * @return string */ public function getIdentifier() { return sprintf('%d_%d', $this->form->getId(), $this->config('id')); } /** * Add the AltBody to multipart email notifications * * Currently, this needs to be done with a hook as wp_mail() does not support multipart messages * * @param \PHPMailer\PHPMailer\PHPMailer|PHPMailer $mailer The PHPMailer instance * @param Quform_Notification $notification The notification instance * @param Quform_Form $form The form instance */ public static function addAltBody($mailer, Quform_Notification $notification, Quform_Form $form) { if ($notification->config('format') == 'multipart') { $mailer->AltBody = $form->replaceVariables($notification->config('text')); } else { $mailer->AltBody = ''; } } /** * Get the default notification configuration * * @param string|null $key Get the config by key, if omitted the full config is returned * @return array */ public static function getDefaultConfig($key = null) { $config = apply_filters('quform_default_notification', array( 'name' => '', 'enabled' => true, /* translators: %s: the form name */ 'subject' => sprintf(__('New submission from %s', 'quform'), '{form_name}'), 'format' => 'html', 'html' => '{all_form_data}', 'autoFormat' => true, 'padding' => '20', 'rtl' => 'inherit', 'text' => '{all_form_data}', 'recipients' => array(array('type' => 'to', 'address' => '{default_email_address}', 'name' => '{default_email_name}')), 'conditional' => false, 'conditionals' => array(), 'conditionalFallback' => '', 'from' => array('address' => '{default_from_email_address}', 'name' => '{default_from_email_name}'), 'logicEnabled' => false, 'logicAction' => true, 'logicMatch' => 'all', 'logicRules' => array(), 'attachments' => array() )); if (Quform::isNonEmptyString($key)) { return Quform::get($config, $key); } return $config; } }