• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/helper/mailbox/imap.php
  • Класс: BitrixMailHelperMailboxImap
  • Вызов: Imap::cacheMessage
protected function cacheMessage(&$message, $params = array())
{
	if (!is_array($message))
	{
		return parent::cacheMessage($message, $params);
	}

	if (!is_array($message['__parts']))
	{
		return parent::cacheMessage($message['__parts'], $params);
	}

	if (empty($message['__header']))
	{
		return false;
	}

	if (empty($message['__bodystructure']) || !($message['__bodystructure'] instanceof MailImapBodyStructure))
	{
		return false;
	}

	$params['log_parts'] = $message['__parts'];

	$complete = function (&$html, &$text)
	{
		if ('' !== $html && '' === $text)
		{
			$text = html_entity_decode(
				htmlToTxt($html),
				ENT_QUOTES | ENT_HTML401,
				$this->mailbox['LANG_CHARSET']
			);
		}
		elseif ('' === $html && '' !== $text)
		{
			$html = txtToHtml($text, false, 120);
		}
	};

	[$bodyHtml, $bodyText, $attachments] = $message['__bodystructure']->traverse(
		function (MailImapBodyStructure $item, &$subparts) use (&$message, &$complete)
		{
			$parts = &$message['__parts'];

			$html = '';
			$text = '';
			$attachments = array();

			if ($item->isMultipart())
			{
				if ('alternative' === $item->getSubtype())
				{
					foreach ($subparts as $part)
					{
						$part = $part[0];

						if ('' !== $part[0])
						{
							$html = $part[0];
						}

						if ('' !== $part[1])
						{
							$text = $part[1];
						}

						if (!empty($part[2]))
						{
							$attachments = array_merge($attachments, $part[2]);
						}
					}

					$complete($html, $text);
				}
				else
				{
					foreach ($subparts as $part)
					{
						$part = $part[0];

						$complete($part[0], $part[1]);

						if ('' !== $part[0] || '' !== $part[1])
						{
							$html .= $part[0] . "rnrn";
							$text .= $part[1] . "rnrn";
						}

						$attachments = array_merge($attachments, $part[2]);
					}
				}

				$html = trim($html);
				$text = trim($text);
			}
			else
			{
				if (array_key_exists(sprintf('BODY[%s]', $item->getNumber()), $parts))
				{
					$part = CMailMessage::decodeMessageBody(
						CMailMessage::parseHeader(
							$parts[sprintf('BODY[%s.MIME]', $item->getNumber())],
							$this->mailbox['LANG_CHARSET']
						),
						$parts[sprintf('BODY[%s]', $item->getNumber())],
						$this->mailbox['LANG_CHARSET']
					);
				}
				else
				{
					$part = [
						'CONTENT-TYPE' => $item->getType() . '/' . $item->getSubtype(),
						'CONTENT-ID'   => $item->getId(),
						'BODY'         => '',
						'FILENAME'     => $item->getParams()['name']
					];
				}

				if (!$item->isBodyText())
				{
					$attachments[] = $part;
				}
				elseif (!empty($part))
				{
					if ('html' === $item->getSubtype())
					{
						$html = $part['BODY'];
					}
					else
					{
						$text = $part['BODY'];
					}
				}
			}

			return array($html, $text, $attachments);
		}
	)[0];

	$complete($bodyHtml, $bodyText);

	return CMailMessage::saveMessage(
		$this->mailbox['ID'],
		$dummyBody,
		$message['__header'],
		$bodyHtml,
		$bodyText,
		$attachments,
		$params
	);
}