PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 10.2.2
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v10.2.2
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 / back / Libraries / Imap2 / Message.php

Message.php in AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress 10.2.2, at back/Libraries/Imap2/Message.php

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