- Модуль: 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);
}