15 private $mailCheckInterval;
22 $this->userId = $userId;
23 $this->mailCheckInterval = COption::getOptionString(
'intranet',
'mail_check_period', 10) * 60;
28 if (Loader::includeModule(
'crm'))
30 return (
bool)MailFilterTable::getCount([
31 '=MAILBOX_ID' => $mailboxId,
32 '=ACTION_TYPE' =>
'crm_imap',
44 foreach ($mailboxesSyncInfo as $mailboxId => $lastMailCheckData)
46 if (!$lastMailCheckData[
'isSuccess'])
48 $mailboxes[$mailboxId] = $lastMailCheckData;
56 $mailboxesToSync = [];
59 foreach ($mailboxesSyncInfo as $mailboxId => $lastMailCheckData)
61 if ($lastMailCheckData[
'isSuccess'])
63 $mailboxesToSync[$mailboxId] = $lastMailCheckData;
66 return $mailboxesToSync;
83 $mailboxesToSync = [];
84 foreach ($mailboxesSyncData as $mailboxId => $lastMailCheckData)
86 if ($lastMailCheckData[
'timeStarted'] >= 0 && (time() - intval($lastMailCheckData[
'timeStarted']) >= $this->mailCheckInterval))
88 $mailboxesToSync[$mailboxId] = $lastMailCheckData;
91 return $mailboxesToSync;
96 return $this->mailCheckInterval;
101 return MailEntityOptionsTable::deleteList($this->getOptionFilter($mailboxId, MailEntityOptionsTable::SYNC_STATUS_PROPERTY_NAME));
106 $this->saveSyncStatus($mailboxId,
true, 0);
109 private function buildTimeForSyncStatus(
$time): int
121 $this->saveSyncStatus($mailboxId,
true, $this->buildTimeForSyncStatus(
$time));
126 $this->saveSyncStatus($mailboxId, $isSuccess, $this->buildTimeForSyncStatus(
$time));
130 $this->removeConnectErrorCache($mailboxId);
138 if ($lastMailboxSyncStatus)
140 $this->removeConnectErrorCache($mailboxId);
145 $mailboxHelper = Helper\Mailbox::createInstance($mailboxId,
false);
154 if ($mailboxHelper->isAuthenticated())
156 $this->removeConnectErrorCache($mailboxId);
161 $error = $this->getConnectError($mailboxId);
164 $connectErrorAttempt = isset(
$error[
'VALUE']) ? (int)
$error[
'VALUE'] + 1 : 0;
166 if ($connectErrorAttempt > 0)
168 if (
$error[
'DATE_INSERT'] <= (clone $dateAttempt)->add(
'- '.self::MIN_INTERVAL_BETWEEN_CONNECTION_ATTEMPTS.
' seconds'))
170 $this->updateConnectError($mailboxId, $connectErrorAttempt, $dateAttempt);
175 $this->addConnectError($mailboxId);
178 if ($connectErrorAttempt >= self::MAX_CONNECTION_ATTEMPTS_BEFORE_UNAVAILABLE)
186 private function getOptionFilter(
int $mailboxId,
string $propertyName):
array
189 '=MAILBOX_ID' => $mailboxId,
190 '=ENTITY_TYPE' => MailEntityOptionsTable::MAILBOX_TYPE_NAME,
191 '=ENTITY_ID' => $mailboxId,
192 '=PROPERTY_NAME' => $propertyName,
196 private function removeConnectErrorCache(
int $mailboxId): void
198 MailEntityOptionsTable::deleteList($this->getOptionFilter($mailboxId, MailEntityOptionsTable::CONNECT_ERROR_ATTEMPT_COUNT_PROPERTY_NAME));
201 private function getConnectError(
int $mailboxId):
array|null
203 return MailEntityOptionsTable::getRow([
208 'filter' => $this->getOptionFilter($mailboxId, MailEntityOptionsTable::CONNECT_ERROR_ATTEMPT_COUNT_PROPERTY_NAME),
212 private function updateConnectError(
int $mailboxId,
int $attemptNumber, DateTime $dateAttempt =
new DateTime()): void
214 MailEntityOptionsTable::update(
216 'MAILBOX_ID' => $mailboxId,
217 'ENTITY_TYPE' => MailEntityOptionsTable::MAILBOX_TYPE_NAME,
218 'ENTITY_ID' => $mailboxId,
219 'PROPERTY_NAME' => MailEntityOptionsTable::CONNECT_ERROR_ATTEMPT_COUNT_PROPERTY_NAME,
222 'DATE_INSERT' => $dateAttempt,
223 'VALUE' => $attemptNumber,
228 private function addConnectError(
int $mailboxId, DateTime $dateAttempt =
new DateTime()): void
230 MailEntityOptionsTable::insertIgnore(
233 MailEntityOptionsTable::MAILBOX_TYPE_NAME,
234 MailEntityOptionsTable::CONNECT_ERROR_ATTEMPT_COUNT_PROPERTY_NAME,
240 private function saveSyncStatus(
int $mailboxId,
bool $status,
int $timestamp): void
242 $date = DateTime::createFromTimestamp($timestamp);
244 if(MailEntityOptionsTable::getCount($this->getOptionFilter($mailboxId, MailEntityOptionsTable::SYNC_STATUS_PROPERTY_NAME)))
246 MailEntityOptionsTable::update(
248 'MAILBOX_ID' => $mailboxId,
249 'ENTITY_TYPE' => MailEntityOptionsTable::MAILBOX_TYPE_NAME,
250 'ENTITY_ID' => $mailboxId,
251 'PROPERTY_NAME' => MailEntityOptionsTable::SYNC_STATUS_PROPERTY_NAME,
254 'DATE_INSERT' => $date,
261 MailEntityOptionsTable::insertIgnore(
264 MailEntityOptionsTable::MAILBOX_TYPE_NAME,
265 MailEntityOptionsTable::SYNC_STATUS_PROPERTY_NAME,
280 if (!$userId && is_object(
$USER) &&
$USER->isAuthorized())
282 $userId = (int)
$USER->getId();
290 static $userMailboxesIdsWithConnectionError = [];
292 if (isset($userMailboxesIdsWithConnectionError[$userId]))
294 return $userMailboxesIdsWithConnectionError[$userId];
297 $userMailboxesIdsWithConnectionError[$userId] = [];
301 if (empty($userMailboxIds))
303 return $userMailboxesIdsWithConnectionError[$userId];
306 $mailboxesWithConnectionError = MailEntityOptionsTable::getList(
313 '=ENTITY_TYPE' => MailEntityOptionsTable::MAILBOX_TYPE_NAME,
314 '=ENTITY_ID' => $userMailboxIds,
315 '=PROPERTY_NAME' => MailEntityOptionsTable::CONNECT_ERROR_ATTEMPT_COUNT_PROPERTY_NAME,
320 while (
$error = $mailboxesWithConnectionError->fetch())
322 if ((
int)
$error[
'VALUE'] >= self::MAX_CONNECTION_ATTEMPTS_BEFORE_UNAVAILABLE)
324 $userMailboxesIdsWithConnectionError[$userId][] = (int)
$error[
'ENTITY_ID'];
328 return $userMailboxesIdsWithConnectionError[$userId];
333 static $mailboxesSyncInfo =
null;
335 if (is_null($mailboxesSyncInfo))
337 $mailboxesSyncInfo = [];
341 if (empty($userMailboxIds))
343 return $mailboxesSyncInfo;
346 $datesLastOpening = MailEntityOptionsTable::getList(
354 '=ENTITY_TYPE' => MailEntityOptionsTable::MAILBOX_TYPE_NAME,
355 '=ENTITY_ID' => $userMailboxIds,
356 '=PROPERTY_NAME' => MailEntityOptionsTable::SYNC_STATUS_PROPERTY_NAME,
361 foreach ($datesLastOpening as $date)
363 if (isset($date[
'VALUE']))
365 $mailboxesSyncInfo[(int)$date[
'ENTITY_ID']] = [
366 'isSuccess' => (
bool)$date[
'VALUE'],
367 'timeStarted' => $date[
'DATE_INSERT']->getTimestamp(),
374 return $mailboxesSyncInfo;
382 return intval($lastMailCheckData[
'timeStarted']) + $this->mailCheckInterval - time();
392 $timeBeforeNextSyncMailboxes = [];
394 foreach ($mailboxesSuccessSynced as $mailboxId => $lastMailCheckData)
396 $timeBeforeNextSyncMailboxes[] = intval($lastMailCheckData[
'timeStarted']) + $this->mailCheckInterval - time();
399 return !empty($timeBeforeNextSyncMailboxes) && min($timeBeforeNextSyncMailboxes) > 0 ? min($timeBeforeNextSyncMailboxes) : 0;
420 if (!(isset($mailboxesOptions[$mailboxId]) && array_key_exists(
'isSuccess', $mailboxesOptions[$mailboxId])))
425 if (isset($mailboxesOptions[$mailboxId][
'isSuccess']))
427 return (
bool)$mailboxesOptions[$mailboxId][
'isSuccess'];
436 if (!(isset($mailboxesOptions[$mailboxId]) && array_key_exists(
'timeStarted', $mailboxesOptions[$mailboxId])))
440 return $mailboxesOptions[$mailboxId][
'timeStarted'];