5use Bitrix\Mail\Helper\Message\MessageInternalDateHandler;
6use Bitrix\Mail\Helper\MessageEventManager;
7use Bitrix\Mail\Internals\MessageUploadQueueTable;
8use Bitrix\Main\DB\Connection;
10use Bitrix\Main\EventManager;
11use Bitrix\Main\Localization;
12use Bitrix\Main\ORM\Fields\Relations\Reference;
13use Bitrix\Main\ORM\Query\Join;
35 public const OLD =
'Y';
56 return 'b_mail_message_uid';
77 "UPDATE %s SET %s WHERE %s",
85 'onMailMessageModified',
86 array(MessageEventManager::class,
'onMailMessageModified')
91 $event = new \Bitrix\Main\Event(
'mail',
'onMailMessageModified',
array(
92 'MAIL_FIELDS_DATA' => $eventData,
93 'UPDATED_FIELDS_VALUES' =>
$fields,
97 EventManager::getInstance()->removeEventHandler(
'mail',
'onMailMessageModified', $eventKey);
117 $messages = static::selectMessagesToBeDeleted(
136 for (
$i = 0;
$i < $messagesCount;
$i=
$i+$portionLimit)
138 $portion = array_slice(
$messages,
$i, $portionLimit);
141 ' FROM %s WHERE ID IN (\'' . join(
"','", array_column($portion,
'ID')) .
'\')
',
142 $connection->getSqlHelper()->quote($entity->getDbTableName()),
145 self::insertIntoDeleteMessagesQueue($connection, $query);
147 $connection->query(sprintf('DELETE %s
', $query));
154 $remains = array_column(
155 static::selectMessagesToBeDeleted(
156 MessageEventManager::getRequiredFieldNamesForEvent($eventName),
165 if ($messagesIds = array_column($messages, 'MESSAGE_ID
') )
167 $remains = array_column(
174 '@MESSAGE_ID
' => $messagesIds,
185 //Checking that the values were actually deleted:
186 $deletedMessages = array_filter(
188 function ($item) use ($remains) {
189 return !in_array($item['MESSAGE_ID
'], $remains);
193 $eventManager = EventManager::getInstance();
194 $eventKey = $eventManager->addEventHandler(
196 'onMailMessageDeleted
',
197 array(MessageEventManager::class, 'onMailMessageDeleted
')
199 $event = new \Bitrix\Main\Event('mail
', 'onMailMessageDeleted
', array(
200 'MAIL_FIELDS_DATA
' => $deletedMessages,
201 'DELETED_BY_FILTER
' => $filter,
204 EventManager::getInstance()->removeEventHandler('mail
', 'onMailMessageDeleted
', $eventKey);
210 public static function getLocalUID(int $mailboxId, string $dirPath, string $dirUIDv, string $order): int
212 $additionalFilter = [];
214 if (\Bitrix\Mail\Helper\LicenseManager::getSyncOldLimit() > 0)
216 $additionalFilter = [
217 '>INTERNALDATE
' => \Bitrix\Main\Type\Date::createFromTimestamp(strtotime(sprintf('-%u days
', \Bitrix\Mail\Helper\LicenseManager::getSyncOldLimit()))),
226 'filter
' => array_merge([
227 '=MAILBOX_ID
' => $mailboxId,
228 '=DIR_MD5
' => md5($dirPath),
229 '=DIR_UIDV
' => $dirUIDv,
233 '==DELETE_TIME
' => 0,
234 ], $additionalFilter),
241 if (!isset($row['MSG_UID
']))
246 return (int)$row['MSG_UID
'];
249 public static function getLastLocalUID(int $mailboxId, string $dirPath, string $dirUIDv): int
251 return self::getLocalUID($mailboxId, $dirPath, $dirUIDv, 'DESC
');
254 public static function getFirstLocalUID(int $mailboxId, string $dirPath, string $dirUIDv): int
256 return self::getLocalUID($mailboxId, $dirPath, $dirUIDv, 'ASC
');
259 public static function getMessage(
269 '=MESSAGE_ID
' => $id,
270 '=MAILBOX_ID
' => $mailboxId,
273 else if(!is_null($uid))
277 '=MAILBOX_ID
' => $mailboxId,
302 private static function insertIntoDeleteMessagesQueue(Connection $connection, string $query): void
304 $sqlHelper = $connection->getSqlHelper();
305 $messageDeleteTableName = $sqlHelper->quote(Internals\MessageDeleteQueueTable::getTableName());
306 $insertFields = ' (ID, MAILBOX_ID, MESSAGE_ID)
';
307 $fromSelect = sprintf('(SELECT ID, MAILBOX_ID, MESSAGE_ID %s)
', $query);
308 $insertQuery = $sqlHelper->getInsertIgnore($messageDeleteTableName, $insertFields, $fromSelect);
309 $connection->query($insertQuery);
312 public static function getPresetRemoveFilters()
315 '==DELETE_TIME
' => 0,
326 public static function deleteListSoft(array $filter)
328 $entity = static::getEntity();
329 $connection = $entity->getConnection();
330 $filter = array_merge($filter , static::getPresetRemoveFilters());
332 //mark selected messages for deletion if there are no messages in the download queue
334 'UPDATE %s SET %s WHERE %s AND NOT EXISTS (SELECT 1 FROM %s WHERE %s)
',
335 $connection->getSqlHelper()->quote($entity->getDbTableName()),
336 $connection->getSqlHelper()->prepareUpdate($entity->getDbTableName(), [
337 'DELETE_TIME
' => time(),
339 Entity\Query::buildFilterSql(
343 $connection->getSqlHelper()->quote(Internals\MessageUploadQueueTable::getTableName()),
344 Entity\Query::buildFilterSql(
347 '=ID
' => new \Bitrix\Main\DB\SqlExpression('?#
', 'ID
'),
348 '=MAILBOX_ID
' => new \Bitrix\Main\DB\SqlExpression('?#
', 'MAILBOX_ID
'),
353 $result = $connection->query($query);
354 $count = $connection->getAffectedRowsCount();
355 $result->setCount($count > 0 ? $count : 0);
370 private static function selectMessagesToBeDeleted($fields, $filter, array $eventData, $limit = false): array
374 $primary = array('ID
', 'MAILBOX_ID
');
376 $eventData = array_values($eventData);
378 if (empty($eventData))
384 $select = array_diff($fields, array_intersect($fields, ...array_map('array_keys
', $eventData)));
391 if (array_diff($primary, array_intersect($primary, ...array_map('array_keys
', $eventData))))
397 foreach ($eventData as $item)
399 $key = sprintf('%u:%s
', $item['MAILBOX_ID
'], $item['ID
']);
400 $result[$key] = $item;
405 $select = array_unique(array_merge($primary, $select));
407 $mailsFilter = $filter;
408 $mailsFilter['==IS_IN_QUEUE
'] = false;
409 $queueSubquery = MessageUploadQueueTable::query();
410 $queueSubquery->addFilter('=ID
', new \Bitrix\Main\DB\SqlExpression('%s
'));
411 $queueSubquery->addFilter('=MAILBOX_ID
', new \Bitrix\Main\DB\SqlExpression('%s
'));
412 $emailsForDeleteQuery = MailMessageUidTable::query()
413 ->registerRuntimeField(new Entity\ExpressionField(
415 sprintf('EXISTS(%s)
', $queueSubquery->getQuery()),
418 ->setFilter($mailsFilter);
422 $emailsForDeleteQuery->setLimit($limit);
425 foreach ($select as $index => $selectingField)
427 if (strncmp('MAILBOX_
', $selectingField, 8) === 0 && !MailMessageUidTable::getEntity()->hasField($selectingField))
429 $emailsForDeleteQuery->addSelect('MAILBOX.
'.mb_substr($selectingField, 8), $selectingField);
432 $emailsForDeleteQuery->addSelect($selectingField);
435 $res = $emailsForDeleteQuery->exec();
436 while ($item = $res->fetch())
438 $key = sprintf('%u:%s
', $item['MAILBOX_ID
'], $item['ID
']);
439 $result[$key] = array_merge((array) $result[$key], $item);
442 return array_values($result);
455 public static function mergeData(array $insert, array $update)
457 $entity = static::getEntity();
458 $connection = $entity->getConnection();
459 $helper = $connection->getSqlHelper();
461 $sql = $helper->prepareMerge($entity->getDBTableName(), $entity->getPrimaryArray(), $insert, $update);
463 $sql = current($sql);
466 $connection->queryExecute($sql);
467 $entity->cleanCache();
471 public static function getMap()
475 'data_type
' => 'string',
478 'MAILBOX_ID
' => array(
479 'data_type
' => 'integer
',
483 'data_type
' => 'string',
486 'data_type
' => 'integer
',
489 'data_type
' => 'integer
',
491 'INTERNALDATE
' => array(
492 'data_type
' => 'datetime
',
494 'HEADER_MD5
' => array(
495 'data_type
' => 'string',
498 'data_type
' => 'enum',
499 'values
' => array('Y
', 'N
', 'S
', 'U
'),
502 'data_type
' => 'enum',
512 'SESSION_ID
' => array(
513 'data_type
' => 'string',
516 'TIMESTAMP_X
' => array(
517 'data_type
' => 'datetime
',
519 'DATE_INSERT
' => array(
520 'data_type
' => 'datetime
',
523 'MESSAGE_ID
' => array(
524 'data_type
' => 'integer
',
529 'reference
' => array('=this.MAILBOX_ID
' => 'ref.ID
'),
532 'data_type
' => 'Bitrix\Mail\MailMessage
',
533 'reference
' => array('=this.MESSAGE_ID
' => 'ref.ID
'),
535 'DELETE_TIME
' => array(
536 'data_type
' => 'integer
',
541 MailMessageTable::class,
542 Join::on('this.MESSAGE_ID
', 'ref.ID
')
543 ->whereColumn('this.MAILBOX_ID
', 'ref.MAILBOX_ID
')
551 public static function onAfterUpdate(Entity\Event $event)
553 $result = new Entity\EventResult;
554 $parameters = $event->getParameters();
555 if ($parameters['primary
'] && is_set($parameters['fields
']['IS_OLD
']))
557 $message = self::getByPrimary($parameters['primary
'], [
570 $internalDate = $message['INTERNALDATE
'];
571 $mailboxId = (int)$message['MAILBOX_ID
'];
572 $dirMd5 = $message['DIR_MD5
'];
574 $startInternalDate = MessageInternalDateHandler::getStartInternalDateForDir($mailboxId, dirMd5: $dirMd5);
576 if (!is_null($startInternalDate) && $internalDate <= $startInternalDate)
578 $updateResult = MessageInternalDateHandler::clearStartInternalDate($mailboxId, $dirMd5);
579 if (!$updateResult->isSuccess())
581 $result->setErrors($updateResult->getErrors());
static getRequiredFieldNamesForEvent($eventName)
const EVENT_DELETE_MESSAGES
const EXCLUDED_COUNTER_STATUSES
static deleteList(array $filter, array $messages=[], $limit=false, bool $sendEvent=true)
static updateList(array $filter, array $fields, array $eventData=[], bool $sendEvent=true)
static loadMessages($file)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
</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."%"