From f7106f375c80a2b7a27df1bb882e4e024ba294d4 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 9 Dec 2013 14:38:13 +0400 Subject: [PATCH] Display BCC field in sent mail. --- .../MailSo/Base/StreamWrappers/Binary.php | 34 +++++++++++++++ .../app/libraries/MailSo/Mime/Message.php | 42 +++++++++++++++---- .../0.0.0/app/libraries/MailSo/Mime/Part.php | 17 ++++++++ .../app/libraries/MailSo/Smtp/SmtpClient.php | 4 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 34 +++++++++++---- 5 files changed, 114 insertions(+), 17 deletions(-) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php index 6d1d55b96..66770a42c 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php @@ -19,6 +19,11 @@ class Binary */ private static $aStreams = array(); + /** + * @var array + */ + private static $aRememberStreams = array(); + /** * @var resource */ @@ -148,6 +153,35 @@ class Binary return \MailSo\Base\Utils::ConvertEncoding($sEncodedString, $sFromEncoding, $sToEncoding); } + /** + * @param resource $rStream + * + * @return bool + */ + public static function IsStreamRemembed($rStream) + { + foreach (self::$aRememberStreams as $rRem) + { + if ($rStream === $rRem) + { + return true; + } + } + + return false; + } + + /** + * @param resource $rStream + */ + public static function RememberStream($rStream) + { + if (!self::IsStreamRemembed($rStream)) + { + self::$aRememberStreams[] = $rStream; + } + } + /** * @param resource $rStream * @param string $sUtilsDecodeOrEncodeFunctionName = null diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php index d4e147884..cad009f26 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php @@ -146,6 +146,22 @@ class Message return $oResult->Unique(); } + /** + * @return \MailSo\Mime\EmailCollection|null + */ + public function GetBcc() + { + $oResult = null; + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC] instanceof \MailSo\Mime\EmailCollection) + { + $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::BCC]; + } + + return $oResult ? $oResult->Unique() : null; + } + /** * @return \MailSo\Mime\EmailCollection */ @@ -552,10 +568,15 @@ class Message if (is_resource($oAttachmentPart->Body)) { - $oAttachmentPart->Body = - \MailSo\Base\StreamWrappers\Binary::CreateStream($oAttachmentPart->Body, - \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( - \MailSo\Base\Enumerations\Encoding::BASE64, false)); + if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAttachmentPart->Body)) + { + $oAttachmentPart->Body = + \MailSo\Base\StreamWrappers\Binary::CreateStream($oAttachmentPart->Body, + \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( + \MailSo\Base\Enumerations\Encoding::BASE64, false)); + + \MailSo\Base\StreamWrappers\Binary::RememberStream($oAttachmentPart->Body); + } } } @@ -618,10 +639,15 @@ class Message if (is_resource($oAlternativePart->Body)) { - $oAlternativePart->Body = - \MailSo\Base\StreamWrappers\Binary::CreateStream($oAlternativePart->Body, - \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( - $aAlternativeData[2], false)); + if (!\MailSo\Base\StreamWrappers\Binary::IsStreamRemembed($oAlternativePart->Body)) + { + $oAlternativePart->Body = + \MailSo\Base\StreamWrappers\Binary::CreateStream($oAlternativePart->Body, + \MailSo\Base\StreamWrappers\Binary::GetInlineDecodeOrEncodeFunctionName( + $aAlternativeData[2], false)); + + \MailSo\Base\StreamWrappers\Binary::RememberStream($oAlternativePart->Body); + } } } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php index 556f38466..e7e1cc600 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php @@ -579,11 +579,28 @@ class Part return $this; } + /** + * @return resorce + */ + public function Rewind() + { + if ($this->Body && \is_resource($this->Body)) + { + $aMeta = \stream_get_meta_data($this->Body); + if (isset($aMeta['seekable']) && $aMeta['seekable']) + { + \rewind($this->Body); + } + } + } + /** * @return resorce */ public function ToStream() { + $this->Rewind(); + $aSubStreams = array( $this->Headers->ToEncodedString(). diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php index f204444eb..94ca0a9e9 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php @@ -140,7 +140,7 @@ class SmtpClient extends \MailSo\Net\NetClient /** * @param string $sServerName * @param int $iPort = 25 - * @param string $sEhloHost = '127.0.0.1' + * @param string $sEhloHost = '[127.0.0.1]' * @param int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT * * @return \MailSo\Smtp\SmtpClient @@ -149,7 +149,7 @@ class SmtpClient extends \MailSo\Net\NetClient * @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Smtp\Exceptions\ResponseException */ - public function Connect($sServerName, $iPort = 25, $sEhloHost = '127.0.0.1', + public function Connect($sServerName, $iPort = 25, $sEhloHost = '[127.0.0.1]', $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT) { $this->iRequestTime = microtime(true); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 549b5b7cb..c5a2977c3 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -3892,15 +3892,35 @@ class Actions { try { - if (\is_resource($rMessageStream)) + if (!$oMessage->GetBcc()) { - @\rewind($rMessageStream); - } + if (\is_resource($rMessageStream)) + { + \rewind($rMessageStream); + } - $this->MailClient()->MessageAppendStream( - $rMessageStream, $iMessageStreamSize, $sSentFolder, array( - \MailSo\Imap\Enumerations\MessageFlag::SEEN - )); + $this->MailClient()->MessageAppendStream( + $rMessageStream, $iMessageStreamSize, $sSentFolder, array( + \MailSo\Imap\Enumerations\MessageFlag::SEEN + )); + } + else + { + $rAppendMessageStream = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); + + $iAppendMessageStreamSize = \MailSo\Base\Utils::MultipleStreamWriter( + $oMessage->ToStream(false), array($rAppendMessageStream), 8192, true, true, true); + + $this->MailClient()->MessageAppendStream( + $rAppendMessageStream, $iAppendMessageStreamSize, $sSentFolder, array( + \MailSo\Imap\Enumerations\MessageFlag::SEEN + )); + + if (is_resource($rAppendMessageStream)) + { + @fclose($rAppendMessageStream); + } + } } catch (\Exception $oException) {