• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/classes/general/mail.php
  • Класс: CAllMailMessage
  • Вызов: CAllMailMessage::parseMessage
static function parseMessage($message, $charset)
{
	$headerP = strpos($message, "rnrn");

	if (false === $headerP)
	{
		$rawHeader = '';
		$body      = $message;
	}
	else
	{
		$rawHeader = substr($message, 0, $headerP);
		$body      = substr($message, $headerP+4);
	}

	$header = CMailMessage::parseHeader($rawHeader, $charset);

	$htmlBody = '';
	$textBody = '';

	$parts = array();

	if ($header->isMultipart())
	{
		$startP = 0;
		$startRegex = sprintf('/(^|rn)--%srn/', preg_quote($header->getBoundary(), '/'));
		if (preg_match($startRegex, $body, $matches, PREG_OFFSET_CAPTURE))
		{
			$startP = $matches[0][1] + strlen($matches[0][0]);
		}

		$endP = strlen($body);
		$endRegex = sprintf('/rn--%s--(rn|$)/', preg_quote($header->getBoundary(), '/'));
		if (preg_match($endRegex, $body, $matches, PREG_OFFSET_CAPTURE))
		{
			$endP = $matches[0][1];
		}

		if (!($startP < $endP))
		{
			$startP = 0;
		}

		$data = substr($body, $startP, $endP-$startP);

		$isHtml = false;
		$rawParts = preg_split(sprintf('/rn--%srn/', preg_quote($header->getBoundary(), '/')), $data);
		$tmpParts = array();
		foreach ($rawParts as $part)
		{
			if (substr($part, 0, 2) == "rn")
				$part = "rn" . $part;

			[, $subHtml, $subText, $subParts] = CMailMessage::parseMessage($part, $charset);

			if ($subHtml)
				$isHtml = true;

			if ($subText)
				$tmpParts[] = array($subHtml, $subText);

			$parts = array_merge($parts, $subParts);
		}

		if (mb_strtolower($header->MultipartType()) == 'alternative')
		{
			$candidate = '';

			foreach ($tmpParts as $part)
			{
				if ($part[0])
				{
					if (!$htmlBody || (mb_strlen($htmlBody) < mb_strlen($part[0])))
					{
						$htmlBody  = $part[0];
						$candidate = $part[1];
					}
				}
				else
				{
					if (!$textBody || mb_strlen($textBody) < mb_strlen($part[1]))
						$textBody = $part[1];
				}
			}

			if (!trim($textBody))
				$textBody = $candidate;
		}
		else
		{
			foreach ($tmpParts as $part)
			{
				if ($textBody)
					$textBody .= "rnrn";
				$textBody .= $part[1];

				if ($isHtml)
				{
					if ($htmlBody)
						$htmlBody .= "rnrn";

					$htmlBody .= $part[0] ?: $part[1];
				}
			}
		}
	}
	else
	{
		$bodyPart = CMailMessage::decodeMessageBody($header, $body, $charset);
		$contentType = mb_strtolower($bodyPart['CONTENT-TYPE']);

		if (
			!$bodyPart['FILENAME']
			&& (mb_strpos($contentType, 'text/') === 0)
			&& ($contentType !== 'text/calendar')
		)
		{
			if ($contentType == 'text/html')
			{
				$htmlBody = $bodyPart['BODY'];
				$textBody = html_entity_decode(htmlToTxt($bodyPart['BODY']), ENT_QUOTES | ENT_HTML401, $charset);
			}
			else
			{
				$textBody = $bodyPart['BODY'];
			}
		}
		else
		{
			$parts[] = $bodyPart;
		}
	}

	return array($header, $htmlBody, $textBody, $parts);
}