Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/fluent-smtp/app/Services/NotificationHelper.php

Keine Baseline-Datei – Diff nur gegen leer.
Zur Liste
1 -
1 + <?php
2 +
3 + namespace FluentMail\App\Services;
4 +
5 + use InvalidArgumentException;
6 + use FluentMail\App\Models\Settings;
7 + use FluentMail\App\Services\Notification\Manager as NotificationManager;
8 + use FluentMail\Includes\Support\Arr;
9 +
10 + class NotificationHelper
11 + {
12 + public static function getRemoteServerUrl()
13 + {
14 + if (defined('FLUENTSMTP_SERVER_REMOTE_SERVER_URL')) {
15 + return FLUENTSMTP_SERVER_REMOTE_SERVER_URL;
16 + }
17 +
18 + return 'https://fluentsmtp.com/wp-json/fluentsmtp_notify/v1/';
19 + }
20 +
21 + public static function issueTelegramPinCode($data)
22 + {
23 + return self::sendTeleRequest('register-site', $data, 'POST');
24 + }
25 +
26 + public static function registerSlackSite($data)
27 + {
28 + return self::sendSlackRequest('register-site', $data, 'POST');
29 + }
30 +
31 + public static function getTelegramConnectionInfo($token)
32 + {
33 + return self::sendTeleRequest('get-site-info', [], 'GET', $token);
34 + }
35 +
36 + public static function sendTestTelegramMessage($token = '')
37 + {
38 + if (!$token) {
39 + $settings = (new Settings())->notificationSettings();
40 + $token = Arr::get($settings, 'telegram.token');
41 + }
42 +
43 + return self::sendTeleRequest('send-test', [], 'POST', $token);
44 + }
45 +
46 + public static function sendTestPushoverMessage($apiToken, $userKey)
47 + {
48 + $message = __('This is a test message for ', 'fluent-smtp') . site_url() . '. ' .
49 + __('If you get this message, then your site is connected successfully.', 'fluent-smtp');
50 +
51 + return self::sendPushoverMessage($message, $apiToken, $userKey, true, 1);
52 + }
53 +
54 + public static function disconnectTelegram($token)
55 + {
56 + self::sendTeleRequest('disconnect', [], 'POST', $token);
57 +
58 + self::updateChannelSettings('telegram', [
59 + 'status' => 'no',
60 + 'token' => ''
61 + ]);
62 +
63 + return true;
64 + }
65 +
66 + public static function getTelegramBotTokenId()
67 + {
68 + static $token = null;
69 +
70 + if ($token !== null) {
71 + return $token;
72 + }
73 +
74 + $settings = (new Settings())->notificationSettings();
75 +
76 + $token = Arr::get($settings, 'telegram.token', false);
77 +
78 + if (!$token) {
79 + $token = false;
80 + }
81 +
82 + return $token;
83 + }
84 +
85 + public static function getSlackWebhookUrl()
86 + {
87 + static $url = null;
88 +
89 + if ($url !== null) {
90 + return $url;
91 + }
92 +
93 + $settings = (new Settings())->notificationSettings();
94 +
95 + $url = Arr::get($settings, 'slack.webhook_url');
96 +
97 + if (!$url) {
98 + $url = false;
99 + }
100 +
101 + return $url;
102 + }
103 +
104 + public static function sendFailedNotificationTele($data)
105 + {
106 + wp_remote_post(self::getRemoteServerUrl() . 'telegram/send-failed-notification', array(
107 + 'timeout' => 0.01,
108 + 'blocking' => false,
109 + 'body' => $data,
110 + 'cookies' => false,
111 + 'sslverify' => false,
112 + ));
113 +
114 + return true;
115 + }
116 +
117 + private static function sendTeleRequest($route, $data = [], $method = 'POST', $token = '')
118 + {
119 + $url = self::getRemoteServerUrl() . 'telegram/' . $route;
120 +
121 + if ($token) {
122 + $url .= '?site_token=' . $token;
123 + }
124 +
125 + if ($method == 'POST') {
126 + $response = wp_remote_post($url, [
127 + 'body' => $data,
128 + 'sslverify' => false,
129 + 'timeout' => 50
130 + ]);
131 + } else {
132 + $response = wp_remote_get($url, [
133 + 'sslverify' => false,
134 + 'timeout' => 50
135 + ]);
136 + }
137 +
138 + if (is_wp_error($response)) {
139 + return $response;
140 + }
141 +
142 + $responseCode = wp_remote_retrieve_response_code($response);
143 +
144 + $body = wp_remote_retrieve_body($response);
145 + $responseData = json_decode($body, true);
146 +
147 + if (!$responseData || empty($responseData['success']) || $responseCode !== 200) {
148 + return new \WP_Error('invalid_data', 'Something went wrong', $responseData);
149 + }
150 +
151 + return $responseData;
152 + }
153 +
154 + private static function sendSlackRequest($route, $data = [], $method = 'POST', $token = '')
155 + {
156 + $url = self::getRemoteServerUrl() . 'slack/' . $route;
157 +
158 + if ($token) {
159 + $url .= '?site_token=' . $token;
160 + }
161 +
162 + if ($method == 'POST') {
163 + $response = wp_remote_post($url, [
164 + 'body' => $data,
165 + 'sslverify' => false,
166 + 'timeout' => 50
167 + ]);
168 + } else {
169 + $response = wp_remote_get($url, [
170 + 'sslverify' => false,
171 + 'timeout' => 50
172 + ]);
173 + }
174 +
175 + if (is_wp_error($response)) {
176 + return $response;
177 + }
178 +
179 + $responseCode = wp_remote_retrieve_response_code($response);
180 +
181 + $body = wp_remote_retrieve_body($response);
182 +
183 + $responseData = json_decode($body, true);
184 +
185 + if (!$responseData || empty($responseData['success']) || $responseCode !== 200) {
186 + return new \WP_Error('invalid_data', 'Something went wrong', $responseData);
187 + }
188 +
189 + return $responseData;
190 + }
191 +
192 + public static function sendSlackMessage($message, $webhookUrl, $blocking = false)
193 + {
194 +
195 + if (is_array($message)) {
196 + $body = wp_json_encode($message);
197 + } else {
198 + $body = wp_json_encode(array('text' => $message));
199 + }
200 +
201 + $args = array(
202 + 'body' => $body,
203 + 'headers' => array(
204 + 'Content-Type' => 'application/json',
205 + ),
206 + 'cookies' => null,
207 + 'timeout' => 60,
208 + 'redirection' => 5,
209 + 'blocking' => true,
210 + 'httpversion' => '1.0',
211 + 'sslverify' => false,
212 + 'data_format' => 'body',
213 + );
214 +
215 + if (!$blocking) {
216 + $args['blocking'] = false;
217 + $args['timeout'] = 0.01;
218 + }
219 +
220 + $response = wp_remote_post($webhookUrl, $args);
221 +
222 + if (!$blocking) {
223 + return true;
224 + }
225 +
226 + if (is_wp_error($response)) {
227 + return $response;
228 + }
229 +
230 +
231 + $body = wp_remote_retrieve_body($response);
232 +
233 +
234 + return json_decode($body, true);
235 + }
236 +
237 + public static function sendDiscordMessage($message, $webhookUrl, $blocking = false)
238 + {
239 + $body = wp_json_encode(array(
240 + 'content' => $message,
241 + 'username' => 'FluentSMTP'
242 + ));
243 +
244 + $args = array(
245 + 'body' => $body,
246 + 'headers' => array(
247 + 'Content-Type' => 'application/json',
248 + ),
249 + 'timeout' => 60,
250 + 'redirection' => 5,
251 + 'blocking' => true,
252 + 'httpversion' => '1.0',
253 + 'sslverify' => false,
254 + 'data_format' => 'body',
255 + );
256 +
257 + if (!$blocking) {
258 + $args['blocking'] = false;
259 + $args['timeout'] = 0.01;
260 + }
261 +
262 + $response = wp_remote_post($webhookUrl, $args);
263 +
264 + if (!$blocking) {
265 + return true;
266 + }
267 +
268 + if (is_wp_error($response)) {
269 + return $response;
270 + }
271 +
272 + $body = wp_remote_retrieve_body($response);
273 + return json_decode($body, true);
274 + }
275 +
276 + public static function sendPushoverMessage($message, $apiToken, $userKey, $blocking = false, $priority = 1)
277 + {
278 + $title = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name'));
279 +
280 + $args = array(
281 + 'body' => array(
282 + 'token' => $apiToken,
283 + 'user' => $userKey,
284 + 'message' => $message,
285 + 'title' => $title,
286 + 'priority' => $priority,
287 + 'html' => 1, // Enable HTML formatting
288 + ),
289 + 'timeout' => 60,
290 + 'redirection' => 5,
291 + 'blocking' => true,
292 + 'httpversion' => '1.0',
293 + 'sslverify' => true,
294 + );
295 +
296 + if (!$blocking) {
297 + $args['blocking'] = false;
298 + $args['timeout'] = 0.01;
299 + }
300 +
301 + $response = wp_remote_post('https://api.pushover.net/1/messages.json', $args);
302 +
303 + if (!$blocking) {
304 + return true;
305 + }
306 +
307 + if (is_wp_error($response)) {
308 + return $response;
309 + }
310 +
311 + $responseCode = wp_remote_retrieve_response_code($response);
312 + $body = wp_remote_retrieve_body($response);
313 + $responseData = json_decode($body, true);
314 +
315 + if ($responseCode !== 200 || empty($responseData['status']) || $responseData['status'] != 1) {
316 + $errorMessage = __('Pushover API error', 'fluent-smtp');
317 + if (!empty($responseData['errors'])) {
318 + $errorMessage = is_array($responseData['errors']) ? implode(', ', $responseData['errors']) : $responseData['errors'];
319 + }
320 + return new \WP_Error('pushover_api_error', $errorMessage, $responseData);
321 + }
322 +
323 + return $responseData;
324 + }
325 +
326 + public static function formatSlackMessageBlock($handler, $logData = [])
327 + {
328 + $sendingTo = self::unserialize(Arr::get($logData, 'to'));
329 +
330 + if (is_array($sendingTo)) {
331 + $sendingTo = Arr::get($sendingTo, '0.email', '');
332 + }
333 +
334 + if (is_array($sendingTo) || !$sendingTo) {
335 + $sendingTo = Arr::get($logData, 'to');
336 + }
337 +
338 + $heading = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name'));
339 +
340 + return [
341 + 'text' => $heading,
342 + 'blocks' => [
343 + [
344 + 'type' => 'header',
345 + 'text' => [
346 + 'type' => 'plain_text',
347 + 'text' => $heading,
348 + "emoji" => true
349 + ]
350 + ],
351 + [
352 + 'type' => 'section',
353 + 'fields' => [
354 + [
355 + 'type' => "mrkdwn",
356 + 'text' => "*Website URL:*\n " . site_url()
357 + ],
358 + [
359 + 'type' => "mrkdwn",
360 + 'text' => "*Sending Driver:*\n " . strtoupper($handler->getSetting('provider'))
361 + ],
362 + [
363 + 'type' => "mrkdwn",
364 + 'text' => "*To Email Address:*\n " . $sendingTo
365 + ],
366 + [
367 + 'type' => "mrkdwn",
368 + 'text' => "*Email Subject:*\n " . Arr::get($logData, 'subject')
369 + ]
370 + ]
371 + ],
372 + [
373 + 'type' => 'section',
374 + 'text' => [
375 + 'type' => "mrkdwn",
376 + 'text' => "*Error Message:*\n ```" . self::getErrorMessageFromResponse(self::unserialize(Arr::get($logData, 'response'))) . "```"
377 + ]
378 + ],
379 + [
380 + 'type' => 'section',
381 + 'text' => [
382 + 'type' => "mrkdwn",
383 + 'text' => "<" . admin_url('options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search=') . "|View Failed Email(s)>"
384 + ]
385 + ]
386 + ]
387 + ];
388 + }
389 +
390 + public static function formatDiscordMessageBlock($handler, $logData = [])
391 + {
392 + $sendingTo = self::unserialize(Arr::get($logData, 'to'));
393 +
394 + if (is_array($sendingTo)) {
395 + $sendingTo = Arr::get($sendingTo, '0.email', '');
396 + }
397 +
398 + if (is_array($sendingTo) || !$sendingTo) {
399 + $sendingTo = Arr::get($logData, 'to');
400 + }
401 +
402 + $heading = sprintf(__('[%s] Failed to send email', 'fluent-smtp'), get_bloginfo('name'));
403 +
404 + $content = '## ' . $heading . "\n";
405 + $content .= __('**Website URL:** ', 'fluent-smtp') . site_url() . "\n";
406 + $content .= __('**Sending Driver:** ', 'fluent-smtp') . strtoupper($handler->getSetting('provider')) . "\n";
407 + $content .= __('**To Email Address:** ', 'fluent-smtp') . $sendingTo . "\n";
408 + $content .= __('**Email Subject:** ', 'fluent-smtp') . Arr::get($logData, 'subject') . "\n";
409 + $content .= __('**Error Message:** ```', 'fluent-smtp') . self::getErrorMessageFromResponse(self::unserialize(Arr::get($logData, 'response'))) . "```\n";
410 + $content .= __('[View Failed Email(s)](', 'fluent-smtp') . admin_url('options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search=') . ')';
411 +
412 + return $content;
413 + }
414 +
415 + public static function formatPushoverMessage($handler, $logData = [])
416 + {
417 + $sendingTo = self::unserialize(Arr::get($logData, 'to'));
418 +
419 + if (is_array($sendingTo)) {
420 + $sendingTo = Arr::get($sendingTo, '0.email', '');
421 + }
422 +
423 + if (is_array($sendingTo) || !$sendingTo) {
424 + $sendingTo = Arr::get($logData, 'to');
425 + }
426 +
427 + $provider = strtoupper($handler->getSetting('provider'));
428 + $subject = Arr::get($logData, 'subject');
429 +
430 + $message = '<b>' . __('Website URL:', 'fluent-smtp') . '</b> ' . esc_html(site_url()) . "<br>";
431 + $message .= '<b>' . __('Sending Driver:', 'fluent-smtp') . '</b> ' . esc_html($provider) . "<br>";
432 + $message .= '<b>' . __('To Email Address:', 'fluent-smtp') . '</b> ' . esc_html($sendingTo) . "<br>";
433 + $message .= '<b>' . __('Email Subject:', 'fluent-smtp') . '</b> ' . esc_html($subject) . "<br>";
434 + $message .= '<b>' . __('Error Message:', 'fluent-smtp') . '</b><br>';
435 + $message .= '<code>' . esc_html(self::getErrorMessageFromResponse(
436 + self::unserialize(Arr::get($logData, 'response'))
437 + )) . '</code><br>';
438 + $logsUrl = admin_url(
439 + 'options-general.php?page=fluent-mail#/logs?per_page=10&page=1&status=failed&search='
440 + );
441 + $message .= '<a href="' . esc_url($logsUrl) . '">' . __('View Failed Email(s)', 'fluent-smtp') . '</a>';
442 +
443 + return $message;
444 + }
445 +
446 + public static function getErrorMessageFromResponse($response)
447 + {
448 + if (!$response || !is_array($response)) {
449 + return '';
450 + }
451 +
452 + if (!empty($response['fallback_response']['message'])) {
453 + $message = $response['fallback_response']['message'];
454 + } else {
455 + $message = Arr::get($response, 'message');
456 + }
457 +
458 + if (!$message) {
459 + return '';
460 + }
461 +
462 + if (!is_string($message)) {
463 + $message = json_encode($message);
464 + }
465 +
466 + return $message;
467 + }
468 +
469 + protected static function unserialize($data)
470 + {
471 + if (is_serialized($data)) {
472 + if (preg_match('/(^|;)O:[0-9]+:/', $data)) {
473 + return '';
474 + }
475 + return unserialize(trim($data), ['allowed_classes' => false]);
476 + }
477 +
478 + return $data;
479 + }
480 +
481 + public static function updateChannelSettings($channelName, $channelSettings)
482 + {
483 + $settings = (new Settings())->notificationSettings();
484 +
485 + $settings[$channelName] = $channelSettings;
486 +
487 + $isActive = Arr::get($channelSettings, 'status') === 'yes' ? true : false;
488 +
489 + $activeChannels = $settings['active_channel'];
490 +
491 + if ($isActive) {
492 + if (!in_array($channelName, $activeChannels)) {
493 + $activeChannels[] = $channelName;
494 + }
495 + } else {
496 + if (($key = array_search($channelName, $activeChannels)) !== false) {
497 + unset($activeChannels[$key]);
498 + }
499 + }
500 +
501 + $activeChannels = array_values($activeChannels);
502 + $settings['active_channel'] = $activeChannels;
503 +
504 + update_option('_fluent_smtp_notify_settings', $settings, false);
505 +
506 + return true;
507 + }
508 + }
509 +