1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 : require_once 'Zend/Mail/Storage/Folder.php';
24 :
25 :
26 :
27 :
28 : require_once 'Zend/Mail/Storage/Folder/Interface.php';
29 :
30 :
31 :
32 :
33 : require_once 'Zend/Mail/Storage/Maildir.php';
34 :
35 :
36 :
37 :
38 :
39 :
40 : class Zend_Mail_Storage_Folder_Maildir extends Zend_Mail_Storage_Maildir implements Zend_Mail_Storage_Folder_Interface
41 : {
42 :
43 :
44 :
45 : protected $_rootFolder;
46 :
47 :
48 :
49 :
50 : protected $_rootdir;
51 :
52 :
53 :
54 :
55 : protected $_currentFolder;
56 :
57 :
58 :
59 :
60 : protected $_delim;
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
72 :
73 : public function __construct($params)
74 : {
75 14 : if(isset($params['dirname']) && !isset($params['rootdir'])) {
76 0 : $params['rootdir'] = $params['dirname'];
77 0 : }
78 :
79 14 : if(!isset($params['rootdir']) || !is_dir($params['rootdir'])) {
80 2 : throw new Zend_Mail_Storage_Exception('no valid rootdir given in params');
81 : }
82 :
83 12 : $this->_rootdir = rtrim($params['rootdir'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
84 :
85 12 : $this->_delim = isset($params['delim']) ? $params['delim'] : '.';
86 :
87 12 : $this->_buildFolderTree();
88 12 : $this->selectFolder(!empty($params['folder']) ? $params['folder'] : 'INBOX');
89 11 : $this->_has['top'] = true;
90 11 : }
91 :
92 :
93 :
94 :
95 :
96 :
97 :
98 :
99 : private function _buildFolderTree()
100 : {
101 12 : $this->_rootFolder = new Zend_Mail_Storage_Folder('/', '/', false);
102 12 : $this->_rootFolder->INBOX = new Zend_Mail_Storage_Folder('INBOX', 'INBOX', true);
103 :
104 12 : $dh = @opendir($this->_rootdir);
105 12 : if(!$dh) {
106 0 : throw new Zend_Mail_Storage_Exception("can't read folders in maildir");
107 : }
108 12 : $dirs = array();
109 12 : while(($entry = readdir($dh)) !== false) {
110 :
111 12 : if($entry[0] != '.' || $entry == '.' || $entry == '..') {
112 12 : continue;
113 : }
114 12 : if($this->_isMaildir($this->_rootdir . $entry)) {
115 12 : $dirs[] = $entry;
116 12 : }
117 12 : }
118 12 : closedir($dh);
119 :
120 12 : sort($dirs);
121 12 : $stack = array(null);
122 12 : $folderStack = array(null);
123 12 : $parentFolder = $this->_rootFolder;
124 12 : $parent = '.';
125 :
126 12 : foreach($dirs as $dir) {
127 : do {
128 12 : if(strpos($dir, $parent) === 0) {
129 12 : $local = substr($dir, strlen($parent));
130 12 : if(strpos($local, $this->_delim) !== false) {
131 0 : throw new Zend_Mail_Storage_Exception('error while reading maildir');
132 : }
133 12 : array_push($stack, $parent);
134 12 : $parent = $dir . $this->_delim;
135 12 : $folder = new Zend_Mail_Storage_Folder($local, substr($dir, 1), true);
136 12 : $parentFolder->$local = $folder;
137 12 : array_push($folderStack, $parentFolder);
138 12 : $parentFolder = $folder;
139 12 : break;
140 0 : } else if($stack) {
141 0 : $parent = array_pop($stack);
142 0 : $parentFolder = array_pop($folderStack);
143 0 : }
144 0 : } while($stack);
145 12 : if(!$stack) {
146 0 : throw new Zend_Mail_Storage_Exception('error while reading maildir');
147 : }
148 12 : }
149 12 : }
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 : public function getFolders($rootFolder = null)
158 : {
159 7 : if(!$rootFolder) {
160 5 : return $this->_rootFolder;
161 : }
162 :
163 :
164 2 : if(strpos($rootFolder, 'INBOX') === 0) {
165 0 : $rootFolder = substr($rootFolder, 6);
166 0 : }
167 2 : $currentFolder = $this->_rootFolder;
168 2 : $subname = trim($rootFolder, $this->_delim);
169 2 : while($currentFolder) {
170 2 : @list($entry, $subname) = @explode($this->_delim, $subname, 2);
171 2 : $currentFolder = $currentFolder->$entry;
172 0 : if(!$subname) {
173 0 : break;
174 : }
175 0 : }
176 :
177 0 : if($currentFolder->getGlobalName() != rtrim($rootFolder, $this->_delim)) {
178 0 : throw new Zend_Mail_Storage_Exception("folder $rootFolder not found");
179 : }
180 0 : return $currentFolder;
181 : }
182 :
183 :
184 :
185 :
186 :
187 :
188 :
189 :
190 :
191 : public function selectFolder($globalName)
192 : {
193 :
194 12 : $this->_currentFolder = (string)$globalName;
195 :
196 12 : if(strpos($this->_currentFolder, 'INBOX') === 0) {
197 11 : $this->_currentFolder = substr($this->_currentFolder, 6);
198 11 : }
199 : try {
200 12 : $this->_openMaildir($this->_currentFolder ? $this->_rootdir . '.' . $this->_currentFolder : $this->_rootdir);
201 12 : } catch(Zend_Mail_Storage_Exception $e) {
202 :
203 :
204 2 : if(!$this->getFolders($this->_currentFolder)->isSelectable()) {
205 0 : throw new Zend_Mail_Storage_Exception("{$this->_currentFolder} is not selectable");
206 : }
207 :
208 0 : $this->_buildFolderTree($this->_rootdir);
209 0 : throw new Zend_Mail_Storage_Exception('seems like the mbox file has vanished, I\'ve rebuild the ' .
210 0 : 'folder tree, search for an other folder and try again');
211 : }
212 11 : }
213 :
214 :
215 :
216 :
217 :
218 :
219 :
220 : public function getCurrentFolder()
221 : {
222 1 : return $this->_currentFolder;
223 : }
224 : }
225 :
|