/** * @param CAcount $oAccount * @param array $aFilters * * @return bool */ public function updateSieveFilters($oAccount, $aFilters) { $sFilters = "#sieve filter\n\n"; if ($oAccount) { foreach ($aFilters as $oFilter) { if ('' === trim($oFilter->Filter)) { continue; } if (EFilterAction::MoveToFolder === $oFilter->Action && '' === trim($oFilter->FolderFullName)) { continue; } $aFields = array(); switch ($oFilter->Field) { default: case EFilterFiels::From: $aFields[] = 'From'; break; case EFilterFiels::To: $aFields[] = 'To'; $aFields[] = 'CC'; break; case EFilterFiels::Subject: $aFields[] = 'Subject'; break; } // condition foreach ($aFields as $iIndex => $sField) { $aFields[$iIndex] = '"' . $this->_quoteValue($sField) . '"'; } $sCondition = ''; $sFields = implode(',', $aFields); switch ($oFilter->Condition) { case EFilterCondition::ContainSubstring: $sCondition = 'if header :contains [' . $sFields . '] "' . $this->_quoteValue($oFilter->Filter) . '" {'; break; case EFilterCondition::ContainExactPhrase: $sCondition = 'if header :is [' . $sFields . '] "' . $this->_quoteValue($oFilter->Filter) . '" {'; break; case EFilterCondition::NotContainSubstring: $sCondition = 'if not header :contains [' . $sFields . '] "' . $this->_quoteValue($oFilter->Filter) . '" {'; break; } // folder $sFolderFullName = ''; if (EFilterAction::MoveToFolder === $oFilter->Action) { $sFolderFullName = api_Utils::ConvertEncoding($oFilter->FolderFullName, 'utf7-imap', $this->sSieveFolderCharset); } // action $sAction = ''; switch ($oFilter->Action) { case EFilterAction::DeleteFromServerImmediately: $sAction = 'discard ;'; $sAction .= 'stop ;'; break; case EFilterAction::MoveToFolder: $sAction = 'fileinto "' . $this->_quoteValue($sFolderFullName) . '" ;' . "\n"; $sAction .= 'stop ;'; break; } $sEnd = '}'; if (!$oFilter->Enable) { $sCondition = '#' . $sCondition; $sAction = '#' . $sAction; $sEnd = '#' . $sEnd; } $sFilters .= "\n" . '#sieve_filter:' . implode(';', array($oFilter->Enable ? '1' : '0', $oFilter->Condition, $oFilter->Field, $oFilter->Filter, $oFilter->Action, $sFolderFullName)) . "\n"; $sFilters .= $sCondition . "\n"; $sFilters .= $sAction . "\n"; $sFilters .= $sEnd . "\n"; } $sFilters = $sFilters . "\n" . '#end sieve filter' . "\n"; return $this->setFiltersRawData($oAccount, $sFilters); } return false; }