%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/mail/lib/imapcommands/ |
Current File : //home/bitrix/www/bitrix/modules/mail/lib/imapcommands/mailsfoldersmanager.php |
<?php namespace Bitrix\Mail\ImapCommands; use Bitrix\Mail; use Bitrix\Mail\Helper\MessageFolder; use Bitrix\Main; use Bitrix\Main\Localization\Loc; /** * Class MailsFoldersManager * @package Bitrix\Mail\ImapCommands */ class MailsFoldersManager extends SyncInternalManager { public function deleteMails() { $result = $this->initData(MessageFolder::TRASH); if (!$result->isSuccess()) { return $result; } return $this->processDelete($this->getFolderNameByType(MessageFolder::TRASH)); } public function moveMails($folderToMoveName) { $result = $this->initData(); if (!$result->isSuccess()) { return $result; } if ($folderToMoveName === $this->getFolderNameByType(MessageFolder::SPAM)) { return $this->sendMailsToSpam(); } elseif ($folderToMoveName === $this->getFolderNameByType(MessageFolder::TRASH)) { return $this->deleteMails(); } $disabled = !empty($this->mailbox['OPTIONS']['imap']['disabled']) ? $this->mailbox['OPTIONS']['imap']['disabled'] : []; if (in_array($folderToMoveName, $disabled, true)) { return $result->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_FOLDER_IS_DISABLED', ['#FOLDER#' => $folderToMoveName]), 'MAIL_CLIENT_FOLDER_IS_DISABLED')); } $folders = []; foreach ($this->messages as $index => $message) { if (in_array($message['ID'], $this->messagesIds, true)) { $folders[$message['DIR_MD5']] = $message['DIR_MD5']; } } foreach ($folders as $index => $folderHash) { if ($folderHash === md5($folderToMoveName)) { return $result->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_MOVE_TO_SELF_FOLDER', ['#FOLDER#' => $folderToMoveName]), 'MAIL_CLIENT_MOVE_TO_SELF_FOLDER')); } } $result = $this->moveMailsToFolder($folderToMoveName); if (!$result->isSuccess()) { return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } return (new Main\Result()); } public function restoreMailsFromSpam() { $result = $this->initData(MessageFolder::SPAM); if (!$result->isSuccess()) { return $result; } $result = $this->moveMailsToFolder($this->getFolderNameByType(MessageFolder::INCOME)); if (!$result->isSuccess()) { return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } // todo delete from blackmails if no mails in spam with same email address? return $result; } /** * @return Main\Result * @throws Main\ArgumentException * @throws Main\ObjectPropertyException * @throws Main\SystemException */ public function sendMailsToSpam() { $result = $this->initData(MessageFolder::SPAM); if (!$result->isSuccess()) { return $result; } return $this->processSpam($this->getFolderNameByType(MessageFolder::SPAM)); } private function processDelete($folderTrashName) { $messagesToMove = $messagesToDelete = []; foreach ($this->messages as $messageUid) { if ($this->isMailToBeDeleted($messageUid)) { $messagesToDelete[] = $messageUid; } else { $messagesToMove[] = $messageUid; } } $result = $this->processMoving($messagesToMove, $folderTrashName); if (!$result->isSuccess()) { return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } return $this->deleteMessages($messagesToDelete, $this->mailbox); } private function processMoving($messagesToMove, $folderToName) { if (!$messagesToMove) { return new Main\Result(); } $result = $this->moveMailsByImap($messagesToMove, $folderToName); if ($result->isSuccess()) { $this->repository->updateMessageFieldsAfterMove($this->messages, $folderToName, $this->mailbox); $this->imapSyncMovedMessages($messagesToMove, $folderToName); return (new Main\Result())->setData($messagesToMove); } else { return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } } private function processSpam($folderSpamName) { $result = $this->moveMailsToFolder($folderSpamName); if (!$result->isSuccess()) { return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } if ($result->getData()) { $mailsToBlacklist = []; foreach ($this->messages as $messageUid) { if ($messageUid['EMAIL'] !== $this->mailbox['EMAIL']) { $mailsToBlacklist[] = $messageUid['EMAIL']; } } return $this->repository->addMailsToBlacklist($mailsToBlacklist, $this->userId); } return $result; } private function deleteMessages($messagesToDelete, $mailbox) { if (empty($messagesToDelete)) { return new Main\Result(); } /** @var Mail\Helper\Mailbox\Imap $helper */ $helper = $this->getMailClientHelper(); $result = $helper->deleteMails($messagesToDelete); if ($result->isSuccess()) { $this->repository->deleteMailsCompletely($messagesToDelete); return new Main\Result(); } return (new Main\Result())->addError(new Main\Error(Loc::getMessage('MAIL_CLIENT_SYNC_ERROR'), 'MAIL_CLIENT_SYNC_ERROR')); } private function isMailToBeDeleted($messageUid) { $trashFolder = $this->getFolderNameByType(MessageFolder::TRASH); return md5($trashFolder) === $messageUid['DIR_MD5']; } private function moveMailsToFolder($folderToName) { $mailsToMove = []; foreach ($this->messages as $messageUid) { if (md5($folderToName) !== $messageUid['DIR_MD5']) { $mailsToMove[] = $messageUid; } } return $this->processMoving($mailsToMove, $folderToName); } private function moveMailsByImap($messagesToMove, $folder) { if (empty($messagesToMove)) { return new Main\Result(); } /** @var Mail\Helper\Mailbox\Imap $helper */ $helper = $this->getMailClientHelper(); return $helper->moveMailsToFolder($messagesToMove, $folder); } private function processSyncMovedMessages($folderCurrentNameEncoded) { $helper = $this->getMailClientHelper(); $folderCurrentName = base64_decode($folderCurrentNameEncoded); $count = $helper->syncDir($folderCurrentName); $this->repository->deleteOldMessages($folderCurrentName); } public static function syncMovedMessages($mailboxId, $folderName, $messagesIds) { $mailManager = new static($mailboxId, unserialize($messagesIds)); $mailManager->processSyncMovedMessages($folderName); return ''; } protected function imapSyncMovedMessages($messagesToMove, $folderName) { $messIds = array_map( function ($item) { return $item['ID']; }, $messagesToMove ); \CAgent::addAgent( sprintf( static::class . "::syncMovedMessages(%u, '%s', '%s');", $this->mailbox['ID'], base64_encode($folderName), serialize($messIds) ), 'mail' ); } }