mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-28 03:29:20 +03:00
Bugfix: save/send message failed do to CloseMemoryResource() in MailSo\Mime\Part destructor
This commit is contained in:
parent
7de00cd05c
commit
88e2c5f52d
3 changed files with 69 additions and 85 deletions
|
|
@ -1068,7 +1068,7 @@ abstract class Utils
|
|||
public static function MultipleStreamWriter($rRead, array $aWrite, int $iBufferLen = 8192, bool $bResetTimeLimit = true, bool $bFixCrLf = false, bool $bRewindOnComplete = false) : int
|
||||
{
|
||||
$mResult = false;
|
||||
if ($rRead && \count($aWrite))
|
||||
if (\is_resource($rRead) && \count($aWrite))
|
||||
{
|
||||
$mResult = 0;
|
||||
while (!\feof($rRead))
|
||||
|
|
@ -1080,7 +1080,7 @@ abstract class Utils
|
|||
break;
|
||||
}
|
||||
|
||||
if (0 === $iBufferLen || '' === $sBuffer)
|
||||
if ('' === $sBuffer)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -511,71 +511,6 @@ class Message
|
|||
return $oAlternativePart;
|
||||
}
|
||||
|
||||
private function createNewMessageSimpleOrAlternativeBody() : Part
|
||||
{
|
||||
$oResultPart = null;
|
||||
if (1 < \count($this->aAlternativeParts))
|
||||
{
|
||||
$oResultPart = new Part;
|
||||
|
||||
$oResultPart->Headers->append(
|
||||
new Header(Enumerations\Header::CONTENT_TYPE,
|
||||
Enumerations\MimeType::MULTIPART_ALTERNATIVE.'; '.
|
||||
(new ParameterCollection)->Add(
|
||||
new Parameter(
|
||||
Enumerations\Parameter::BOUNDARY,
|
||||
$this->generateNewBoundary())
|
||||
)->ToString()
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($this->aAlternativeParts as $aAlternativeData)
|
||||
{
|
||||
$oAlternativePart = $this->createNewMessageAlternativePartBody($aAlternativeData);
|
||||
if ($oAlternativePart)
|
||||
{
|
||||
$oResultPart->SubParts->append($oAlternativePart);
|
||||
}
|
||||
|
||||
unset($oAlternativePart);
|
||||
}
|
||||
|
||||
}
|
||||
else if (1 === \count($this->aAlternativeParts))
|
||||
{
|
||||
$oAlternativePart = $this->createNewMessageAlternativePartBody($this->aAlternativeParts[0]);
|
||||
if ($oAlternativePart)
|
||||
{
|
||||
$oResultPart = $oAlternativePart;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$oResultPart)
|
||||
{
|
||||
if ($this->bAddEmptyTextPart)
|
||||
{
|
||||
$oResultPart = $this->createNewMessageAlternativePartBody(array(
|
||||
Enumerations\MimeType::TEXT_PLAIN, null
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$aAttachments = $this->oAttachmentCollection->getArrayCopy();
|
||||
if (1 === \count($aAttachments) && isset($aAttachments[0]))
|
||||
{
|
||||
$this->oAttachmentCollection->Clear();
|
||||
|
||||
$oResultPart = $this->createNewMessageAlternativePartBody(array(
|
||||
$aAttachments[0]->ContentType(), $aAttachments[0]->Resource(),
|
||||
'', $aAttachments[0]->CustomContentTypeParams()
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $oResultPart;
|
||||
}
|
||||
|
||||
private function createNewMessageRelatedBody(Part $oIncPart) : Part
|
||||
{
|
||||
$oResultPart = null;
|
||||
|
|
@ -672,26 +607,80 @@ class Message
|
|||
return $oIncPart;
|
||||
}
|
||||
|
||||
public function ToPart(bool $bWithoutBcc = false) : Part
|
||||
{
|
||||
$oPart = $this->createNewMessageSimpleOrAlternativeBody();
|
||||
$oPart = $this->createNewMessageRelatedBody($oPart);
|
||||
$oPart = $this->createNewMessageMixedBody($oPart);
|
||||
$oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc);
|
||||
|
||||
return $oPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return resource
|
||||
*/
|
||||
public function ToStream(bool $bWithoutBcc = false)
|
||||
{
|
||||
return $this->ToPart($bWithoutBcc)->ToStream();
|
||||
}
|
||||
$oPart = null;
|
||||
if (1 < \count($this->aAlternativeParts))
|
||||
{
|
||||
$oPart = new Part;
|
||||
|
||||
$oPart->Headers->append(
|
||||
new Header(Enumerations\Header::CONTENT_TYPE,
|
||||
Enumerations\MimeType::MULTIPART_ALTERNATIVE.'; '.
|
||||
(new ParameterCollection)->Add(
|
||||
new Parameter(
|
||||
Enumerations\Parameter::BOUNDARY,
|
||||
$this->generateNewBoundary())
|
||||
)->ToString()
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($this->aAlternativeParts as $aAlternativeData)
|
||||
{
|
||||
$oAlternativePart = $this->createNewMessageAlternativePartBody($aAlternativeData);
|
||||
if ($oAlternativePart)
|
||||
{
|
||||
$oPart->SubParts->append($oAlternativePart);
|
||||
}
|
||||
|
||||
unset($oAlternativePart);
|
||||
}
|
||||
|
||||
}
|
||||
else if (1 === \count($this->aAlternativeParts))
|
||||
{
|
||||
$oAlternativePart = $this->createNewMessageAlternativePartBody($this->aAlternativeParts[0]);
|
||||
if ($oAlternativePart)
|
||||
{
|
||||
$oPart = $oAlternativePart;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$oPart)
|
||||
{
|
||||
if ($this->bAddEmptyTextPart)
|
||||
{
|
||||
$oPart = $this->createNewMessageAlternativePartBody(array(
|
||||
Enumerations\MimeType::TEXT_PLAIN, null
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
$aAttachments = $this->oAttachmentCollection->getArrayCopy();
|
||||
if (1 === \count($aAttachments) && isset($aAttachments[0]))
|
||||
{
|
||||
$this->oAttachmentCollection->Clear();
|
||||
|
||||
$oPart = $this->createNewMessageAlternativePartBody(array(
|
||||
$aAttachments[0]->ContentType(), $aAttachments[0]->Resource(),
|
||||
'', $aAttachments[0]->CustomContentTypeParams()
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$oPart = $this->createNewMessageRelatedBody($oPart);
|
||||
$oPart = $this->createNewMessageMixedBody($oPart);
|
||||
$oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc);
|
||||
return $oPart->ToStream();
|
||||
}
|
||||
/*
|
||||
public function ToString(bool $bWithoutBcc = false) : string
|
||||
{
|
||||
return \stream_get_contents($this->ToStream($bWithoutBcc));
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,11 +63,6 @@ class Part
|
|||
$this->SubParts = new PartCollection;
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
\MailSo\Base\ResourceRegistry::CloseMemoryResource($this->Body);
|
||||
}
|
||||
|
||||
public function Boundary() : string
|
||||
{
|
||||
return $this->sBoundary;
|
||||
|
|
@ -532,7 +527,7 @@ class Part
|
|||
if ($this->Body && \is_resource($this->Body))
|
||||
{
|
||||
$aMeta = \stream_get_meta_data($this->Body);
|
||||
if (isset($aMeta['seekable']) && $aMeta['seekable'])
|
||||
if (!empty($aMeta['seekable']))
|
||||
{
|
||||
\rewind($this->Body);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue