예제 #1
0
 /**
  * @param Array $messageIdUidSet
  * @param Folder $fromFolder
  * @param Folder $toFolder
  * @return bool
  */
 function MoveMessages(&$messageIdUidSet, &$fromFolder, &$toFolder)
 {
     $GLOBALS[MailDefaultCharset] = $this->_account->DefaultIncCharset;
     $GLOBALS[MailOutputCharset] = $this->_account->DefaultOutCharset;
     $messageIdSet = array_keys($messageIdUidSet);
     $messageUidSet = array_values($messageIdUidSet);
     if (!$this->DbStorage->Connect() || !$this->MailStorage->Connect()) {
         return false;
     }
     $result = true;
     switch ($this->_account->MailProtocol) {
         case MAILPROTOCOL_POP3:
         case MAILPROTOCOL_WMSERVER:
             switch ($fromFolder->SyncType) {
                 case FOLDERSYNC_DontSync:
                     return $this->DbStorage->MoveMessages($messageIdSet, false, $fromFolder, $toFolder);
                     break;
                 default:
                     $result = $this->DbStorage->SaveMessages($this->GetMessages($messageIdUidSet, $fromFolder), $toFolder);
                     if ($result) {
                         if ($result && $fromFolder->SyncType != FOLDERSYNC_DirectMode) {
                             $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                         } else {
                             $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                         }
                     }
                     return $result;
                     break;
             }
             break;
         case MAILPROTOCOL_IMAP4:
             switch ($fromFolder->SyncType) {
                 case FOLDERSYNC_DontSync:
                     switch ($toFolder->SyncType) {
                         case FOLDERSYNC_DontSync:
                             return $this->DbStorage->MoveMessages($messageIdSet, false, $fromFolder, $toFolder);
                         case FOLDERSYNC_AllEntireMessages:
                         case FOLDERSYNC_AllHeadersOnly:
                         case FOLDERSYNC_NewEntireMessages:
                         case FOLDERSYNC_NewHeadersOnly:
                             $result = $this->MailStorage->SaveMessages($this->GetMessages($messageIdUidSet, $fromFolder), $toFolder);
                             if ($result) {
                                 $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                                 $result &= $this->MailStorage->SynchronizeFolder($toFolder);
                             }
                             return $result;
                         case FOLDERSYNC_DirectMode:
                             $result = $this->MailStorage->SaveMessages($this->DbStorage->LoadMessages($messageIdSet, false, $fromFolder), $toFolder);
                             if ($result) {
                                 $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                             }
                             return $result;
                     }
                     break;
                 case FOLDERSYNC_AllEntireMessages:
                 case FOLDERSYNC_AllHeadersOnly:
                 case FOLDERSYNC_NewEntireMessages:
                 case FOLDERSYNC_NewHeadersOnly:
                     switch ($toFolder->SyncType) {
                         case FOLDERSYNC_DontSync:
                             $result = $this->DbStorage->SaveMessages($this->GetMessages($messageIdUidSet, $fromFolder), $toFolder);
                             if ($result) {
                                 $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                             }
                             return $result;
                         case FOLDERSYNC_AllEntireMessages:
                         case FOLDERSYNC_AllHeadersOnly:
                         case FOLDERSYNC_NewEntireMessages:
                         case FOLDERSYNC_NewHeadersOnly:
                             $result = $this->MailStorage->CopyMessages($messageUidSet, true, $fromFolder, $toFolder);
                             if ($result) {
                                 $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                                 $GLOBALS[MailDefaultCharset] = $this->_account->GetDefaultIncCharset();
                                 $GLOBALS[MailOutputCharset] = $this->_account->DbCharset;
                                 $result &= $this->MailStorage->SynchronizeFolder($toFolder);
                             }
                             return $result;
                         case FOLDERSYNC_DirectMode:
                             $result = $this->MailStorage->CopyMessages($messageUidSet, true, $fromFolder, $toFolder);
                             if ($result) {
                                 $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $fromFolder);
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                             }
                             return $result;
                     }
                     break;
                 case FOLDERSYNC_DirectMode:
                     switch ($toFolder->SyncType) {
                         case FOLDERSYNC_DontSync:
                             $result = $this->DbStorage->SaveMessages($this->GetMessages($messageIdUidSet, $fromFolder), $toFolder);
                             if ($result) {
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                             }
                             return $result;
                         case FOLDERSYNC_AllEntireMessages:
                         case FOLDERSYNC_AllHeadersOnly:
                         case FOLDERSYNC_NewEntireMessages:
                         case FOLDERSYNC_NewHeadersOnly:
                             $result = $this->MailStorage->CopyMessages($messageUidSet, true, $fromFolder, $toFolder);
                             if ($result) {
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                                 $GLOBALS[MailDefaultCharset] = $this->_account->GetDefaultIncCharset();
                                 $GLOBALS[MailOutputCharset] = $this->_account->DbCharset;
                                 $result &= $this->MailStorage->SynchronizeFolder($toFolder);
                             }
                             return $result;
                         case FOLDERSYNC_DirectMode:
                             $result = $this->MailStorage->CopyMessages($messageUidSet, true, $fromFolder, $toFolder);
                             if ($result) {
                                 $result &= $this->MailStorage->DeleteMessages($messageUidSet, true, $fromFolder);
                                 if ($this->MailStorage->PurgeUidFolder($fromFolder, $messageUidSet)) {
                                 } elseif (!$this->MailStorage->PurgeFolder($fromFolder)) {
                                     return false;
                                 }
                             }
                             return $result;
                     }
                     break;
             }
             if ($fromFolder->SyncType != FOLDERSYNC_DirectMode) {
                 if ($this->DbStorage->Connect()) {
                     $result &= $this->DbStorage->DeleteMessages($messageIndexSet, $indexAsUid, $fromFolder, $toFolder);
                 }
             }
             if ($fromFolder->SyncType != FOLDERSYNC_DontSync && $toFolder->SyncType != FOLDERSYNC_DontSync) {
                 if ($this->MailStorage->Connect()) {
                     $result &= $this->MailStorage->MoveMessages($messageIndexSet, $indexAsUid, $fromFolder, $toFolder);
                     $folders =& $this->GetFolders();
                     $result &= $this->Synchronize($folders);
                 }
             }
             break;
     }
     return $result;
 }
