notificationSettings(); $token = Arr::get($settings, 'telegram.token'); } return self::sendTeleRequest('send-test', [], 'POST', $token); } public static function sendTestPushoverMessage($apiToken, $userKey) { $message = __('This is a test message for ', 'fluent-smtp') . site_url() . '. ' . __('If you get this message, then your site is connected successfully.', 'fluent-smtp'); return self::sendPushoverMessage($message, $apiToken, $userKey, true, 1); } public static function disconnectTelegram($token) { self::sendTeleRequest('disconnect', [], 'POST', $token); self::updateChannelSettings('telegram', [ 'status' => 'no', 'token' => '' ]); return true; } public static function getTelegramBotTokenId() { static $token = null; if ($token !== null) { return $token; } $settings = (new Settings())->notificationSettings(); $token = Arr::get($settings, 'telegram.token', false); if (!$token) { $token = false; } return $token; } public static function getSlackWebhookUrl() { static $url = null; if ($url !== null) { return $url; } $settings = (new Settings())->notificationSettings(); $url = Arr::get($settings, 'slack.webhook_url'); if (!$url) { $url = false; } return $url; } public static function sendFailedNotificationTele($data) { wp_remote_post(self::getRemoteServerUrl() . 'telegram/send-failed-notification', array( 'timeout' => 0.01, 'blocking' => false, 'body' => $data, 'cookies' => false, 'sslverify' => false, )); return true; } private static function sendTeleRequest($route, $data = [], $method = 'POST', $token = '') { $url = self::getRemoteServerUrl() . 'telegram/' . $route; if ($token) { $url .= '?site_token=' . $token; } if ($method == 'POST') { $response = wp_remote_post($url, [ 'body' => $data, 'sslverify' => false, 'timeout' => 50 ]); } else { $response = wp_remote_get($url, [ 'sslverify' => false, 'timeout' => 50 ]); } if (is_wp_error($response)) { return $response; } $responseCode = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $responseData = json_decode($body, true); if (!$responseData || empty($responseData['success']) || $responseCode !== 200) { return new \WP_Error('invalid_data', 'Something went wrong', $responseData); } return $responseData; } private static function sendSlackRequest($route, $data = [], $method = 'POST', $token = '') { $url = self::getRemoteServerUrl() . 'slack/' . $route; if ($token) { $url .= '?site_token=' . $token; } if ($method == 'POST') { $response = wp_remote_post($url, [ 'body' => $data, 'sslverify' => false, 'timeout' => 50 ]); } else { $response = wp_remote_get($url, [ 'sslverify' => false, 'timeout' => 50 ]); } if (is_wp_error($response)) { return $response; } $responseCode = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $responseData = json_decode($body, true); if (!$responseData || empty($responseData['success']) || $responseCode !== 200) { return new \WP_Error('invalid_data', 'Something went wrong', $responseData); } return $responseData; } public static function sendSlackMessage($message, $webhookUrl, $blocking = false) { if (is_array($message)) { $body = wp_json_encode($message); } else { $body = wp_json_encode(array('text' => $message)); } $args = array( 'body' => $body, 'headers' => array( 'Content-Type' => 'application/json', ), 'cookies' => null, 'timeout' => 60, 'redirection' => 5, 'blocking' => true, 'httpversion' => '1.0', 'sslverify' => false, 'data_format' => 'body', ); if (!$blocking) { $args['blocking'] = false; $args['timeout'] = 0.01; } $response = wp_remote_post($webhookUrl, $args); if (!$blocking) { return true; } if (is_wp_error($response)) { return $response; } $body = wp_remote_retrieve_body($response); return json_decode($body, true); } public static function sendDiscordMessage($message, $webhookUrl, $blocking = false) { $body = wp_json_encode(array( 'content' => $message, 'username' => 'FluentSMTP' )); $args = array( 'body' => $body, 'headers' => array( 'Content-Type' => 'application/json', ), 'timeout' => 60, 'redirection' => 5, 'blocking' => true, 'httpversion' => '1.0', 'sslverify' => false, 'data_format' => 'body', ); if (!$blocking) { $args['blocking'] = false; $args['timeout'] = 0.01; } $response = wp_remote_post($webhookUrl, $args); if (!$blocking) { return true; } if (is_wp_error($response)) { return $response; } $body = wp_remote_retrieve_body($response); return json_decode($body, true); } public static function sendPushoverMessage($message, $apiToken, $userKey, $blocking = false, $priority = 1) { $title = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name')); $args = array( 'body' => array( 'token' => $apiToken, 'user' => $userKey, 'message' => $message, 'title' => $title, 'priority' => $priority, 'html' => 1, // Enable HTML formatting ), 'timeout' => 60, 'redirection' => 5, 'blocking' => true, 'httpversion' => '1.0', 'sslverify' => true, ); if (!$blocking) { $args['blocking'] = false; $args['timeout'] = 0.01; } $response = wp_remote_post('https://api.pushover.net/1/messages.json', $args); if (!$blocking) { return true; } if (is_wp_error($response)) { return $response; } $responseCode = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $responseData = json_decode($body, true); if ($responseCode !== 200 || empty($responseData['status']) || $responseData['status'] != 1) { $errorMessage = __('Pushover API error', 'fluent-smtp'); if (!empty($responseData['errors'])) { $errorMessage = is_array($responseData['errors']) ? implode(', ', $responseData['errors']) : $responseData['errors']; } return new \WP_Error('pushover_api_error', $errorMessage, $responseData); } return $responseData; } public static function formatSlackMessageBlock($handler, $logData = []) { $sendingTo = self::unserialize(Arr::get($logData, 'to')); if (is_array($sendingTo)) { $sendingTo = Arr::get($sendingTo, '0.email', ''); } if (is_array($sendingTo) || !$sendingTo) { $sendingTo = Arr::get($logData, 'to'); } $heading = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name')); return [ 'text' => $heading, 'blocks' => [ [ 'type' => 'header', 'text' => [ 'type' => 'plain_text', 'text' => $heading, "emoji" => true ] ], [ 'type' => 'section', 'fields' => [ [ 'type' => "mrkdwn", 'text' => "*Website URL:*\n " . site_url() ], [ 'type' => "mrkdwn", 'text' => "*Sending Driver:*\n " . strtoupper($handler->getSetting('provider')) ], [ 'type' => "mrkdwn", 'text' => "*To Email Address:*\n " . $sendingTo ], [ 'type' => "mrkdwn", 'text' => "*Email Subject:*\n " . Arr::get($logData, 'subject') ] ] ], [ 'type' => 'section', 'text' => [ 'type' => "mrkdwn", 'text' => "*Error Message:*\n ```" . self::getErrorMessageFromResponse(self::unserialize(Arr::get($logData, 'response'))) . "```" ] ], [ 'type' => 'section', 'text' => [ 'type' => "mrkdwn", 'text' => "<" . admin_url('options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search=') . "|View Failed Email(s)>" ] ] ] ]; } public static function formatDiscordMessageBlock($handler, $logData = []) { $sendingTo = self::unserialize(Arr::get($logData, 'to')); if (is_array($sendingTo)) { $sendingTo = Arr::get($sendingTo, '0.email', ''); } if (is_array($sendingTo) || !$sendingTo) { $sendingTo = Arr::get($logData, 'to'); } $heading = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name')); $content = '## ' . $heading . "\n"; $content .= __('**Website URL:** ', 'fluent-smtp') . site_url() . "\n"; $content .= __('**Sending Driver:** ', 'fluent-smtp') . strtoupper($handler->getSetting('provider')) . "\n"; $content .= __('**To Email Address:** ', 'fluent-smtp') . $sendingTo . "\n"; $content .= __('**Email Subject:** ', 'fluent-smtp') . Arr::get($logData, 'subject') . "\n"; $content .= __('**Error Message:** ```', 'fluent-smtp') . self::getErrorMessageFromResponse(self::unserialize(Arr::get($logData, 'response'))) . "```\n"; $content .= __('[View Failed Email(s)](', 'fluent-smtp') . admin_url('options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search=') . ')'; return $content; } public static function formatPushoverMessage($handler, $logData = []) { $sendingTo = self::unserialize(Arr::get($logData, 'to')); if (is_array($sendingTo)) { $sendingTo = Arr::get($sendingTo, '0.email', ''); } if (is_array($sendingTo) || !$sendingTo) { $sendingTo = Arr::get($logData, 'to'); } $provider = strtoupper($handler->getSetting('provider')); $subject = Arr::get($logData, 'subject'); $message = '' . __('Website URL:', 'fluent-smtp') . ' ' . esc_html(site_url()) . "
"; $message .= '' . __('Sending Driver:', 'fluent-smtp') . ' ' . esc_html($provider) . "
"; $message .= '' . __('To Email Address:', 'fluent-smtp') . ' ' . esc_html($sendingTo) . "
"; $message .= '' . __('Email Subject:', 'fluent-smtp') . ' ' . esc_html($subject) . "
"; $message .= '' . __('Error Message:', 'fluent-smtp') . '
'; $message .= '' . esc_html(self::getErrorMessageFromResponse( self::unserialize(Arr::get($logData, 'response')) )) . '
'; $logsUrl = admin_url( 'options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search=' ); $message .= '' . __('View Failed Email(s)', 'fluent-smtp') . ''; return $message; } public static function getErrorMessageFromResponse($response) { if (!$response || !is_array($response)) { return ''; } if (!empty($response['fallback_response']['message'])) { $message = $response['fallback_response']['message']; } else { $message = Arr::get($response, 'message'); } if (!$message) { return ''; } if (!is_string($message)) { $message = json_encode($message); } return $message; } protected static function unserialize($data) { if (is_serialized($data)) { if (preg_match('/(^|;)O:[0-9]+:/', $data)) { return ''; } return unserialize(trim($data), ['allowed_classes' => false]); } return $data; } public static function updateChannelSettings($channelName, $channelSettings) { $settings = (new Settings())->notificationSettings(); $settings[$channelName] = $channelSettings; $isActive = Arr::get($channelSettings, 'status') === 'yes' ? true : false; $activeChannels = $settings['active_channel']; if ($isActive) { if (!in_array($channelName, $activeChannels)) { $activeChannels[] = $channelName; } } else { if (($key = array_search($channelName, $activeChannels)) !== false) { unset($activeChannels[$key]); } } $activeChannels = array_values($activeChannels); $settings['active_channel'] = $activeChannels; update_option('_fluent_smtp_notify_settings', $settings, false); return true; } }