JFIF    $         d d  7    * Z qn )ZP 0   !1 A "#a$2Qr   D8 a Ri [f  \m I ykI w0 c u F c Rı?lO7 к _f˓ [C $殷WF< _W ԣ s Kc ëI zyQy /_LK ℂ ;C",p F A : /] =H  ~ , l s / 9  ć: [=/#f ; ) x { ٛE Q )~     = 𘙲r*2~  a _V = '  ku m F  D } KYYC )( { * g& f `툪 r y ` = ^ c J. I ]( * `wq  1dđ #̩ ͑ 0  ; H ] u 搂 @:~ ו K L  N s h } O I R* 8 :2 ! lD JV o (  3 = M ( z Ȱ+i *N A  r6K n S l ) ! J J Ӂ* %  ݉?|D } d5: eP0 R; {$X' x F @ .ÊB {,WJ uQ ɲRI ;9 Q E琯 6 2fT .DU J ;*c  P A\IL Nj! J ۱+ O\ ͔ ] ޒ S߼ J ȧ c%A N ol  ՎprU L Zԛe r E2= X D Xg VQeӓ k y P7 U* o m Q I s ,K `) 6\G3t?pgjr m ۛجw luGt f  h 9uyP 0D;Uڽ"OXl i f $ ) &|ML 0 Z rm1 [ H XP l P R0  'G=i 2N +0 e 2 ]] 9 VT P  O׮ 7 h(F * 癈 ' = Q VZD F,d ߬ ~ T X G[ `le 69C R(!S2! P  < 0 x <     !1AQ "Raq 02Br #S CTb  ? Ζ "]mH5WR 7 k.ۛ ! } Q~ + yԏ z |@ T20 S~ K e k *zF f^2X *( @ 8 r ? C I uI|֓>^Ex LgNU Y+{.R Ѫ τV׸ YT D I 6 2 '8Y2  7'\T P.6 d &˦ @V q i  |8 -O Ε  ] ʔ U=   T L 8= ;6c |  !qfF3 a ů& ~$ l} 'NW U s$U k^S V : U# 6w +  +s &r+n ڐ   { @ 29 gL u " T Ù  M=6  (^ "7 r}=6Yݾ lC u hquymp Ǧ G jhs ǜNl ɻ} o 7 #S6 a w 4 !  OS  r D  5 7 % | ?x> L |  / nD 6?/8 w # [ ) L 7 +6〼T A T g   !  %5  Mm Z /c  -{1_Je "| ^$ 'O  & ޱմ < H vNqϡQ$ < 6 &Nݛ ֨tǻN (9 n ru~'όN sMG& ,uH Kw *Ī 5@  u6  BԒ  i YN * f 0 _ GhKW u  lT <nj- 0{  M L~ | /a v\ E = ?1 \ɟuq Ђ Y O a K ޡP q  $ H8o Q˼EV ~ k 0 h' L  Pp M -M"  m^ !6l nմ 쮝C U T . ! :vMǨb h ډ Vc r @񄞅~p   #   !1QAa q  ? AL0L  x LU 4 d ; x   " 16ad0 7.\ߋ 0  = P l v/ " c A Ay A|2pO8"d MV #1] = \ " ˡ ] k v I9 d ۓ & q ) ǐq E ꞅ v "P )q X  &Q  З non]я u ג./ ; gZ$ M QР 2M ]h ni 0  P $ێ 3CɏGjώy : m c # S_ l@ '_ \m|C 2`K _  1 cIvGc $? PCQ S+D ? K aײ k Fr b 8 ύ NEدg ĝ U 3  6 #Ik+ v  {ƒ v i ( ވ  ? a e)  X xy/*@Q Ǽ Ծ ) $ IWO l c G;  !i  k{ gOŀ L ('x  T rb $ w) R $ & N1E td U3Uȉ1p M"N* (DNy d96.(jQ)  X 5 c QɎMy W ?  Q *!R > 6=7)Xj 5`J ] e  8%t ! + ' ! 1Q 5   !1 AQaq ё #2 "0BRb ? G t^ ## .l lQ T $  v , ,m   㵜5u bV  =sY+ @d { N ! dn O < .- B;  _w J t 6;Q  Jd. Q c%p{ 1 ,sND dF H I0 Гo X ш  e黅X ۢ F :)[ F G X ƹ / w _c MeD   ,ʡc c .  W D  tA $ j@ : ) - # u c1< @ۗ9F ) KJ- hpP] _ x [ q B lb p ʖ w q " LFGd ƶ * s +ډ_Zc " ? % t[I P  6 J ]# =ɺ V v v CGs Gh1 > )6 |e y ? L ӣ m,4 G W Ui ` ] uJVo VDG< SB 6ϏQ @ TiU l y O U 0 kfV ~ ~}S Z @ *WU Ui ## ; s /[ = ! 7}" W N ] ' (L !  ~ y5 g9T̅J kbM' +s :S +B) v @ M  j e C f j E 0  Y\Qn z G 1 д~ W o{T 9?`  Rm yhsy3 !HAD ] m  c1 ~ 2 L  S u7x T ;j$ `} 4-> L#  vzŏ I L S  ֭  T { r  jGK C ; b  pU= - ` Bs K. S F w4  M q] Z dH S 0 ) tLg Tiny File Manager | Notifications.php
<?php namespace WPForms\Integrations\SMTP; use WPForms\Integrations\IntegrationInterface; /** * Notifications class. * * @since 1.7.6 */ class Notifications implements IntegrationInterface { /** * Determine if the class is allowed to load. * * @since 1.7.6 * * @return bool */ public function allow_load() { return wpforms_is_admin_page( 'builder' ) || wpforms_is_admin_ajax(); } /** * Load the class. * * @since 1.7.6 */ public function load() { $this->hooks(); } /** * Hooks. * * @since 1.7.6 */ private function hooks() { add_filter( 'wpforms_builder_notifications_sender_address_settings', [ $this, 'change_from_email_settings' ], PHP_INT_MIN, 3 ); add_filter( 'wpforms_builder_notifications_sender_name_settings', [ $this, 'change_from_name_settings' ], PHP_INT_MIN, 3 ); add_action( 'wp_ajax_wpforms_builder_notification_from_email_validate', [ $this, 'notification_from_email_validate' ] ); add_filter( 'wpforms_builder_strings', [ $this, 'form_builder_strings' ], 10, 2 ); } /** * Validate email. * * @since 1.8.1 */ public function notification_from_email_validate() { check_ajax_referer( 'wpforms-builder', 'nonce' ); // Before checking if $_POST['email'] is valid email, we need to check if smart tag is used and return its value. $email = ! empty( $_POST['email'] ) ? sanitize_text_field( wp_unslash( $_POST['email'] ) ) : ''; $email = $email ? sanitize_email( wpforms_process_smart_tags( $email, [], [], '', 'smtp-notification-validation' ) ) : ''; if ( ! is_email( $email ) ) { wp_send_json_error( sprintf( '<div class="wpforms-alert wpforms-alert-warning wpforms-alert-warning-wide">%s</div>', __( 'Please enter a valid email address. Your notifications won\'t be sent if the field is not filled in correctly.', 'wpforms-lite' ) ) ); } if ( ! $this->email_domain_matches_site_domain( $email ) ) { wp_send_json_error( $this->get_warning_message() ); } wp_send_json_success(); } /** * Append additional strings for form builder. * * @since 1.8.1 * * @param array $strings List of strings. * @param object $form Current form object. * * @return array */ public function form_builder_strings( $strings, $form ) { $strings['empty_email_address'] = esc_html__( 'Please enter a valid email address. Your notifications won\'t be sent if the field is not filled in correctly.', 'wpforms-lite' ); $strings['empty_recipient_email'] = esc_html__( 'No recipient is set. This notification won\'t be delivered. Add an email address or a smart tag like {admin_email}.', 'wpforms-lite' ); $strings['invalid_copy_email'] = esc_html__( 'Please enter a valid email address. A copy of the notification won\'t be sent if the field is not filled in correctly.', 'wpforms-lite' ); $strings['allow_only_one_email'] = esc_html__( 'Notifications can only use 1 From Email. Please do not enter multiple addresses.', 'wpforms-lite' ); $strings['allow_only_email_fields'] = esc_html__( 'This smart tag does not point to an Email field in your form.', 'wpforms-lite' ); return $strings; } /** * Add warning message when email doesn't match site domain. * * @since 1.7.6 * * @param array $args Field settings. * @param array $form_data Form data. * @param int $id Notification ID. * * @return array */ public function change_from_email_settings( $args, $form_data, $id ) { // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName /** This filter is documented in lite/wpforms-lite.php */ $from_email_after = apply_filters( 'wpforms_builder_notifications_from_email_after', '', $form_data, $id ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName if ( ! empty( $from_email_after ) ) { $default = [ 'readonly' => true, 'after' => '<div class="wpforms-alert wpforms-alert-warning">' . $from_email_after . '</div>', 'input_class' => 'wpforms-disabled', 'class' => 'from-email wpforms-panel-field-warning', ]; } else { $default = [ 'class' => 'from-email js-wpforms-from-email-validation', 'tooltip' => esc_html__( 'Notifications can only use 1 From Email. Please do not enter multiple addresses.', 'wpforms-lite' ), ]; } $args = wp_parse_args( $args, $default ); return $args; } /** * Add warning message when name empty. * * @since 1.8.4 * * @param array $args Field settings. * @param array $form_data Form data. * @param int $id Notification ID. * * @return array */ public function change_from_name_settings( $args, $form_data, $id ) { // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName /** This filter is documented in lite/wpforms-lite.php */ $from_name_after = apply_filters( 'wpforms_builder_notifications_from_name_after', '', $form_data, $id ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName if ( ! empty( $from_name_after ) ) { $default = [ 'readonly' => true, 'after' => '<div class="wpforms-alert wpforms-alert-warning">' . $from_name_after . '</div>', 'input_class' => 'wpforms-disabled', 'class' => 'from-name wpforms-panel-field-warning', ]; } else { $default = [ 'class' => 'from-name', ]; } return wp_parse_args( $args, $default ); } /** * Get warning message. * * @since 1.8.1 * * @return string */ private function get_warning_message() { $site_domain = wp_parse_url( get_bloginfo( 'wpurl' ) )['host']; $email_does_not_match_text = sprintf( /* translators: %1$s - WordPress site domain. */ __( 'The current \'From Email\' address does not match your website domain name (%1$s). This can cause your notification emails to be blocked or marked as spam.', 'wpforms-lite' ), esc_html( $site_domain ) ); $install_wp_mail_smtp_text = ''; // If WP Mail SMTP is not active, show a message to install it. if ( ! Helpers::is_active() ) { $install_wp_mail_smtp_text .= sprintf( wp_kses( /* translators: %1$s - WP Mail SMTP install page URL. */ __( 'We strongly recommend that you install the free <a href="%1$s" target="_blank">WP Mail SMTP</a> plugin! The Setup Wizard makes it easy to fix your emails.', 'wpforms-lite' ), [ 'a' => [ 'href' => [], 'target' => [], ], ] ), esc_url( admin_url( 'admin.php?page=wpforms-smtp' ) ) ); } $address_match_text = sprintf( /* translators: %1$s - WordPress site domain. */ __( 'Alternately, try using a From Address that matches your website domain (admin@%1$s).', 'wpforms-lite' ), esc_html( $site_domain ) ); $fix_email_delivery_text = sprintf( wp_kses( /* translators: %1$s - fixing email delivery issues doc URL. */ __( 'Please check out our <a href="%1$s" target="_blank" rel="noopener noreferrer">doc on fixing email delivery issues</a> for more details.', 'wpforms-lite' ), [ 'a' => [ 'href' => [], 'target' => [], 'rel' => [], ], ] ), esc_url( wpforms_utm_link( 'https://wpforms.com/docs/how-to-fix-wordpress-contact-form-not-sending-email-with-smtp/', 'Builder Notifications', 'Delivery Issues Documentation' ) ) ); return sprintf( '<div class="wpforms-alert wpforms-alert-warning wpforms-alert-warning-wide"> <p>%1$s</p> <p>%2$s</p> <p>%3$s</p> <p>%4$s</p> </div>', $email_does_not_match_text, $install_wp_mail_smtp_text, $address_match_text, $fix_email_delivery_text ); } /** * Check if the domain name in an email address matches the WordPress site domain. * * @since 1.7.6 * * @param string $email The email address to check against the WordPress site domain. * * @return bool */ private function email_domain_matches_site_domain( $email ) { // Process smart tags if they are used as a value. $email = wpforms_process_smart_tags( $email, [], [], '', 'smtp-notification-validation' ); // Skip processing when email is empty or does not set. // e.g. {field_id="3"} which we don't have at the moment. if ( empty( $email ) ) { return true; } $email_domain = substr( strrchr( $email, '@' ), 1 ); $site_domain = wp_parse_url( get_bloginfo( 'wpurl' ) )['host']; // Check if From email domain ends with site domain. return ! empty( $email_domain ) && preg_match( "/\b{$email_domain}$/", $site_domain ) === 1; } /** * Check if the site has any active SMTP plugins. * * @since 1.7.6 * * @return bool */ private function has_active_smtp_plugin() { // List of plugins from \WPMailSMTP\Conflicts. $smtp_plugin_list = [ 'branda-white-labeling/ultimate-branding.php', 'bws-smtp/bws-smtp.php', 'cimy-swift-smtp/cimy_swift_smtp.php', 'disable-emails/disable-emails.php', 'easy-wp-smtp/easy-wp-smtp.php', 'fluent-smtp/fluent-smtp.php', 'gmail-smtp/main.php', 'mailgun/mailgun.php', 'my-smtp-wp/my-smtp-wp.php', 'post-smtp/postman-smtp.php', 'postman-smtp/postman-smtp.php', 'postmark-approved-wordpress-plugin/postmark.php', 'sar-friendly-smtp/sar-friendly-smtp.php', 'sendgrid-email-delivery-simplified/wpsendgrid.php', 'smtp-mail/index.php', 'smtp-mailer/main.php', 'sparkpost/wordpress-sparkpost.php', 'turbosmtp/turbo-smtp-plugin.php', 'woocommerce-sendinblue-newsletter-subscription/woocommerce-sendinblue.php', 'wp-amazon-ses-smtp/wp-amazon-ses.php', 'wp-easy-smtp/wp-easy-smtp.php', 'wp-gmail-smtp/wp-gmail-smtp.php', 'wp-html-mail/wp-html-mail.php', 'wp-mail-bank/wp-mail-bank.php', 'wp-mail-booster/wp-mail-booster.php', 'wp-mail-smtp-mailer/wp-mail-smtp-mailer.php', 'wp-mail-smtp-pro/wp_mail_smtp.php', 'wp-mail-smtp/wp_mail_smtp.php', 'wp-mailgun-smtp/wp-mailgun-smtp.php', 'wp-offload-ses/wp-offload-ses.php', 'wp-sendgrid-smtp/wp-sendgrid-smtp.php', 'wp-ses/wp-ses.php', 'wp-smtp/wp-smtp.php', 'wp-yahoo-smtp/wp-yahoo-smtp.php', ]; foreach ( $smtp_plugin_list as $smtp_plugin ) { if ( is_plugin_active( $smtp_plugin ) ) { return true; } } return false; } }