- Модуль: mail
- Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
- Класс: BitrixMailHelperMailboxImap
- Вызов: Imap::syncMessages
public function syncMessages($mailboxID, $dirPath, $UIDs)
{
$meta = $this->client->select($dirPath, $error);
$uidtoken = $meta['uidvalidity'];
//checking the dir for existence or authentication failed
if (false === $meta)
{
return true;
}
$dirsHelper = new MailHelperMailboxDirectoryHelper($mailboxID);
$dir = $dirsHelper->getDirByPath($dirPath);
$chunks = array_chunk($UIDs, 10);
$entity = MailMailMessageUidTable::getEntity();
$connection = $entity->getConnection();
foreach ($chunks as $chunk)
{
$connection->query(sprintf(
'DELETE FROM %s WHERE %s',
MailMailMessageUidTable::getTableName(),
MainEntityQuery::buildFilterSql(
$entity,
[
'@MSG_UID' => $chunk,
'=MESSAGE_ID' => 0,
'=MAILBOX_ID' => $mailboxID,
'=DIR_MD5' => $dir->getDirMd5()
]
)
));
$messages = $this->client->fetch(
true,
$dirPath,
join(',', $chunk),
'(UID FLAGS INTERNALDATE RFC822.SIZE BODYSTRUCTURE BODY.PEEK[HEADER])',
$error,
'list'
);
if (empty($messages))
{
if (false === $messages)
{
$this->warnings->add($this->client->getErrors()->toArray());
return true;
}
break;
}
$this->parseHeaders($messages);
$this->blacklistMessages($dir->getPath(), $messages);
$this->removeExistingMessagesFromSynchronizationList($dir->getPath(), $uidtoken, $messages);
foreach ($messages as &$message)
{
$this->fillMessageFields($message, $dir->getPath(), $uidtoken);
}
$this->linkWithExistingMessages($messages);
foreach ($messages as $item)
{
$isOutgoing = false;
if(empty($item['__replaces']))
{
$outgoingMessageId = $this->selectOutgoingMessageIdFromHeader($item);
if($outgoingMessageId)
{
$item['__replaces'] = $outgoingMessageId;
$isOutgoing = true;
}
}
$hashesMap = [];
$this->syncMessage($dir->getPath(), $item, $hashesMap, true, $isOutgoing);
if ($this->isTimeQuotaExceeded())
{
return false;
}
}
}
return true;
}