29 private function processOnMailMessageDeletedEvent(
Event $event)
33 $fieldsData = empty(
$params[
'MAIL_FIELDS_DATA']) ? [] :
$params[
'MAIL_FIELDS_DATA'];
34 $this->handleRemovedEvent($fieldsData,
$filter);
50 private function processOnMailMessageModified(
Event $event)
53 $updatedFieldValues = empty(
$params[
'UPDATED_FIELDS_VALUES']) ? [] :
$params[
'UPDATED_FIELDS_VALUES'];
54 $fieldsData = empty(
$params[
'MAIL_FIELDS_DATA']) ? [] :
$params[
'MAIL_FIELDS_DATA'];
57 if (!empty($updatedFieldValues) && isset($updatedFieldValues[
'IS_SEEN']))
59 $fieldsData = $this->getMailsFieldsData($fieldsData, [
'HEADER_MD5',
'MAILBOX_USER_ID',
'IS_SEEN'],
$filter);
63 if (!empty($updatedFieldValues) && isset($updatedFieldValues[
'DIR_MD5']) && isset(
$filter[
'=MAILBOX_ID']))
65 $dirHash = empty($updatedFieldValues[
'DIR_MD5']) ? null : $updatedFieldValues[
'DIR_MD5'];
68 if (!empty($dirHash) &&
$dir !=
null)
70 if (
$dir->isTrash() ||
$dir->isSpam() ||
$dir->isDisabled())
72 $this->handleRemovedEvent($fieldsData,
$filter);
76 $oldDirMd5 =
$params[
'MAIL_FIELDS_DATA'][0][
'OLD_DIR_MD5'] ??
null;
80 $mailboxId = (int)
$filter[
'=MAILBOX_ID'];
82 if ($this->checkForNeedClearCache($mailboxId, $oldDirMd5, $fieldsData))
84 MessageInternalDateHandler::clearStartInternalDate($mailboxId, $oldDirMd5);
90 private function checkForNeedClearCache(
int $mailboxId,
string $dirMd5,
array $messages): bool
92 $startInternalDate = MessageInternalDateHandler::getStartInternalDateForDir($mailboxId, dirMd5: $dirMd5);
94 if (!is_null($startInternalDate))
105 $message[
'INTERNALDATE'] <= $startInternalDate
118 foreach ($fieldsData as
$fields)
121 'mail',
'OnMessageModified',
123 'user' =>
$fields[
'MAILBOX_USER_ID'],
124 'hash' =>
$fields[
'HEADER_MD5'],
125 'seen' =>
$fields[
'IS_SEEN'] ===
'Y',
132 private function handleRemovedEvent($fieldsData,
$filter)
139 foreach ($fieldsData as
$fields)
142 'mail',
'OnMessageObsolete',
144 'user' =>
$fields[
'MAILBOX_USER_ID'],
145 'hash' =>
$fields[
'HEADER_MD5'],
152 private function getMailsFieldsData($eventData, $requiredKeys,
$filter)
154 $fieldsData = $eventData;
155 $missingKeys = $requiredKeys;
156 $messagesCount =
count($eventData);
159 foreach ($requiredKeys as $requiredKey)
161 if (
count(array_column($eventData, $requiredKey)) === $messagesCount)
163 $missingKeys = array_diff($missingKeys, [$requiredKey]);
168 if (!empty($missingKeys) && !empty(
$filter))
173 foreach ($fieldsData as $index => $mailFieldsData)
175 $results[$mailFieldsData[
'HEADER_MD5']] = $mailFieldsData;
183 $dateLastMonth->add(
'-1 MONTH');
184 foreach ($selectingFields as $index => $selectingField)
186 if (strncmp(
'MAILBOX_', $selectingField, 8) === 0)
188 $selectingFields[$selectingField] =
'MAILBOX.'.mb_substr($selectingField, 8);
189 unset($selectingFields[$index]);
193 return MailMessageUidTable::getList([
194 'select' => $selectingFields,
195 'filter' => array_merge(
$filter, [
196 '>=INTERNALDATE' => $dateLastMonth,
197 '==DELETE_TIME' => 0,
214 $message = MailMessageTable::getList([
216 'OPTIONS',
'ID',
'READ_CONFIRMED',
220 'READ_CONFIRMED' =>
null,
227 'READ_CONFIRMED' => $readTime,
231 if(Loader::includeModule(
"pull"))
233 \CPullWatch::addToStack(static::getPullTagName(
$message[
'ID']), [
234 'module_id' =>
'mail',
235 'command' =>
'onMessageRead',
238 'readTime' => $readTime->getTimestamp(),
251 return 'MAILMESSAGEREADED'.$messageId;
256 if ($eventName === static::EVENT_DELETE_MESSAGES)
258 return array(
'HEADER_MD5',
'MESSAGE_ID',
'MAILBOX_USER_ID');