26 if (!file_exists($path)) {
30 return 'file://'.str_replace(
'\\',
'/', realpath($path));
35 foreach ($iterator as $chunk) {
36 fwrite($stream, $chunk);
46 while (!feof($stream)) {
47 $buffer = fread($stream, 78);
51 if (preg_match(
'/(\r\n\r\n|\n\n)/', $headers, $match)) {
52 $headersPosEnd = strpos($headers, $headerBodySeparator = $match[0]);
58 $headers = $this->getMessageHeaders(trim(substr($headers, 0, $headersPosEnd)));
60 fseek($stream, $headersPosEnd + \strlen($headerBodySeparator));
62 return new SMimePart($this->
getStreamIterator($stream), $type, $subtype, $this->getParametersFromHeader($headers[
'content-type']));
67 while (!feof($stream)) {
68 yield fread($stream, 16372);
72 private function getMessageHeaders(
string $headerData): array
75 $headerLines = explode(
"\r\n", str_replace(
"\n",
"\r\n", str_replace(
"\r\n",
"\n", $headerData)));
76 $currentHeaderName =
'';
79 foreach ($headerLines as $headerLine) {
81 if (
'' === $headerLine) {
86 if (
false === strpos($headerLine,
':')) {
87 $headers[$currentHeaderName] .=
' '.trim($headerLine);
91 $header = explode(
':', $headerLine, 2);
92 $currentHeaderName = strtolower($header[0]);
93 $headers[$currentHeaderName] = trim($header[1]);
99 private function getParametersFromHeader(
string $header): array
103 preg_match_all(
'/(?P<name>[a-z-0-9]+)=(?P<value>"[^"]+"|(?:[^\s;]+|$))(?:\s+;)?/i', $header, $matches);
105 foreach ($matches[
'value'] as $pos => $paramValue) {
106 $params[$matches[
'name'][$pos]] = trim($paramValue,
'"');