/** * @inheritdoc */ public function applyForData(array $data) { try { $this->v('message', $data); $d =& $data['message']; /** * @see \Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; $date = $this->v('date', $d); $date = $date ? $date->format('Y-m-d H:i:s') : null; $d['date'] = \Conjoon_Date_Format::utcToLocal($date); $ccList = $this->buildAddresses($this->v('cc', $d)); $toList = $this->buildAddresses($this->v('to', $d)); $usedAccount = $this->guessAccountUsed(array_merge($toList, $ccList)); //getMessageTextHeader($subject, $date, array $from, array $replyTo, array $to, array $cc) /** * @see \Conjoon_Filter_StringPrependIf */ require_once 'Conjoon/Filter/StringPrependIf.php'; $prep = new \Conjoon_Filter_StringPrependIf(array('Fwd: ', 'FWD:'), 'Fwd: '); $d['subject'] = $prep->filter($this->v('subject', $d)); $messageTextHead = $this->getMessageTextHeader($d['subject'], $d['date'], $this->buildAddresses($this->v('from', $d)), $this->buildAddresses($this->v('replyTo', $d)), $toList, $ccList); $d['to'] = array(); $d['cc'] = array(); $d['bcc'] = array(); $d['attachments'] = $this->createAttachments($this->v('attachments', $d)); $d['inReplyTo'] = ""; $d['references'] = ""; $d['groupwareEmailAccountsId'] = null; if ($usedAccount) { $d['groupwareEmailAccountsId'] = $usedAccount->getId(); } $d['contentTextPlain'] = $messageTextHead . $this->getContentTextPlain($this->v('contentTextPlain', $d)); $d['contentTextHtml'] = ""; unset($d['messageId']); unset($d['replyTo']); unset($d['from']); $data['draft'] = $data['message']; unset($data['message']); } catch (\Exception $e) { throw new ServicePatronException("Exception thrown by previous exception: " . $e->getMessage(), 0, $e); } return $data; }
/** * Converts the passed string to a date in the timezone of self::$_timezone. * * Returns a UTC date converted to the local date as determined by the * timezonefound in self::$_timezone, which can be specified when * instantiating this class. The date sttring returned will be in the format * of YYYY-MM-dd HH:mm:ss. * Note: The passed argument must already be a UTC date! This method will * not check whether the passed argument's timezone is UTC * This method will gracefully fall back to teh default date of * 1970-01-01 00:00:00 if it could not convert the passed argument properly. * * @param mixed $value * @return string */ public function filter($value) { /** * @see Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; return Conjoon_Date_Format::utcToLocal($value, $this->getTimezone()); }
/** * @inheritdoc */ public function applyForData(array $data) { try { $this->v('message', $data); $d =& $data['message']; /** * @see \Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; $date = $this->v('date', $d); $date = $date ? $date->format('Y-m-d H:i:s') : null; $d['date'] = \Conjoon_Date_Format::utcToLocal($date); $d['cc'] = $this->buildAddresses($this->v('cc', $d)); $d['to'] = $this->buildAddresses($this->v('to', $d)); $d['bcc'] = $this->buildAddresses($this->v('bcc', $d)); $d['from'] = $this->buildAddresses($this->v('from', $d)); $d['replyTo'] = $this->buildAddresses($this->v('replyTo', $d)); $usedAccount = $this->guessAccountUsed($d['from']); $d['attachments'] = $this->createAttachments($this->v('attachments', $d)); $d['groupwareEmailAccountsId'] = null; if ($usedAccount) { $d['groupwareEmailAccountsId'] = $usedAccount->getId(); } $d['contentTextPlain'] = $this->getContentTextPlain($this->v('contentTextPlain', $d)); $d['contentTextHtml'] = ""; $data['draft'] = $data['message']; unset($data['message']); } catch (\Exception $e) { throw new ServicePatronException("Exception thrown by previous exception: " . $e->getMessage(), 0, $e); } return $data; }
/** * @inheritdoc */ public function applyForData(array $data) { try { $this->v('message', $data); $d =& $data['message']; /** * @see \Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; $date = $this->v('date', $d); $date = $date ? $date->format('Y-m-d H:i:s') : null; $d['date'] = \Conjoon_Date_Format::utcToLocal($date); $ccList = $this->buildAddresses($this->v('cc', $d)); $toList = $this->buildAddresses($this->v('to', $d)); $usedAccount = $this->guessAccountUsed(array_merge($toList, $ccList)); // build "cc" before "to" since "to" gets overwritten later on $d['cc'] = $this->buildCcAddressList($ccList, $toList, $usedAccount); $d['to'] = $this->getToAddress($this->v('from', $d), $this->v('replyTo', $d)); $d['bcc'] = array(); $d['attachments'] = array(); $messageId = $this->v('messageId', $d); $d['inReplyTo'] = $messageId; $d['references'] = $this->v('references', $d) != '' ? $d['references'] . ' ' . $messageId : $messageId; $d['groupwareEmailAccountsId'] = null; if ($usedAccount) { $d['groupwareEmailAccountsId'] = $usedAccount->getId(); } /** * @see \Conjoon_Filter_StringPrependIf */ require_once 'Conjoon/Filter/StringPrependIf.php'; $prep = new \Conjoon_Filter_StringPrependIf(array('Re: ', 'RE: ', 'Aw: ', 'AW: '), 'Re: '); $d['subject'] = $prep->filter($this->v('subject', $d)); $d['contentTextPlain'] = $this->getContentTextPlain($this->v('contentTextPlain', $d)); $d['contentTextHtml'] = ""; unset($d['messageId']); unset($d['replyTo']); unset($d['from']); $data['draft'] = $data['message']; unset($data['message']); } catch (\Exception $e) { throw new ServicePatronException("Exception thrown by previous exception: " . $e->getMessage(), 0, $e); } return $data; }
/** * * @param Conjoon_Modules_Groupware_Email_Account_Dto $accountDto * @param array $pathInfo the pathInfo parts for the remote folder, * which have to be assembled again using the remote storage's delimiter * @param array $sortInfo * * @return array * * @throws Conjoon_Argument_Exception */ protected function _getEmailItemListForAccountAndRemoteFolder(Conjoon_Modules_Groupware_Email_Account_Dto $accountDto, $pathInfo, array $sortInfo = array(), $additionalInfo, $from, $to, $userId) { if (is_array($pathInfo)) { $path = $pathInfo['path']; $rootId = $pathInfo['rootId']; $globalName = $this->_getFolderFacade()->getAssembledGlobalNameForAccountAndPath($accountDto, $path); } else { $globalName = $pathInfo; $fld = $this->_getFolderFacade()->getRootFolderForAccountId($accountDto, $userId); $rootId = $fld[0]->id; /** * @see Conjoon_Modules_Groupware_Email_ImapHelper */ require_once 'Conjoon/Modules/Groupware/Email/ImapHelper.php'; $path = Conjoon_Modules_Groupware_Email_ImapHelper::splitFolderForImapAccount($globalName, $accountDto); } /** * @see Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; /** * @see Conjoon_Modules_Groupware_Email_ImapHelper */ require_once 'Conjoon/Modules/Groupware/Email/ImapHelper.php'; $protocol = Conjoon_Modules_Groupware_Email_ImapHelper::reuseImapProtocolForAccount($accountDto); /** * @see Zend_Mail_Storage_Imap */ require_once 'Conjoon/Mail/Storage/Imap.php'; $storage = new Conjoon_Mail_Storage_Imap($protocol); $messageStruct = $storage->getHeaderListAndMetaInformationForGlobalName($globalName, $from, $to); /** * @see Conjoon_Text_Parser_Mail_MessageHeaderParser */ require_once 'Conjoon/Text/Parser/Mail/MessageHeaderParser.php'; $parser = new Conjoon_Text_Parser_Mail_MessageHeaderParser(); /** * @see Conjoon_Text_Transformer_DateStringSanitizer */ require_once 'Conjoon/Text/Transformer/DateStringSanitizer.php'; $sanitizeDateTransformer = new Conjoon_Text_Transformer_DateStringSanitizer(); /** * @see Conjoon_Text_Transformer_MimeDecoder */ require_once 'Conjoon/Text/Transformer/MimeDecoder.php'; $mimeDecoder = new Conjoon_Text_Transformer_MimeDecoder(); /** * @see Conjoon_Text_Parser_Mail_EmailAddressIdentityParser */ require_once 'Conjoon/Text/Parser/Mail/EmailAddressIdentityParser.php'; $identityParser = new Conjoon_Text_Parser_Mail_EmailAddressIdentityParser(); $identityParserSender = new Conjoon_Text_Parser_Mail_EmailAddressIdentityParser(array('addSlashes' => false, 'useQuoting' => false)); /** * @see Conjoon_Text_Transformer_Mail_EmailAddressNameQuoteTransformer */ require_once 'Conjoon/Text/Transformer/Mail/EmailAddressNameQuoteTransformer.php'; $quoteTransformer = new Conjoon_Text_Transformer_Mail_EmailAddressNameQuoteTransformer(); $parsedHeaders = array(); for ($i = 0, $len = count($messageStruct); $i < $len; $i++) { try { $header = $parser->parse($messageStruct[$i]['header']); } catch (Exception $e) { continue; } $header['date'] = Conjoon_Date_Format::toUtc($sanitizeDateTransformer->transform($header['date'])); // no mime decode needed, already done in EmailHeaderParser $header['subject'] = $mimeDecoder->transform($header['subject']); // RECIPIENTS IS NOT PART OF THE HEADER. $recipients = array_merge(isset($header['to']) ? $identityParser->parse($header['to']) : array(), isset($header['cc']) ? $identityParser->parse($header['cc']) : array(), isset($header['bcc']) ? $identityParser->parse($header['bcc']) : array()); $recipientNames = array(); foreach ($recipients as $address => $addressValue) { if (isset($addressValue[1])) { $recipientNames[] = $quoteTransformer->transform($addressValue[1]); } else { $recipientNames[] = $addressValue[0]; } } $header['recipients'] = $recipientNames; // SENDER IS NOT PART OF THE HEADER. $sender = $identityParserSender->parse($header['from']); $header['sender'] = isset($sender[0][1]) ? $sender[0][1] : $sender[0][0]; // the uid $header['uid'] = $messageStruct[$i]['uid']; $header['isAttachment'] = false; $header['isRead'] = false; $header['isSpam'] = false; $header['referencedAsType'] = array(); // flag processing $flags =& $messageStruct[$i]['flags']; for ($u = 0, $lenu = count($flags); $u < $lenu; $u++) { if ($flags[$u] == '\\Seen') { $header['isRead'] = true; } else { if ($flags[$u] == '$Junk') { $header['isSpam'] = true; } else { if (stripos($flags[$u], 'forwarded') !== false) { array_push($header['referencedAsType'], 'forwarded'); } else { if ($flags[$u] == '\\Answered') { array_push($header['referencedAsType'], 'reply'); } } } } } // possible attachment? $header['isAttachment'] = $this->lookUpImapAttachmentInBodyStructure($messageStruct[$i]['bodystructure']); $parsedHeaders[] = $header; } // PARSED HEADERS IS THE INPUT AS WE NEED IT FOR STORING INTO THE DB // NOW GENERATE THE OUTPUT AS CONJOON EXPECTS IT! /** * @see Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; /** * @see Zend_Filter_HtmlEntities */ require_once 'Zend/Filter/HtmlEntities.php'; $htmlEntitiesFilter = new Zend_Filter_HtmlEntities(array('quotestyle' => ENT_COMPAT)); $responseItems = array(); for ($i = 0, $len = count($parsedHeaders); $i < $len; $i++) { $header =& $parsedHeaders[$i]; $responseItems[] = array('id' => $header['uid'], 'recipients' => $header['recipients'], 'sender' => $header['sender'], 'subject' => $htmlEntitiesFilter->filter($header['subject']), 'date' => Conjoon_Date_Format::utcToLocal($header['date']), 'isRead' => (int) $header['isRead'], 'isAttachment' => (int) $header['isAttachment'], 'isSpam' => (int) $header['isSpam'], 'isDraft' => 0, 'isOutboxPending' => 0, 'referencedAsTypes' => $header['referencedAsType'], 'groupwareEmailFoldersId' => -1, 'path' => array_merge(array($rootId), $path)); } // sort if (isset($sortInfo['sort'])) { switch ($sortInfo['sort']) { case 'date': usort($responseItems, array($this, 'memorySortDate')); break; case 'subject': usort($responseItems, array($this, 'memorySortSubject')); break; case 'recipients': usort($responseItems, array($this, 'memorySortRecipients')); break; case 'sender': usort($responseItems, array($this, 'memorySortSender')); break; case 'is_spam': usort($responseItems, array($this, 'memorySortIsSpam')); break; case 'is_read': usort($responseItems, array($this, 'memorySortIsRead')); break; case 'is_attachment': usort($responseItems, array($this, 'memorySortisAttachment')); break; } if ($sortInfo['dir'] == 'DESC') { $responseItems = array_reverse($responseItems); } } $totalCount = count($responseItems); if (isset($sortInfo['limit']) && isset($sortInfo['start'])) { $responseItems = array_splice($responseItems, $sortInfo['start'], $sortInfo['limit']); } if ($additionalInfo) { return array('items' => $responseItems, 'totalCount' => $totalCount, 'pendingItems' => $this->getPendingCountForGlobalName($accountDto, $globalName)); } return $responseItems; }
/** * @inheritdoc */ public function applyForData(array $data) { try { $this->v('message', $data); $d =& $data['message']; $d['isPlainText'] = 1; $strategyResult = $this->getReadableStrategy()->execute($data); $d['body'] = $strategyResult->getBody(); $d['hasResources'] = false; $d['resourcesLoaded'] = false; if ($strategyResult->hasExternalResources()) { $d['hasResources'] = true; $d['resourcesLoaded'] = $strategyResult->areExternalResourcesLoaded(); } $d['attachments'] = $this->createAttachments($this->v('attachments', $d)); /** * @see \Conjoon_Date_Format */ require_once 'Conjoon/Date/Format.php'; $date = $this->v('date', $d); $date = $date ? $date->format('Y-m-d H:i:s') : null; $d['date'] = \Conjoon_Date_Format::utcToLocal($date); $d['to'] = $this->createAddressList($this->v('to', $d)); $d['cc'] = $this->createAddressList($this->v('cc', $d)); $d['from'] = $this->createAddressList($this->v('from', $d)); $d['bcc'] = $this->createAddressList($this->v('bcc', $d)); $d['replyTo'] = $this->createAddressList($this->v('replyTo', $d)); /** * @see \Zend_Filter_HtmlEntities */ require_once 'Zend/Filter/HtmlEntities.php'; $htmlEntitiesFilter = new \Zend_Filter_HtmlEntities(array('quotestyle' => ENT_COMPAT)); $d['subject'] = $htmlEntitiesFilter->filter($this->v('subject', $d)); unset($d['contentTextPlain']); unset($d['contentTextHtml']); } catch (\Exception $e) { throw new ServicePatronException("Exception thrown by previous exception: " . $e->getMessage(), 0, $e); } return $data; }
/** * Ensures that default time is returned for invalid time value. * */ public function testUtcToLocalDefaultTimeForInvalidArgument() { $this->assertEquals("1970-01-01 00:00:00", Conjoon_Date_Format::utcToLocal("")); $this->assertEquals("1970-01-01 00:00:00", Conjoon_Date_Format::utcToLocal("bla")); }