1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
messageeventmanager.php
См. документацию.
1<?php
2namespace Bitrix\Mail\Helper;
3
4use Bitrix\Mail\Helper\Message\MessageInternalDateHandler;
5use Bitrix\Mail\MailboxDirectory;
6use Bitrix\Mail\MailMessageTable;
7use Bitrix\Mail\MailMessageUidTable;
8use Bitrix\Main\Event;
9use Bitrix\Main\Loader;
10use Bitrix\Main\Type\DateTime;
11
13{
14 const EVENT_DELETE_MESSAGES = 'onMailMessageDeleted';
15
22 public static function onMailMessageDeleted(Event $event)
23 {
24 $manager = new static();
25 $manager->processOnMailMessageDeletedEvent($event);
26 return $manager;
27 }
28
29 private function processOnMailMessageDeletedEvent(Event $event)
30 {
31 $params = $event->getParameters();
32 $filter = empty($params['DELETED_BY_FILTER']) ? [] : $params['DELETED_BY_FILTER'];
33 $fieldsData = empty($params['MAIL_FIELDS_DATA']) ? [] : $params['MAIL_FIELDS_DATA'];
34 $this->handleRemovedEvent($fieldsData, $filter);
35 }
36
43 public static function onMailMessageModified(Event $event)
44 {
45 $manager = new static();
46 $manager->processOnMailMessageModified($event);
47 return $manager;
48 }
49
50 private function processOnMailMessageModified(Event $event)
51 {
52 $params = $event->getParameters();
53 $updatedFieldValues = empty($params['UPDATED_FIELDS_VALUES']) ? [] : $params['UPDATED_FIELDS_VALUES'];
54 $fieldsData = empty($params['MAIL_FIELDS_DATA']) ? [] : $params['MAIL_FIELDS_DATA'];
55 $filter = empty($params['UPDATED_BY_FILTER']) ? [] : $params['UPDATED_BY_FILTER'];
56
57 if (!empty($updatedFieldValues) && isset($updatedFieldValues['IS_SEEN']))
58 {
59 $fieldsData = $this->getMailsFieldsData($fieldsData, ['HEADER_MD5', 'MAILBOX_USER_ID', 'IS_SEEN'], $filter);
60 $this->sendMessageModifiedEvent($fieldsData);
61 }
62
63 if (!empty($updatedFieldValues) && isset($updatedFieldValues['DIR_MD5']) && isset($filter['=MAILBOX_ID']))
64 {
65 $dirHash = empty($updatedFieldValues['DIR_MD5']) ? null : $updatedFieldValues['DIR_MD5'];
66 $dir = MailboxDirectory::fetchOneByHash($filter['=MAILBOX_ID'], $dirHash);
67
68 if (!empty($dirHash) && $dir != null)
69 {
70 if ($dir->isTrash() || $dir->isSpam() || $dir->isDisabled())
71 {
72 $this->handleRemovedEvent($fieldsData, $filter);
73 }
74 }
75
76 $oldDirMd5 = $params['MAIL_FIELDS_DATA'][0]['OLD_DIR_MD5'] ?? null;
77
78 if ($oldDirMd5)
79 {
80 $mailboxId = (int)$filter['=MAILBOX_ID'];
81
82 if ($this->checkForNeedClearCache($mailboxId, $oldDirMd5, $fieldsData))
83 {
84 MessageInternalDateHandler::clearStartInternalDate($mailboxId, $oldDirMd5);
85 }
86 }
87 }
88 }
89
90 private function checkForNeedClearCache(int $mailboxId, string $dirMd5, array $messages): bool
91 {
92 $startInternalDate = MessageInternalDateHandler::getStartInternalDateForDir($mailboxId, dirMd5: $dirMd5);
93
94 if (!is_null($startInternalDate))
95 {
99 foreach ($messages as $message)
100 {
101 if (
102 isset($message['IS_OLD']) &&
104 isset($message['INTERNALDATE']) &&
105 $message['INTERNALDATE'] <= $startInternalDate
106 )
107 {
108 return true;
109 }
110 }
111 }
112
113 return false;
114 }
115
116 protected function sendMessageModifiedEvent($fieldsData)
117 {
118 foreach ($fieldsData as $fields)
119 {
120 $event = new Event(
121 'mail', 'OnMessageModified',
122 [
123 'user' => $fields['MAILBOX_USER_ID'],
124 'hash' => $fields['HEADER_MD5'],
125 'seen' => $fields['IS_SEEN'] === 'Y',
126 ]
127 );
128 $event->send();
129 }
130 }
131
132 private function handleRemovedEvent($fieldsData, $filter)
133 {
134 $this->sendMessageDeletedEvent($fieldsData);
135 }
136
137 protected function sendMessageDeletedEvent($fieldsData)
138 {
139 foreach ($fieldsData as $fields)
140 {
141 $event = new Event(
142 'mail', 'OnMessageObsolete',
143 [
144 'user' => $fields['MAILBOX_USER_ID'],
145 'hash' => $fields['HEADER_MD5'],
146 ]
147 );
148 $event->send();
149 }
150 }
151
152 private function getMailsFieldsData($eventData, $requiredKeys, $filter)
153 {
154 $fieldsData = $eventData;
155 $missingKeys = $requiredKeys;
156 $messagesCount = count($eventData);
157 if ($messagesCount)
158 {
159 foreach ($requiredKeys as $requiredKey)
160 {
161 if (count(array_column($eventData, $requiredKey)) === $messagesCount)
162 {
163 $missingKeys = array_diff($missingKeys, [$requiredKey]);
164 }
165 }
166 }
167
168 if (!empty($missingKeys) && !empty($filter))
169 {
170 $fieldsData = $this->getMailMessagesList($filter, $missingKeys);
171 }
172 $results = [];
173 foreach ($fieldsData as $index => $mailFieldsData)
174 {
175 $results[$mailFieldsData['HEADER_MD5']] = $mailFieldsData;
176 }
177 return $results;
178 }
179
180 protected function getMailMessagesList($filter, $selectingFields)
181 {
182 $dateLastMonth = new DateTime();
183 $dateLastMonth->add('-1 MONTH');
184 foreach ($selectingFields as $index => $selectingField)
185 {
186 if (strncmp('MAILBOX_', $selectingField, 8) === 0)
187 {
188 $selectingFields[$selectingField] = 'MAILBOX.'.mb_substr($selectingField, 8);
189 unset($selectingFields[$index]);
190 }
191 }
192
193 return MailMessageUidTable::getList([
194 'select' => $selectingFields,
195 'filter' => array_merge($filter, [
196 '>=INTERNALDATE' => $dateLastMonth,
197 '==DELETE_TIME' => 0,
198 ]),
199 ]
200 )->fetchAll();
201 }
202
209 public static function onMailEventMailRead(array $data)
210 {
211 $messageId = $data['msgid'];
212 if($messageId)
213 {
214 $message = MailMessageTable::getList([
215 'select' => [
216 'OPTIONS', 'ID', 'READ_CONFIRMED',
217 ],
218 'filter' => [
219 '=MSG_ID' => $messageId,
220 'READ_CONFIRMED' => null,
221 ]
222 ])->fetch();
223 if($message)
224 {
225 $readTime = new DateTime();
226 $result = MailMessageTable::update($message['ID'], [
227 'READ_CONFIRMED' => $readTime,
228 ]);
229 if($result->isSuccess())
230 {
231 if(Loader::includeModule("pull"))
232 {
233 \CPullWatch::addToStack(static::getPullTagName($message['ID']), [
234 'module_id' => 'mail',
235 'command' => 'onMessageRead',
236 'params' => [
237 'messageId' => $message['ID'],
238 'readTime' => $readTime->getTimestamp(),
239 ],
240 ]);
241 }
242 }
243 }
244 }
245
246 return $data;
247 }
248
249 public static function getPullTagName($messageId)
250 {
251 return 'MAILMESSAGEREADED'.$messageId;
252 }
253
254 public static function getRequiredFieldNamesForEvent($eventName)
255 {
256 if ($eventName === static::EVENT_DELETE_MESSAGES)
257 {
258 return array('HEADER_MD5', 'MESSAGE_ID', 'MAILBOX_USER_ID');
259 }
260
261 return [];
262 }
263}
if(! $messageFields||!isset($messageFields['message_id'])||!isset($messageFields['status'])||!CModule::IncludeModule("messageservice")) $messageId
Определения callback_ismscenter.php:26
static getRequiredFieldNamesForEvent($eventName)
Определения messageeventmanager.php:254
getMailMessagesList($filter, $selectingFields)
Определения messageeventmanager.php:180
static onMailMessageDeleted(Event $event)
Определения messageeventmanager.php:22
static onMailMessageModified(Event $event)
Определения messageeventmanager.php:43
sendMessageModifiedEvent($fieldsData)
Определения messageeventmanager.php:116
static getPullTagName($messageId)
Определения messageeventmanager.php:249
static onMailEventMailRead(array $data)
Определения messageeventmanager.php:209
const EXCLUDED_COUNTER_STATUSES
Определения mailmessageuid.php:42
static fetchOneByHash($mailboxId, $hash)
Определения mailboxdirectory.php:129
Определения event.php:5
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$filter
Определения iblock_catalog_list.php:54
$manager
Определения office365push.php:39
$message
Определения payment.php:8
$event
Определения prolog_after.php:141
$dir
Определения quickway.php:303
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$messages
Определения template.php:8
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$fields
Определения yandex_run.php:501