?? maildir.php
字號:
<?php/** * Zend Framework * * LICENSE * * This source file is subject to version 1.0 of the Zend Framework * license, that is bundled with this package in the file LICENSE.txt, and * is available through the world-wide-web at the following URL: * http://framework.zend.com/license/new-bsd. If you did not receive * a copy of the Zend Framework license and are unable to obtain it * through the world-wide-web, please send a note to license@zend.com * so we can mail you a copy immediately. * * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id: Maildir.php 8064 2008-02-16 10:58:39Z thomas $ *//** * @see Zend_Mail_Storage_Folder_Maildir */require_once 'Zend/Mail/Storage/Folder/Maildir.php';/** * @see Zend_Mail_Storage_Writable_Interface */require_once 'Zend/Mail/Storage/Writable/Interface.php';/** * @category Zend * @package Zend_Mail * @subpackage Storage * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */class Zend_Mail_Storage_Writable_Maildir extends Zend_Mail_Storage_Folder_Maildir implements Zend_Mail_Storage_Writable_Interface{ /** * use quota and size of quota if given * @var bool|int */ protected $_quota; /** * create a new folder * * This method also creates parent folders if necessary. Some mail storages may restrict, which folder * may be used as parent or which chars may be used in the folder name * * @param string $name global name of folder, local name if $parentFolder is set * @param string|Zend_Mail_Storage_Folder $parentFolder parent folder for new folder, else root folder is parent * @return string only used internally (new created maildir) * @throws Zend_Mail_Storage_Exception */ public function createFolder($name, $parentFolder = null) { if ($parentFolder instanceof Zend_Mail_Storage_Folder) { $folder = $parentFolder->getGlobalName() . $this->_delim . $name; } else if ($parentFolder != null) { $folder = rtrim($parentFolder, $this->_delim) . $this->_delim . $name; } else { $folder = $name; } $folder = trim($folder, $this->_delim); // first we check if we try to create a folder that does exist $exists = null; try { $exists = $this->getFolders($folder); } catch (Zend_Mail_Exception $e) { // ok } if ($exists) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('folder already exists'); } if (strpos($folder, $this->_delim . $this->_delim) !== false) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('invalid name - folder parts may not be empty'); } if (strpos($folder, 'INBOX' . $this->_delim) === 0) { $folder = substr($folder, 6); } $fulldir = $this->_rootdir . '.' . $folder; // check if we got tricked and would create a dir outside of the rootdir or not as direct child if (strpos($folder, DIRECTORY_SEPARATOR) !== false || strpos($folder, '/') !== false || dirname($fulldir) . DIRECTORY_SEPARATOR != $this->_rootdir) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('invalid name - no directory seprator allowed in folder name'); } // has a parent folder? $parent = null; if (strpos($folder, $this->_delim)) { // let's see if the parent folder exists $parent = substr($folder, 0, strrpos($folder, $this->_delim)); try { $this->getFolders($parent); } catch (Zend_Mail_Exception $e) { // does not - create parent folder $this->createFolder($parent); } } if (!@mkdir($fulldir) || !@mkdir($fulldir . DIRECTORY_SEPARATOR . 'cur')) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('error while creating new folder, may be created incompletly'); } mkdir($fulldir . DIRECTORY_SEPARATOR . 'new'); mkdir($fulldir . DIRECTORY_SEPARATOR . 'tmp'); $localName = $parent ? substr($folder, strlen($parent) + 1) : $folder; $this->getFolders($parent)->$localName = new Zend_Mail_Storage_Folder($localName, $folder, true); return $fulldir; } /** * remove a folder * * @param string|Zend_Mail_Storage_Folder $name name or instance of folder * @return null * @throws Zend_Mail_Storage_Exception */ public function removeFolder($name) { // TODO: This could fail in the middle of the task, which is not optimal. // But there is no defined standard way to mark a folder as removed and there is no atomar fs-op // to remove a directory. Also moving the folder to a/the trash folder is not possible, as // all parent folders must be created. What we could do is add a dash to the front of the // directory name and it should be ignored as long as other processes obey the standard. if ($name instanceof Zend_Mail_Storage_Folder) { $name = $name->getGlobalName(); } $name = trim($name, $this->_delim); if (strpos($name, 'INBOX' . $this->_delim) === 0) { $name = substr($name, 6); } // check if folder exists and has no children if (!$this->getFolders($name)->isLeaf()) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('delete children first'); } if ($name == 'INBOX' || $name == DIRECTORY_SEPARATOR || $name == '/') { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('wont delete INBOX'); } if ($name == $this->getCurrentFolder()) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('wont delete selected folder'); } foreach (array('tmp', 'new', 'cur', '.') as $subdir) { $dir = $this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . $subdir; if (!file_exists($dir)) { continue; } $dh = opendir($dir); if (!$dh) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception("error opening $subdir"); } while (($entry = readdir($dh)) !== false) { if ($entry == '.' || $entry == '..') { continue; } if (!unlink($dir . DIRECTORY_SEPARATOR . $entry)) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception("error cleaning $subdir"); } } closedir($dh); if ($subdir !== '.') { if (!rmdir($dir)) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception("error removing $subdir"); } } } if (!rmdir($this->_rootdir . '.' . $name)) { // at least we should try to make it a valid maildir again mkdir($this->_rootdir . '.' . $name . DIRECTORY_SEPARATOR . 'cur'); /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception("error removing maindir"); } $parent = strpos($name, $this->_delim) ? substr($name, 0, strrpos($name, $this->_delim)) : null; $localName = $parent ? substr($name, strlen($parent) + 1) : $name; unset($this->getFolders($parent)->$localName); } /** * rename and/or move folder * * The new name has the same restrictions as in createFolder() * * @param string|Zend_Mail_Storage_Folder $oldName name or instance of folder * @param string $newName new global name of folder * @return null * @throws Zend_Mail_Storage_Exception */ public function renameFolder($oldName, $newName) { // TODO: This is also not atomar and has similar problems as removeFolder() if ($oldName instanceof Zend_Mail_Storage_Folder) { $oldName = $oldName->getGlobalName(); } $oldName = trim($oldName, $this->_delim); if (strpos($oldName, 'INBOX' . $this->_delim) === 0) { $oldName = substr($oldName, 6); } $newName = trim($newName, $this->_delim); if (strpos($newName, 'INBOX' . $this->_delim) === 0) { $newName = substr($newName, 6); } if (strpos($newName, $oldName . $this->_delim) === 0) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('new folder cannot be a child of old folder'); } // check if folder exists and has no children $folder = $this->getFolders($oldName); if ($oldName == 'INBOX' || $oldName == DIRECTORY_SEPARATOR || $oldName == '/') { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('wont rename INBOX'); } if ($oldName == $this->getCurrentFolder()) { /** * @see Zend_Mail_Storage_Exception */ require_once 'Zend/Mail/Storage/Exception.php'; throw new Zend_Mail_Storage_Exception('wont rename selected folder'); } $newdir = $this->createFolder($newName); if (!$folder->isLeaf()) { foreach ($folder as $k => $v) { $this->renameFolder($v->getGlobalName(), $newName . $this->_delim . $k); } }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -