- Модуль: mail
- Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
- Класс: BitrixMailHelperMailboxImap
- Вызов: Imap::resyncMessages
protected function resyncMessages($dirPath, $uidtoken, &$messages)
{
$excerpt = array();
$range = array(
reset($messages)['UID'],
end($messages)['UID'],
);
sort($range);
$result = $this->listMessages(array(
'select' => array('ID', 'MESSAGE_ID', 'IS_SEEN'),
'filter' => array(
'=DIR_MD5' => md5($dirPath),
'=DIR_UIDV' => $uidtoken,
'>=MSG_UID' => $range[0],
'<=MSG_UID' => $range[1],
),
), false);
while ($item = $result->fetch())
{
$item['MAILBOX_USER_ID'] = $this->mailbox['USER_ID'];
$excerpt[$item['ID']] = $item;
}
$update = array(
'Y' => array(),
'N' => array(),
'S' => array(),
'U' => array(),
);
foreach ($messages as $id => $item)
{
$messageUid = md5(sprintf('%s:%u:%u', $dirPath, $uidtoken, $item['UID']));
if (array_key_exists($messageUid, $excerpt))
{
$excerptSeen = $excerpt[$messageUid]['IS_SEEN'];
$excerptSeenYN = in_array($excerptSeen, array('Y', 'S')) ? 'Y' : 'N';
$messageSeen = preg_grep('/^ x5c Seen $/ix', $item['FLAGS']) ? 'Y' : 'N';
if ($messageSeen != $excerptSeen)
{
if (in_array($excerptSeen, array('S', 'U')))
{
$excerpt[$messageUid]['IS_SEEN'] = $excerptSeenYN;
$update[$excerptSeenYN][$messageUid] = $excerpt[$messageUid];
if ($messageSeen != $excerptSeenYN)
{
$update[$excerptSeen][] = $item['UID'];
}
}
else
{
$excerpt[$messageUid]['IS_SEEN'] = $messageSeen;
$update[$messageSeen][$messageUid] = $excerpt[$messageUid];
}
}
unset($excerpt[$messageUid]);
}
else
{
/*
addMessage2Log(
sprintf(
'IMAP: message lost (%u:%s:%u:%s)',
$this->mailbox['ID'], $dirPath, $uidtoken, $item['UID']
),
'mail', 0, false
);
*/
}
}
$countUpdated = 0;
$countDeleted = count($excerpt);
foreach ($update as $seen => $items)
{
if (!empty($items))
{
if (in_array($seen, array('S', 'U')))
{
$method = 'S' == $seen ? 'seen' : 'unseen';
$this->client->$method($items, $dirPath);
}
else
{
$countUpdated += count($items);
$this->updateMessagesRegistry(
array(
'@ID' => array_keys($items),
),
array(
'IS_SEEN' => $seen,
),
$items = array() // @TODO: fix lazyload in MessageEventManager::processOnMailMessageModified()
);
}
}
}
if (!empty($excerpt))
{
$result = $this->unregisterMessages(
[
'@ID' => array_keys($excerpt),
'=DIR_MD5' => md5($dirPath),
],
[
'info' => 'deletion of non-existent messages',
]
);
$countDeleted += $result ? $result->getCount() : 0;
}
$this->lastSyncResult['updatedMessages'] += $countUpdated;
$this->lastSyncResult['deletedMessages'] += $countDeleted;
}