• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/classes/general/mail.php
  • Класс: CMailHeader
  • Вызов: CMailHeader::Parse
function Parse($message_header, $charset)
{
	$this->charset = defined('BX_MAIL_DEFAULT_CHARSET') && BX_MAIL_DEFAULT_CHARSET != '' ? BX_MAIL_DEFAULT_CHARSET : $charset;
	if(preg_match("'content-type:.*?charsets*=s*([^rn;]+)'is", $message_header, $res))
		$this->charset = mb_strtolower(trim($res[1], ' "'));

	$message_header = preg_replace('/rn([x20t])/i', '1', $message_header);

	$ar_message_header_tmp = explode("rn", $message_header);

	for ($i = 0, $num = count($ar_message_header_tmp); $i < $num; $i++)
	{
		$this->arHeaderLines[] = CMailHeader::decodeHeader($ar_message_header_tmp[$i], $charset, $this->charset);
	}

	$this->arHeader = Array();
	for($i = 0, $num = count($this->arHeaderLines); $i < $num; $i++)
	{
		$p = mb_strpos($this->arHeaderLines[$i], ":");
		if($p>0)
		{
			$header_name = mb_strtoupper(trim(mb_substr($this->arHeaderLines[$i], 0, $p)));
			$header_value = trim(mb_substr($this->arHeaderLines[$i], $p + 1));
			$this->arHeader[$header_name] = $header_value;
		}
	}

	$full_content_type = $this->arHeader["CONTENT-TYPE"];
	if($full_content_type == '')
		$full_content_type = "text/plain";

	if(!($p = mb_strpos($full_content_type, ";")))
		$p = mb_strlen($full_content_type);

	$this->content_type = trim(mb_substr($full_content_type, 0, $p));
	if(mb_strpos(mb_strtolower($this->content_type), "multipart/") === 0)
	{
		$this->bMultipart = true;
		if (!preg_match("'boundarys*=s*(.+?);'i", $full_content_type, $res))
			preg_match("'boundarys*=s*(.+)'i", $full_content_type, $res);

		$this->boundary = trim($res[1], '"');
		if($p = mb_strpos($this->content_type, "/"))
			$this->MultipartType = mb_substr($this->content_type, $p + 1);
	}

	if($p < mb_strlen($full_content_type))
	{
		$add = mb_substr($full_content_type, $p + 1);
		if(preg_match("'name=([^;]+)'i", $full_content_type, $res))
			$this->filename = trim($res[1], '"');
	}

	$cd = isset($this->arHeader["CONTENT-DISPOSITION"]) ? $this->arHeader["CONTENT-DISPOSITION"] : '';
	if ($cd <> '')
	{
		if (preg_match("'filename=([^;]+)'i", $cd, $res))
		{
			$this->filename = trim($res[1], '"');
		}
		else if (preg_match("'filename*=([^;]+)'i", $cd, $res))
		{
			[$fncharset, $fnstr] = preg_split("/'[^']*'/", trim($res[1], '"'));
			$this->filename = CMailUtil::ConvertCharset(rawurldecode($fnstr), $fncharset, $charset);
		}
		else if (preg_match("'filename*0=([^;]+)'i", $cd, $res))
		{
			$this->filename = trim($res[1], '"');

			$i = 0;
			while (preg_match("'filename*".(++$i)."=([^;]+)'i", $cd, $res))
				$this->filename .= trim($res[1], '"');
		}
		else if (preg_match("'filename*0*=([^;]+)'i", $cd, $res))
		{
			$fnstr = trim($res[1], '"');

			$i = 0;
			while (preg_match("'filename*".(++$i)."*?=([^;]+)'i", $cd, $res))
				$fnstr .= trim($res[1], '"');

			[$fncharset, $fnstr] = preg_split("/'[^']*'/", $fnstr);
			if (!empty($fnstr))
			{
				$fnstr = rawurldecode($fnstr);
				$this->filename = $fncharset ? CMailUtil::convertCharset($fnstr, $fncharset, $charset) : $fnstr;
			}
		}
	}

	if(isset($this->arHeader["CONTENT-ID"]) && $this->arHeader["CONTENT-ID"]!='')
		$this->content_id = trim($this->arHeader["CONTENT-ID"], '"<>');

	$this->strHeader = implode("rn", $this->arHeaderLines);

	return true;
}