6use Bitrix\Mail\Helper\Message\MessageInternalDateHandler;
13 $userMailboxes = \Bitrix\Mail\MailboxTable::getList([
19 '=SERVER_TYPE' =>
'imap',
23 if (empty($userMailboxes))
28 $numberOfUnSynchronizedMailboxes =
count($userMailboxes);
30 foreach ($userMailboxes as $mailbox)
32 $mailboxID = $mailbox[
'ID'];
33 $mailboxHelper = Helper\Mailbox::createInstance($mailboxID,
false);
34 if (empty($mailboxHelper))
36 $numberOfUnSynchronizedMailboxes--;
41 'MAILBOX_ID' => $mailboxID,
42 'ENTITY_TYPE' =>
'MAILBOX',
43 'ENTITY_ID' => $mailboxID,
44 'PROPERTY_NAME' =>
'SYNC_FIRST_DAY',
48 '=MAILBOX_ID' => $keyRow[
'MAILBOX_ID'],
49 '=ENTITY_TYPE' => $keyRow[
'ENTITY_TYPE'],
50 '=ENTITY_ID' => $keyRow[
'ENTITY_ID'],
51 '=PROPERTY_NAME' => $keyRow[
'PROPERTY_NAME'],
54 $startValue =
'started_for_id_'.$mailboxID;
58 if(
Internals\MailEntityOptionsTable::getList([
63 ])->fetchAll()[0][
'VALUE'] !==
'completed')
67 [
'VALUE' => $startValue]
70 $synchronizationSuccess = $mailboxHelper->syncFirstDay();
72 if($synchronizationSuccess)
76 [
'VALUE' =>
'completed']
78 $numberOfUnSynchronizedMailboxes--;
83 $numberOfUnSynchronizedMailboxes--;
93 $synchronizationSuccess = $mailboxHelper->syncFirstDay();
95 if($synchronizationSuccess)
99 [
'VALUE' =>
'completed']
101 $numberOfUnSynchronizedMailboxes--;
106 if($numberOfUnSynchronizedMailboxes === 0)
112 return 'Bitrix\Mail\Helper::syncAllDirsInMailboxForTheFirstSyncDayAgent();';
118 $mailboxHelper = Helper\Mailbox::createInstance($id,
false);
120 if (empty($mailboxHelper))
125 $mailbox = $mailboxHelper->getMailbox();
127 if ($mailbox[
'OPTIONS'][
'next_sync'] <= time())
129 $mailboxHelper->sync();
131 $mailbox = $mailboxHelper->getMailbox();
136 $pPERIOD = min($pPERIOD, max($mailbox[
'OPTIONS'][
'next_sync'] - time(), 60));
138 return sprintf(
'Bitrix\Mail\Helper::syncMailboxAgent(%u);', $id);
143 $mailboxHelper = Helper\Mailbox::createInstance($id,
false);
147 $mailboxHelper->syncOutgoing();
155 $userMailboxes = \Bitrix\Mail\MailboxTable::getList([
161 '=SERVER_TYPE' =>
'imap',
165 if (empty($userMailboxes))
170 $numberOfUnSynchronizedMailboxes =
count($userMailboxes);
172 foreach ($userMailboxes as $mailbox)
174 $mailboxID = $mailbox[
'ID'];
175 $mailboxHelper = Helper\Mailbox::createInstance($mailboxID,
false);
176 if (empty($mailboxHelper))
178 $numberOfUnSynchronizedMailboxes--;
183 'MAILBOX_ID' => $mailboxID,
184 'ENTITY_TYPE' =>
'MAILBOX',
185 'ENTITY_ID' => $mailboxID,
186 'PROPERTY_NAME' =>
'SYNC_IS_OLD_STATUS',
190 '=MAILBOX_ID' => $keyRow[
'MAILBOX_ID'],
191 '=ENTITY_TYPE' => $keyRow[
'ENTITY_TYPE'],
192 '=ENTITY_ID' => $keyRow[
'ENTITY_ID'],
193 '=PROPERTY_NAME' => $keyRow[
'PROPERTY_NAME'],
196 $startValue =
'started_for_id_'.$mailboxID;
200 if(
Internals\MailEntityOptionsTable::getList([
205 ])->fetchAll()[0][
'VALUE'] !==
'completed')
209 [
'VALUE' => $startValue]
212 $synchronizationSuccess = $mailboxHelper->resyncIsOldStatus();
214 if($synchronizationSuccess)
218 [
'VALUE' =>
'completed']
220 $numberOfUnSynchronizedMailboxes--;
225 $numberOfUnSynchronizedMailboxes--;
231 $fields[
'VALUE'] = $startValue;
235 $synchronizationSuccess = $mailboxHelper->resyncIsOldStatus();
237 if($synchronizationSuccess)
241 [
'VALUE' =>
'completed']
243 $numberOfUnSynchronizedMailboxes--;
248 if($numberOfUnSynchronizedMailboxes === 0)
254 return 'Bitrix\Mail\Helper::markOldMessagesAgent();';
260 $mailboxHelper = Helper\Mailbox::rawInstance($id,
false);
262 if (empty($mailboxHelper))
267 $mailboxHelper->setCheckpoint();
271 '=MAILBOX_ID' => $id,
277 $stage1 = $mailboxHelper->dismissOldMessages();
278 $stage2 = $mailboxHelper->dismissDeletedUidMessages();
279 $stage3 = $mailboxHelper->cleanup();
283 $pPERIOD = min($pPERIOD, max($stage1 && $stage2 && $stage3 ? $pPERIOD : 600, 60));
285 if ($pPERIOD ===
null)
290 return sprintf(
'Bitrix\Mail\Helper::cleanupMailboxAgent(%u);', $id);
298 $mailboxHelper = Helper\Mailbox::createInstance($id,
false);
302 $mailboxHelper->resortTree();
310 return \CMailbox::delete($id) ?
'' : sprintf(
'Bitrix\Mail\Helper::deleteMailboxAgent(%u);', $id);
318 '@SERVICE_TYPE' =>
array(
'domain',
'crdomain'),
321 while ($item =
$res->fetch())
323 if ($item[
'SERVICE_TYPE'] ==
'domain')
325 $lockName = sprintf(
'domain_users_sync_lock_%u', $item[
'ID']);
328 if ($syncLock < time()-3600)
335 else if ($item[
'SERVICE_TYPE'] ==
'crdomain')
337 \CControllerClient::executeEvent(
'OnMailControllerResyncMemberUsers',
array(
'DOMAIN' => $item[
'SERVER']));
341 return 'Bitrix\Mail\Helper::resyncDomainUsersAgent();';
346 $mailboxHelper = Helper\Mailbox::createInstance($id,
false);
348 return empty($mailboxHelper) ?
false : $mailboxHelper->sync();
356 $client = static::createClient($mailbox);
358 $list = $client->listMailboxes(
'*',
$error,
true);
359 $errors = $client->getErrors();
370 'path' => $item[
'name'],
371 'name' => $item[
'title'],
372 'level' => $item[
'level'],
373 'disabled' => (
bool) preg_grep(
'/^ \x5c Noselect $/ix', $item[
'flags']),
374 'income' => mb_strtolower($item[
'name']) ==
'inbox',
375 'outcome' => (
bool) preg_grep(
'/^ \x5c Sent $/ix', $item[
'flags']),
387 $mailbox = Helper\Mailbox::prepareMailbox([
392 $client = static::createClient($mailbox);
394 $result = $client->getUIDsForSpecificDay($dirPath, $internalDate);
401 $firstSyncUID = MailMessageUidTable::getList(
406 'filter' => array_merge(
410 '=MAILBOX_ID' => $mailboxId,
411 '=DIR_MD5' => md5($dirPath),
416 'INTERNALDATE' =>
'DESC',
422 if(isset($firstSyncUID[0][
'INTERNALDATE']))
424 return $firstSyncUID[0][
'INTERNALDATE'];
437 $startInternalDate = MessageInternalDateHandler::getStartInternalDateForDir($mailboxId, $dirPath);
439 return $startInternalDate ??
false;
445 if(is_int($mailboxID) && is_null($mailbox))
447 $mailbox = Helper\Mailbox::prepareMailbox([
453 $startInternalDate = static::getStartInternalDateForDir($mailbox[
'ID'], $dirPath);
455 if($startInternalDate)
459 return static::getImapUnseen($mailbox, $dirPath,
$error,
$errors, $startInternalDate);
472 'MAILBOX_ID' => $mailboxId,
473 'ENTITY_TYPE' =>
'MAILBOX',
474 'ENTITY_ID' => $mailboxId
478 '=MAILBOX_ID' => $keyRow[
'MAILBOX_ID'],
479 '=ENTITY_TYPE' => $keyRow[
'ENTITY_TYPE'],
480 '=ENTITY_ID' => $keyRow[
'ENTITY_ID']
488 $rowValue = [
'VALUE' =>
$count];
493 'select' => [
'VALUE'],
497 $counterHasChanged =
false;
501 if ((
int)$row[
'VALUE'] !==
$count)
504 $counterHasChanged =
true;
510 $counterHasChanged =
true;
513 if ($counterHasChanged)
515 \CPullWatch::addToStack(
516 'mail_mailbox_' .$mailboxId,
518 'module_id' =>
'mail',
520 'mailboxId' => $mailboxId,
522 'command' =>
'counters_updated',
533 'ENTITY_TYPE' =>
'DIR',
534 'MAILBOX_ID' => $mailboxId,
544 if(!is_null(
$count[0][
"COUNT"]))
546 static::setMailboxUnseenCounter($mailboxId,(
int)
$count[0][
"COUNT"]);
552 $mailboxId = $mailbox[
'ID'];
553 $directoryHelper =
new Helper\MailboxDirectoryHelper($mailboxId);
554 $syncDirs = $directoryHelper->getSyncDirs();
556 $folderCountersForAdding = [];
559 \CTimeZone::Disable();
561 foreach ($syncDirs as
$dir)
563 if(
$dir->isInvisibleToCounters())
568 $count = static::getImapUnseenSyncForDir($mailbox,
$dir->getPath());
572 $folderCountersForAdding[
$dir->getId()] =
$count;
577 \CTimeZone::Enable();
581 '=MAILBOX_ID' => $mailboxId,
582 '=ENTITY_TYPE' =>
'DIR',
583 '=ENTITY_ID' => array_keys($folderCountersForAdding)
591 $folderCountersForUpdating = [];
593 while ($folderCounter = $currentFolderCounters->fetch())
595 $folderId = (int)$folderCounter[
'ENTITY_ID'];
596 $folderCount = (int)$folderCounter[
'VALUE'];
598 if (isset($folderCountersForAdding[$folderId]))
600 if ($folderCountersForAdding[$folderId] !== $folderCount)
602 $folderCountersForUpdating[$folderId] = $folderCountersForAdding[$folderId];
605 unset($folderCountersForAdding[$folderId]);
609 foreach ($folderCountersForAdding as $id =>
$count)
618 'MAILBOX_ID' => $mailboxId,
619 'ENTITY_TYPE' =>
'DIR',
626 foreach ($folderCountersForUpdating as $id =>
$count)
630 'MAILBOX_ID' => $mailboxId,
631 'ENTITY_TYPE' =>
'DIR',
648 $client = static::createClient($mailbox);
650 $result = $client->getUnseen($dirPath,
$error, $startInternalDate);
651 $errors = $client->getErrors();
660 $id = (int) (is_array($id) ? $id[
'ID'] : $id);
662 $mailbox = MailboxTable::getList(
array(
663 'filter' =>
array(
'ID' => $id,
'ACTIVE' =>
'Y'),
664 'select' =>
array(
'*',
'LANG_CHARSET' =>
'SITE.CULTURE.CHARSET')
670 if (!in_array($mailbox[
'SERVER_TYPE'],
array(
'imap',
'controller',
'domain',
'crdomain')))
673 if (in_array($mailbox[
'SERVER_TYPE'],
array(
'controller',
'crdomain')))
678 $mailbox[
'SERVER'] =
$result[
'server'];
679 $mailbox[
'PORT'] =
$result[
'port'];
680 $mailbox[
'USE_TLS'] =
$result[
'secure'];
682 elseif ($mailbox[
'SERVER_TYPE'] ==
'domain')
686 $mailbox[
'SERVER'] =
$result[
'server'];
687 $mailbox[
'PORT'] =
$result[
'port'];
688 $mailbox[
'USE_TLS'] =
$result[
'secure'];
691 $client = static::createClient($mailbox, $mailbox[
'LANG_CHARSET'] ?: $mailbox[
'CHARSET']);
703 $res = MailMessageUidTable::getList(
array(
705 'ID',
'MAILBOX_ID',
'IS_SEEN',
706 'MAILBOX_USER_ID' =>
'MAILBOX.USER_ID',
707 'MAILBOX_OPTIONS' =>
'MAILBOX.OPTIONS',
710 '=HEADER_MD5' =>
$hash,
711 '==DELETE_TIME' => 0,
715 while ($item =
$res->fetch())
717 $isOwner = $item[
'MAILBOX_USER_ID'] ==
$userId;
718 $isPublic = in_array(
'crm_public_bind', (
array) $item[
'MAILBOX_OPTIONS'][
'flags']);
719 $inQueue = in_array(
$userId, (
array) $item[
'MAILBOX_OPTIONS'][
'crm_lead_resp']);
720 if (!$isOwner && !$isPublic && !$inQueue)
725 if (in_array($item[
'IS_SEEN'],
array(
'Y',
'S')) !=
$data[
'seen'])
727 MailMessageUidTable::update(
730 'MAILBOX_ID' => $item[
'MAILBOX_ID'],
733 'IS_SEEN' =>
$data[
'seen'] ?
'S' :
'U',
740 private static function createClient($mailbox, $langCharset =
null)
743 $mailbox[
'SERVER'], $mailbox[
'PORT'],
744 $mailbox[
'USE_TLS'] ==
'Y' || $mailbox[
'USE_TLS'] ==
'S',
745 $mailbox[
'USE_TLS'] ==
'Y',
746 $mailbox[
'LOGIN'], $mailbox[
'PASSWORD'],
757 parent::initSettings();
759 $this->settingServerMsSmtp =
false;
760 $this->settingMailFillToEmail =
false;
761 $this->settingMailConvertMailHeader =
true;
762 $this->settingConvertNewLineUnixToWindows =
true;
763 $this->useBlacklist =
false;
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static overwriteMessageHeaders(Main\Mail\Mail $message, array $headers)
static resortTreeAgent($id)
static syncMailboxAgent($id)
static resyncDomainUsersAgent()
static markOldMessagesAgent()
static syncMailbox($id, &$error)
static updateImapMessage($userId, $hash, $data, &$error)
static getLastDeletedOldMessageInternaldate($mailboxId, $dirPath, $filter=[])
static setMailboxUnseenCounter($mailboxId, $count)
static deleteMailboxAgent($id)
static updateMailCounters($mailbox)
static addImapMessage($id, $data, &$error)
static updateMailboxUnseenCounter($mailboxId)
static getStartInternalDateForDir( $mailboxId, $dirPath,)
static syncOutgoingAgent($id)
static getImapUnseen($mailbox, $dirPath='inbox', &$error=[], &$errors=null, $startInternalDate=null)
static syncAllDirsInMailboxForTheFirstSyncDayAgent()
static listImapDirs($mailbox, &$error=[], &$errors=null)
static cleanupMailboxAgent($id)
static getImapUnseenSyncForDir($mailbox=null, $dirPath, $mailboxID=null)
static getImapUIDsForSpecificDay($mailboxID, $dirPath='inbox', $internalDate)
static deleteList(array $filter, array $messages=[], $limit=false, bool $sendEvent=true)
static fetchOneOutcome($mailboxId)
static get($moduleId, $name, $default="", $siteId=false)
static set($moduleId, $name, $value="", $siteId="")
static getRow(array $parameters)
static getList(array $parameters=array())
static update($primary, array $data)
static getDomainUsers($token, $domain, &$error, $resync=false)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</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."%"