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/Message.php';
30 :
31 :
32 :
33 :
34 : require_once 'Zend/Mail/Storage/Exception.php';
35 :
36 :
37 :
38 :
39 :
40 :
41 :
42 : class Zend_Mail_Storage_Maildir extends Zend_Mail_Storage_Abstract
43 : {
44 : private $_files = array();
45 : private static $_knownFlags = array('P' => 'Passed',
46 : 'R' => 'Replied',
47 : 'S' => 'Seen',
48 : 'T' => 'Trashed',
49 : 'D' => 'Draft',
50 : 'F' => 'Flagged');
51 :
52 :
53 :
54 :
55 :
56 :
57 :
58 :
59 :
60 : public function countMessages($flags = null)
61 : {
62 2 : return count($this->_files);
63 : }
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
72 : public function getSize($id = null)
73 : {
74 :
75 4 : if($id !== null) {
76 2 : if(!isset($this->_files[$id - 1])) {
77 1 : throw new Zend_Mail_Storage_Exception('id does not exist');
78 : }
79 1 : return filesize($this->_files[$id - 1]['filename']);
80 : }
81 :
82 2 : $result = array();
83 2 : foreach($this->_files as $num => $pos) {
84 2 : $result[$num + 1] = filesize($this->_files[$num]['filename']);
85 2 : }
86 :
87 2 : return $result;
88 : }
89 :
90 :
91 :
92 :
93 :
94 :
95 :
96 :
97 :
98 : public function getMessage($id)
99 : {
100 5 : return new Zend_Mail_Message(array('handler' => $this, 'id' => $id, 'headers' => $this->getRaw($id, 'header')));
101 : }
102 :
103 : public function getRaw($id, $part)
104 : {
105 5 : if(!isset($this->_files[$id - 1])) {
106 1 : throw new Zend_Mail_Storage_Exception('id does not exist');
107 : }
108 :
109 4 : $fh = fopen($this->_files[$id - 1]['filename'], 'r');
110 4 : $content = null;
111 :
112 :
113 : switch($part) {
114 4 : case 'header':
115 4 : $content = '';
116 4 : while (!feof($fh)) {
117 4 : $line = fgets($fh);
118 4 : if (!trim($line)) {
119 4 : break;
120 : }
121 4 : $content .= $line;
122 4 : }
123 4 : break;
124 1 : case 'content':
125 1 : $content = '';
126 1 : while (!feof($fh)) {
127 1 : $line = fgets($fh);
128 1 : if(!trim($line)) {
129 1 : break;
130 : }
131 1 : }
132 1 : $content = stream_get_contents($fh);
133 1 : break;
134 0 : default:
135 :
136 0 : }
137 :
138 4 : fclose($fh);
139 4 : if($content !== null) {
140 4 : return $content;
141 : }
142 :
143 :
144 0 : throw new Zend_Mail_Storage_Exception('part not found');
145 : }
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 : public function __construct($params)
156 : {
157 16 : if (!isset($params['dirname']) || !is_dir($params['dirname'])) {
158 1 : throw new Zend_Mail_Storage_Exception('no valid dirname given in params');
159 : }
160 :
161 15 : if(!$this->_isMaildir($params['dirname'])) {
162 1 : throw new Zend_Mail_Storage_Exception('invalid maildir given');
163 : }
164 :
165 14 : $this->_has['top'] = true;
166 14 : $this->_openMaildir($params['dirname']);
167 14 : }
168 :
169 :
170 :
171 :
172 :
173 :
174 :
175 : protected function _isMaildir($dirname)
176 : {
177 27 : return is_dir($dirname . '/cur');
178 : }
179 :
180 :
181 :
182 :
183 :
184 :
185 :
186 : protected function _openMaildir($dirname)
187 : {
188 26 : if($this->_files) {
189 5 : $this->close();
190 5 : }
191 :
192 26 : $dh = @opendir($dirname . '/cur/');
193 26 : if(!$dh) {
194 2 : throw new Zend_Mail_Storage_Exception('cannot open maildir');
195 : }
196 25 : while(($entry = readdir($dh)) !== false) {
197 25 : if($entry[0] == '.' || !is_file($dirname . '/cur/' . $entry)) {
198 25 : continue;
199 : }
200 25 : list($uniq, $info) = explode(':', $entry, 2);
201 25 : list($version, $flags) = explode(',', $info, 2);
202 25 : if($version != 2) {
203 0 : $flags = '';
204 0 : } else {
205 25 : $named_flags = array();
206 25 : $length = strlen($flags);
207 25 : for($i = 0; $i < $length; ++$i) {
208 25 : $flag = $flags[$i];
209 25 : $named_flags[$flag] = isset(self::$_knownFlags[$flag]) ? self::$_knownFlags[$flag] : '';
210 25 : }
211 : }
212 :
213 25 : $this->_files[] = array('uniq' => $uniq,
214 25 : 'flags' => $named_flags,
215 25 : 'filename' => $dirname . '/cur/' . $entry);
216 25 : }
217 25 : closedir($dh);
218 25 : }
219 :
220 :
221 :
222 :
223 :
224 :
225 :
226 :
227 : public function close()
228 : {
229 24 : $this->_files = array();
230 24 : }
231 :
232 :
233 :
234 :
235 :
236 :
237 :
238 : public function noop()
239 : {
240 1 : return true;
241 : }
242 :
243 :
244 :
245 :
246 :
247 : public function removeMessage($id)
248 : {
249 1 : throw new Zend_Mail_Storage_Exception('maildir is (currently) read-only');
250 : }
251 :
252 : }
253 :
|