%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/bitrix/www/bitrix/modules/mail/lib/imapcommands/
Upload File :
Create Path :
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'
		);
	}
}

Zerion Mini Shell 1.0