예제 #1
0
파일: manager.php 프로젝트: Git-Host/email
 /**
  * @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;
 }