1 : <?php
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 : require_once 'Zend/Mail/Storage/Abstract.php';
25 :
26 :
27 :
28 :
29 : require_once 'Zend/Mail/Transport/Imap.php';
30 :
31 :
32 :
33 :
34 : require_once 'Zend/Mail/Storage/Folder/Interface.php';
35 :
36 :
37 :
38 :
39 : require_once 'Zend/Mail/Storage/Folder.php';
40 :
41 :
42 :
43 :
44 : require_once 'Zend/Mail/Message.php';
45 :
46 :
47 :
48 :
49 : require_once 'Zend/Mail/Storage/Exception.php';
50 :
51 :
52 :
53 :
54 :
55 :
56 : class Zend_Mail_Storage_Imap extends Zend_Mail_Storage_Abstract implements Zend_Mail_Storage_Folder_Interface
57 : {
58 : private $_protocol;
59 : private $_currentFolder = '';
60 :
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 : public function countMessages($flags = null)
72 : {
73 3 : if(!$this->_currentFolder) {
74 1 : throw new Zend_Mail_Storage_Exception('No selected folder to count');
75 : }
76 2 : $result = $this->_protocol->examine($this->_currentFolder);
77 2 : return $result['exists'];
78 : }
79 :
80 :
81 :
82 :
83 :
84 :
85 :
86 : public function getSize($id = 0)
87 : {
88 3 : if($id) {
89 1 : return $this->_protocol->fetch('RFC822.SIZE', $id);
90 : }
91 2 : return $this->_protocol->fetch('RFC822.SIZE', 1, INF);
92 : }
93 :
94 :
95 :
96 :
97 :
98 :
99 :
100 :
101 : public function getMessage($id)
102 : {
103 4 : $header = $this->_protocol->fetch('RFC822.HEADER', $id);
104 4 : return new Zend_Mail_Message(array('handler' => $this, 'id' => $id, 'headers' => $header));
105 : }
106 :
107 : public function getRaw($id, $part)
108 : {
109 :
110 : switch($part) {
111 1 : case 'header':
112 0 : return $this->_protocol->fetch('RFC822.HEADER', $id);
113 : break;
114 1 : case 'content':
115 1 : return $this->_protocol->fetch('RFC822.TEXT', $id);
116 : break;
117 0 : default:
118 :
119 0 : }
120 :
121 :
122 0 : throw new Zend_Mail_Storage_Exception('part not found');
123 : }
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 : public function __construct($params)
141 : {
142 29 : if($params instanceof Zend_Mail_Transport_Imap) {
143 1 : $this->_protocol = $params;
144 : try {
145 1 : $this->selectFolder('INBOX');
146 1 : } catch(Zend_Mail_Storage_Exception $e) {
147 0 : throw Zend_Mail_Storage_Exception('cannot select INBOX, is this a valid transport?');
148 : }
149 1 : return;
150 : }
151 :
152 28 : if(!isset($params['user'])) {
153 1 : throw new Zend_Mail_Storage_Exception('need at least user in params');
154 : }
155 :
156 27 : $params['host'] = isset($params['host']) ? $params['host'] : 'localhost';
157 27 : $params['password'] = isset($params['password']) ? $params['password'] : '';
158 27 : $params['port'] = isset($params['port']) ? $params['port'] : null;
159 27 : $params['ssl'] = isset($params['ssl']) ? $params['ssl'] : false;
160 :
161 27 : $this->_protocol = new Zend_Mail_Transport_Imap();
162 27 : $this->_protocol->connect($params['host'], $params['port'], $params['ssl']);
163 24 : if(!$this->_protocol->login($params['user'], $params['password'])) {
164 1 : throw new Zend_Mail_Storage_Exception('cannot login, user or password wrong');
165 : }
166 23 : $this->selectFolder(isset($params['folder']) ? $params['folder'] : 'INBOX');
167 21 : }
168 :
169 :
170 :
171 :
172 :
173 :
174 : public function __destruct()
175 : {
176 22 : $this->close();
177 22 : }
178 :
179 :
180 :
181 :
182 :
183 :
184 :
185 : public function close()
186 : {
187 22 : $this->_currentFolder = '';
188 22 : $this->_protocol->logout();
189 22 : }
190 :
191 :
192 :
193 :
194 :
195 :
196 : public function noop()
197 : {
198 :
199 0 : return false;
200 :
201 : }
202 :
203 :
204 :
205 :
206 :
207 :
208 :
209 :
210 :
211 : public function removeMessage($id)
212 : {
213 :
214 0 : return false;
215 :
216 : }
217 :
218 :
219 :
220 :
221 :
222 :
223 :
224 :
225 : public function __get($var)
226 : {
227 1 : return parent::__get($var);
228 : }
229 :
230 :
231 :
232 :
233 :
234 :
235 :
236 : public function getFolders($rootFolder = null)
237 : {
238 4 : $folders = $this->_protocol->listMailbox((string)$rootFolder);
239 4 : if(!$folders) {
240 0 : throw new Zend_Mail_Storage_Exception('folder not found');
241 : }
242 :
243 4 : ksort($folders, SORT_STRING);
244 4 : $root = new Zend_Mail_Storage_Folder('/', '/', false);
245 4 : $stack = array(null);
246 4 : $folderStack = array(null);
247 4 : $parentFolder = $root;
248 4 : $parent = '';
249 :
250 4 : foreach($folders as $globalName => $data) {
251 : do {
252 4 : if(!$parent || strpos($globalName, $parent) === 0) {
253 4 : $pos = strrpos($globalName, $data['delim']);
254 4 : if($pos === false) {
255 4 : $localName = $globalName;
256 4 : } else {
257 4 : $localName = substr($globalName, $pos + 1);
258 : }
259 4 : $selectable = !$data['flags'] || !in_array('\\Noselect', $data['flags']);
260 :
261 4 : array_push($stack, $parent);
262 4 : $parent = $globalName . $data['delim'];
263 4 : $folder = new Zend_Mail_Storage_Folder($localName, $globalName, $selectable);
264 4 : $parentFolder->$localName = $folder;
265 4 : array_push($folderStack, $parentFolder);
266 4 : $parentFolder = $folder;
267 4 : break;
268 4 : } else if($stack) {
269 4 : $parent = array_pop($stack);
270 4 : $parentFolder = array_pop($folderStack);
271 4 : }
272 0 : } while($stack);
273 4 : if(!$stack) {
274 0 : throw new Zend_Mail_Storage_Exception('error while constructing folder tree');
275 : }
276 4 : }
277 :
278 4 : return $root;
279 : }
280 :
281 :
282 :
283 :
284 :
285 :
286 :
287 :
288 :
289 : public function selectFolder($globalName)
290 : {
291 24 : $this->_currentFolder = $globalName;
292 24 : if(!$this->_protocol->select($this->_currentFolder)) {
293 3 : $this->_currentFolder = '';
294 3 : throw new Zend_Mail_Storage_Exception('cannot change folder, maybe it does not exist');
295 : }
296 22 : }
297 :
298 :
299 :
300 :
301 :
302 :
303 :
304 :
305 : public function getCurrentFolder()
306 : {
307 1 : return $this->_currentFolder;
308 : }
309 : }
310 :
|