PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.1.4
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.1.4
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
acymailing / vendor / javanile / php-imap2 / src / Message.php

Message.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.1.4, at vendor/javanile/php-imap2/src/Message.php

477 lines 14.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3
4 namespace Javanile\Imap2;
5
6 class Message
7 {
8 public static function search($imap, $criteria, $flags = SE_FREE, $charset = "")
9 {
10 if (!is_a($imap, Connection::class)) {
11 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
12 }
13
14 $client = $imap->getClient();
15 #$client->setDebug(true);
16
17 $result = $client->search($imap->getMailboxName(), $criteria, $flags & SE_UID);
18
19 if (empty($result->count())) {
20 return false;
21 }
22
23 $messages = $result->get();
24 foreach ($messages as &$message) {
25 $message = is_numeric($message) ? intval($message) : $message;
26 }
27
28 return $messages;
29 }
30
31 public static function sort($imap, $criteria, $reverse, $flags = 0, $searchCriteria = null, $charset = null)
32 {
33 if (is_a($imap, Connection::class)) {
34 $client = $imap->getClient();
35 #$client->setDebug(true);
36
37 $result = $client->search($imap->getMailboxName(), $criteria, $flags & SE_UID);
38
39 if (empty($result->count())) {
40 return false;
41 }
42
43 $messages = $result->get();
44 foreach ($messages as &$message) {
45 $message = is_numeric($message) ? intval($message) : $message;
46 }
47
48 return $messages;
49 }
50
51 return imap_sort($imap, $criteria, $reverse, $flags, $searchCriteria, $charset);
52 }
53
54 public static function headerInfo($imap, $messageNum, $fromLength = 0, $subjectLength = 0, $defaultHost = null)
55 {
56 if (!is_a($imap, Connection::class)) {
57 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
58 }
59
60 $client = $imap->getClient();
61 #$client->setDebug(true);
62
63 $messages = $client->fetch($imap->getMailboxName(), $messageNum, false, [
64 'BODY.PEEK[HEADER.FIELDS (SUBJECT FROM TO CC REPLY-TO DATE SIZE REFERENCES)]',
65 'ENVELOPE',
66 'INTERNALDATE',
67 'UID',
68 'FLAGS',
69 'RFC822.SIZE',
70 'RFC822.HEADER'
71 ]);
72
73 if (empty($messages)) {
74 return false;
75 }
76
77 foreach ($messages as $message) {
78 return HeaderInfo::fromMessage($message, $defaultHost);
79 }
80 }
81
82 public static function headers($imap)
83 {
84 if (!is_a($imap, Connection::class)) {
85 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
86 }
87
88 $client = $imap->getClient();
89 #$client->setDebug(true);
90
91 $status = $client->status($imap->getMailboxName(), ['MESSAGES']);
92 if (empty($status['MESSAGES'])) {
93 return [];
94 }
95
96 $sequence = '1:'.intval($status['MESSAGES']);
97 $messages = $client->fetch($imap->getMailboxName(), $sequence, false, [
98 'BODY.PEEK[HEADER.FIELDS (SUBJECT FROM TO CC REPLYTO MESSAGEID DATE SIZE REFERENCES)]',
99 #'UID',
100 'FLAGS',
101 'INTERNALDATE',
102 'RFC822.SIZE',
103 #'ENVELOPE',
104 'RFC822.HEADER'
105 ]);
106
107 if (empty($messages)) {
108 return [];
109 }
110
111 $headers = [];
112 foreach ($messages as $message) {
113 $from = ' ';
114 if ($message->from != 'no_host') {
115 $from = imap_rfc822_parse_adrlist($message->from, 'no_host');
116 $from = isset($from[0]->personal) ? $from[0]->personal : $message->from;
117 }
118
119 $date = explode(' ', $message->internaldate);
120 $subject = empty($message->subject) ? ' ' : $message->subject;
121 $unseen = empty($message->flags['SEEN']) ? 'U' : ' ';
122 $flagged = empty($message->flags['FLAGGED']) ? ' ' : 'F';
123 $answered = empty($message->flags['ANSWERED']) ? ' ' : 'A';
124 $draft = empty($message->flags['DRAFT']) ? ' ' : 'D';
125 $deleted = empty($message->flags['DELETED']) ? ' ' : 'X';
126
127 $header = ' ' . $unseen . $flagged . $answered . $draft . $deleted . ' '
128 . str_pad($message->id, 3, ' ', STR_PAD_LEFT) . ')' . $date[0] .' ' . str_pad($from, 20, ' ') . ' '
129 . substr($subject, 0, 25) . ' (' . $message->size . ' chars)';
130
131 $headers[] = $header;
132 }
133
134 return $headers;
135 }
136
137 public static function body($imap, $messageNum, $flags = 0)
138 {
139 if (!is_a($imap, Connection::class)) {
140 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
141 }
142
143 $client = $imap->getClient();
144 #$client->setDebug(true);
145
146 $isUid = boolval($flags & FT_UID);
147
148 $messages = $client->fetch($imap->getMailboxName(), $messageNum, $isUid, ['BODY[TEXT]']);
149
150 return $messages[$messageNum]->bodypart['TEXT'];
151 }
152
153 public static function fetchBody($imap, $messageNum, $section, $flags = 0)
154 {
155 if (!is_a($imap, Connection::class)) {
156 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
157 }
158
159 $client = $imap->getClient();
160 #$client->setDebug(true);
161
162 $isUid = boolval($flags & FT_UID);
163 $messages = $client->fetch($imap->getMailboxName(), $messageNum, $isUid, ['BODY['.$section.']']);
164
165 if (empty($messages)) {
166 trigger_error(Errors::badMessageNumber(debug_backtrace(), 1), E_USER_WARNING);
167
168 return false;
169 }
170
171 if ($section) {
172 return $messages[$messageNum]->bodypart[$section];
173 }
174
175 return $messages[$messageNum]->body;
176 }
177
178 public static function fetchMime($imap, $messageNum, $section, $flags = 0)
179 {
180 if (!is_a($imap, Connection::class)) {
181 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
182 }
183
184 if ($messageNum <= 0) {
185 trigger_error(Errors::badMessageNumber(debug_backtrace(), 1), E_USER_WARNING);
186
187 return false;
188 }
189
190 $client = $imap->getClient();
191 #$client->setDebug(true);
192
193 $isUid = boolval($flags & FT_UID);
194
195 $sectionKey = $section.'.MIME';
196 $messages = $client->fetch($imap->getMailboxName(), $messageNum, $isUid, ['BODY['.$sectionKey.']']);
197
198 if (empty($messages)) {
199 return "";
200 }
201
202 if ($section && isset($messages[$messageNum]->bodypart[$sectionKey])) {
203 return $messages[$messageNum]->bodypart[$sectionKey];
204 }
205
206 return $messages[$messageNum]->body;
207 }
208
209 public static function saveBody($imap, $file, $messageNum, $section = "", $flags = 0)
210 {
211 if (is_a($imap, Connection::class)) {
212 $client = $imap->getClient();
213 #$client->setDebug(true);
214
215 $messages = $client->fetch($imap->getMailboxName(), $messageNum, false, ['BODY['.$section.']']);
216
217 $body = $section ? $messages[$messageNum]->bodypart[$section] : $messages[$messageNum]->body;
218
219 return file_put_contents($file, $body);
220 }
221
222 return imap_savebody($imap, $file, $messageNum, $section, $flags);
223 }
224
225 public static function fetchStructure($imap, $messageNum, $flags = 0)
226 {
227 if (!is_a($imap, Connection::class)) {
228 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
229 }
230
231 $client = $imap->getClient();
232 #$client->setDebug(true);
233
234 $isUid = boolval($flags & FT_UID);
235
236 $messages = $client->fetch($imap->getMailboxName(), $messageNum, $isUid, ['BODYSTRUCTURE']);
237
238 if (empty($messages)) {
239 return false;
240 }
241
242 foreach ($messages as $message) {
243 return BodyStructure::fromMessage($message);
244 }
245 }
246
247 public static function bodyStruct($imap, $messageNum, $flags = 0)
248 {
249 if (!is_a($imap, Connection::class)) {
250 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
251 }
252
253 $client = $imap->getClient();
254 #$client->setDebug(true);
255
256 $messages = $client->fetch($imap->getMailboxName(), $messageNum, false, ['BODY['.$section.']']);
257
258 if ($section) {
259 return $messages[$messageNum]->bodypart[$section];
260 }
261
262 return $messages[$messageNum]->body;
263 }
264
265 public static function fetchHeader($imap, $messageNum, $flags = 0)
266 {
267 if (!is_a($imap, Connection::class)) {
268 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
269 }
270
271
272 $client = $imap->getClient();
273 #$client->setDebug(true);
274
275 $isUid = boolval($flags & FT_UID);
276
277 $messages = $client->fetch($imap->getMailboxName(), $messageNum, $isUid, ['BODY[HEADER]']);
278
279 if (empty($messages)) {
280 return false;
281 }
282
283 foreach ($messages as $message) {
284 return $message->bodypart['HEADER'] ?? false;
285 }
286 }
287
288 public static function fetchOverview($imap, $sequence, $flags = 0)
289 {
290 if (!is_a($imap, Connection::class)) {
291 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
292 }
293
294 $client = $imap->getClient();
295 #$client->setDebug(true);
296
297 $messages = $client->fetch($imap->getMailboxName(), $sequence, false, [
298 'BODY[HEADER.FIELDS (SUBJECT FROM TO CC REPLYTO MESSAGEID DATE SIZE REFERENCES)]',
299 'UID',
300 'FLAGS',
301 'INTERNALDATE',
302 'RFC822.SIZE',
303 'ENVELOPE',
304 'RFC822.HEADER'
305 ]);
306
307 if ($sequence != '*' && count($messages) < Functions::expectedNumberOfMessages($sequence)) {
308 return [];
309 }
310
311 $overview = [];
312 foreach ($messages as $message) {
313 #var_dump($message);
314 #die();
315 $messageEntry = (object) [
316 'subject' => $message->envelope[1],
317 'from' => Functions::writeAddressFromEnvelope($message->envelope[2]),
318 'to' => $message->get('to'),
319 'date' => $message->envelope[0],
320 'message_id' => $message->envelope[9],
321 'references' => $message->references,
322 'in_reply_to' => $message->envelope[8],
323 'size' => $message->size,
324 'uid' => $message->uid,
325 'msgno' => $message->id,
326 'recent' => intval($message->flags['RECENT'] ?? 0),
327 'flagged' => intval($message->flags['FLAGGED'] ?? 0),
328 'answered' => intval($message->flags['ANSWERED'] ?? 0),
329 'deleted' => intval($message->flags['DELETED'] ?? 0),
330 'seen' => intval($message->flags['SEEN'] ?? 0),
331 'draft' => intval($message->flags['DRAFT'] ?? 0),
332 'udate' => strtotime($message->internaldate),
333 ];
334
335 if (empty($messageEntry->subject)) {
336 unset($messageEntry->subject);
337 }
338
339 if (empty($messageEntry->references)) {
340 unset($messageEntry->references);
341 }
342
343 if (empty($messageEntry->in_reply_to)) {
344 unset($messageEntry->in_reply_to);
345 }
346
347 if (empty($messageEntry->to)) {
348 unset($messageEntry->to);
349 }
350
351 $overview[] = $messageEntry;
352 }
353
354 return $overview;
355 }
356
357 public static function delete($imap, $messageNums, $flags = 0)
358 {
359 if (!is_a($imap, Connection::class)) {
360 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
361 }
362
363 $client = $imap->getClient();
364
365 $messages = $client->fetch($imap->getMailboxName(), $messageNums, false, ['UID']);
366
367 $uid = [];
368 foreach ($messages as $message) {
369 $uid[] = $message->uid;
370 }
371
372 $client->flag($imap->getMailboxName(), implode(',', $uid), $client->flags['DELETED']);
373
374 return true;
375 }
376
377 public static function undelete($imap, $messageNums, $flags = 0)
378 {
379 if (is_a($imap, Connection::class)) {
380 $client = $imap->getClient();
381 #$client->setDebug(true);
382
383 $messages = $client->fetch($imap->getMailboxName(), $messageNums, false, ['UID']);
384 foreach ($messages as $message) {
385 $client->unflag($imap->getMailboxName(), $message->uid, $client->flags['DELETED']);
386 }
387
388 return true;
389 }
390
391 return imap_undelete($imap, $messageNums, $flags);
392 }
393
394 public static function expunge($imap)
395 {
396 if (is_a($imap, Connection::class)) {
397 $client = $imap->getClient();
398
399 return $client->expunge($imap->getMailboxName());
400 }
401
402 return imap_expunge($imap);
403 }
404
405 public static function setFlagFull($imap, $sequence, $flag, $options = 0)
406 {
407 if (!is_a($imap, Connection::class)) {
408 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
409 }
410
411 $client = $imap->getClient();
412
413 if (!($options & ST_UID)) {
414 $messages = $client->fetch($imap->getMailboxName(), $sequence, false, ['UID']);
415
416 $uid = [];
417 foreach ($messages as $message) {
418 $uid[] = $message->uid;
419 }
420
421 $sequence = implode(',', $uid);
422 }
423
424 $client->flag($imap->getMailboxName(), $sequence, strtoupper(substr($flag, 1)));
425
426 return false;
427 }
428
429 public static function clearFlagFull($imap, $sequence, $flag, $options = 0)
430 {
431 if (!is_a($imap, Connection::class)) {
432 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
433 }
434
435 $client = $imap->getClient();
436
437 if (!($options & ST_UID)) {
438 $messages = $client->fetch($imap->getMailboxName(), $sequence, false, ['UID']);
439
440 $uid = [];
441 foreach ($messages as $message) {
442 $uid[] = $message->uid;
443 }
444
445 $sequence = implode(',', $uid);
446 }
447
448 $client->unflag($imap->getMailboxName(), $sequence, strtoupper(substr($flag, 1)));
449
450 return false;
451 }
452
453 public static function msgno($imap, $messageUid)
454 {
455 if (!is_a($imap, Connection::class)) {
456 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
457 }
458
459 $client = $imap->getClient();
460
461 $msgNo = ImapHelpers::uidToId($imap, $messageUid);
462
463 return is_numeric($msgNo) ? intval($msgNo) : $msgNo;
464 }
465
466 public static function uid($imap, $messageNum)
467 {
468 if (!is_a($imap, Connection::class)) {
469 return Errors::invalidImapConnection(debug_backtrace(), 1, false);
470 }
471
472 $uid = ImapHelpers::idToUid($imap, $messageNum);
473
474 return is_numeric($uid) ? intval($uid) : $uid;
475 }
476 }
477