예제 #2
0
 /**
  * @param Array $messageIdUidSet
  * @param Folder $folder optional
  * @return bool
  */
 function DeleteMessages(&$messageIdUidSet, &$folder, $noMove = false)
 {
     ConvertUtils::SetLimits();
     $messageIdSet = array_keys($messageIdUidSet);
     $messageUidSet = array_values($messageIdUidSet);
     $settings =& Settings::CreateInstance();
     $result = true;
     switch ($this->_account->MailProtocol) {
         default:
             return false;
         case MAILPROTOCOL_POP3:
             if ($folder->Type == FOLDERTYPE_Trash || $noMove) {
                 if ($folder->SyncType != FOLDERSYNC_DirectMode) {
                     if ($this->DbStorage->Connect()) {
                         $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $folder);
                         $result &= $this->DbStorage->UpdateMailboxSize();
                     }
                 }
                 if ($this->_account->MailMode == MAILMODE_DeleteMessageWhenItsRemovedFromTrash || $this->_account->MailMode == MAILMODE_KeepMessagesOnServerAndDeleteMessageWhenItsRemovedFromTrash) {
                     $result &= $this->MailStorage->Connect() && $this->MailStorage->DeleteMessages($messageUidSet, true, $folder);
                 }
                 return $result;
             } else {
                 if ($folder->SyncType == FOLDERSYNC_DirectMode) {
                     return $result && $this->MailStorage->Connect() && $this->MailStorage->DeleteMessages($messageUidSet, true, $folder);
                 }
             }
             $folderList =& $this->GetFolders();
             $trashFolder =& $folderList->GetFolderByType(FOLDERTYPE_Trash);
             return $noMove ? true : $this->MoveMessages($messageIdUidSet, $folder, $trashFolder);
         case MAILPROTOCOL_WMSERVER:
             if ($folder->Type == FOLDERTYPE_Trash || $folder->Type == FOLDERTYPE_Spam || $noMove) {
                 if ($folder->SyncType != FOLDERSYNC_DirectMode) {
                     if ($this->DbStorage->Connect()) {
                         $result &= $this->DbStorage->DeleteMessages($messageIdSet, false, $folder);
                         $result &= $this->DbStorage->UpdateMailboxSize();
                     }
                 }
                 return $result && $this->MailStorage->Connect() && $this->MailStorage->DeleteMessages($messageUidSet, true, $folder);
             } else {
                 if ($folder->SyncType == FOLDERSYNC_DirectMode) {
                     return $result && $this->MailStorage->Connect() && $this->MailStorage->DeleteMessages($messageUidSet, true, $folder);
                 }
             }
             $folderList =& $this->GetFolders();
             $trashFolder =& $folderList->GetFolderByType(FOLDERTYPE_Trash);
             if (!$trashFolder) {
                 $trashFolder = new Folder($this->_account->Id, -1, FOLDERNAME_Trash, FOLDERNAME_Trash, FOLDERSYNC_AllHeadersOnly);
                 if (!$this->CreateFolder($trashFolder)) {
                     return false;
                 }
             }
             return $noMove ? true : $this->MoveMessages($messageIdUidSet, $folder, $trashFolder);
         case MAILPROTOCOL_IMAP4:
             //if ($settings->Imap4DeleteLikePop3 && $folder->SyncType != FOLDERSYNC_DirectMode)
             if ($settings->Imap4DeleteLikePop3) {
                 $trashFolder = null;
                 $folderList =& $this->GetFolders();
                 if ($folderList) {
                     $trashFolderType =& $folderList->GetFolderByType(FOLDERTYPE_Trash);
                     if (!$trashFolderType) {
                         $trashFolderName =& $folderList->GetFolderByName(FOLDERNAME_Trash);
                         if ($trashFolderName) {
                             $trashFolderName->Type = FOLDERTYPE_Trash;
                             $trashFolder = $trashFolderName;
                             if (USE_DB && $this->DbStorage->Connect()) {
                                 $result &= $this->DbStorage->UpdateFolder($trashFolderName);
                             }
                         } else {
                             $inboxFolderType =& $folderList->GetFolderByType(FOLDERTYPE_Inbox);
                             if ($inboxFolderType && $inboxFolderType->SubFolders && $inboxFolderType->SubFolders->Count() > 0) {
                                 $trashFolderName2 =& $inboxFolderType->SubFolders->GetFolderByName(FOLDERNAME_Trash);
                                 if ($trashFolderName2) {
                                     $trashFolderName2->Type = FOLDERTYPE_Trash;
                                     $trashFolder = $trashFolderName2;
                                     if (USE_DB && $this->DbStorage->Connect()) {
                                         $result &= $this->DbStorage->UpdateFolder($trashFolderName2);
                                     }
                                 }
                             }
                             if (!$trashFolder) {
                                 $trashFolder = new Folder($this->_account->Id, -1, FOLDERNAME_Trash, FOLDERNAME_Trash, FOLDERSYNC_DontSync);
                                 /*
                                 $trashFolder = new Folder($this->_account->Id, -1,
                                 	FOLDERNAME_Trash, FOLDERNAME_Trash, $this->_account->GetDefaultFolderSync($settings));
                                 */
                                 if (!$this->CreateFolder($trashFolder)) {
                                     $trashFolder = null;
                                 }
                             }
                         }
                     } else {
                         $trashFolder = $trashFolderType;
                     }
                     if ($trashFolder) {
                         if ($folder->Type == FOLDERTYPE_Trash || $noMove) {
                             $result = true;
                             $result &= $this->SetFlags($messageIdUidSet, $folder, MESSAGEFLAGS_Deleted, ACTION_Set);
                             $result &= $this->PurgeFolder($folder);
                             return $result;
                         }
                         return $noMove ? true : $this->MoveMessages($messageIdUidSet, $folder, $trashFolder);
                     }
                     return false;
                 }
             }
             return $this->SetFlags($messageIdUidSet, $folder, MESSAGEFLAGS_Deleted, ACTION_Set) && $this->PurgeFolder($folder);
     }
 }