|
22 | 22 | use Webklex\PHPIMAP\Support\FlagCollection;
|
23 | 23 | use Webklex\PHPIMAP\Support\Masks\MessageMask;
|
24 | 24 | use Illuminate\Support\Str;
|
| 25 | +use Webklex\PHPIMAP\Support\MessageCollection; |
25 | 26 | use Webklex\PHPIMAP\Traits\HasEvents;
|
26 | 27 |
|
27 | 28 | /**
|
@@ -634,6 +635,63 @@ public function getFolder(){
|
634 | 635 | return $this->client->getFolder($this->folder_path);
|
635 | 636 | }
|
636 | 637 |
|
| 638 | + /** |
| 639 | + * Create a message thread based on the current message |
| 640 | + * @param Folder|null $sent_folder |
| 641 | + * @param MessageCollection|null $thread |
| 642 | + * @param Folder|null $folder |
| 643 | + * |
| 644 | + * @return MessageCollection|null |
| 645 | + * @throws Exceptions\ConnectionFailedException |
| 646 | + * @throws Exceptions\FolderFetchingException |
| 647 | + * @throws Exceptions\GetMessagesFailedException |
| 648 | + */ |
| 649 | + public function thread($sent_folder = null, &$thread = null, $folder = null){ |
| 650 | + $thread = $thread ? $thread : MessageCollection::make([]); |
| 651 | + $folder = $folder ? $folder : $this->getFolder(); |
| 652 | + $sent_folder = $sent_folder ? $sent_folder : $this->client->getFolder(ClientManager::get("options.common_folders.sent", "INBOX/Sent")); |
| 653 | + |
| 654 | + /** @var Message $message */ |
| 655 | + foreach($thread as $message) { |
| 656 | + if ($message->message_id == $this->message_id) { |
| 657 | + return $thread; |
| 658 | + } |
| 659 | + } |
| 660 | + $thread->push($this); |
| 661 | + |
| 662 | + $folder->query()->inReplyTo($this->message_id) |
| 663 | + ->setFetchBody($this->getFetchBodyOption()) |
| 664 | + ->leaveUnread()->get()->each(function($message) use(&$thread, $folder, $sent_folder){ |
| 665 | + /** @var Message $message */ |
| 666 | + $message->thread($sent_folder, $thread, $folder); |
| 667 | + }); |
| 668 | + $sent_folder->query()->inReplyTo($this->message_id) |
| 669 | + ->setFetchBody($this->getFetchBodyOption()) |
| 670 | + ->leaveUnread()->get()->each(function($message) use(&$thread, $folder, $sent_folder){ |
| 671 | + /** @var Message $message */ |
| 672 | + $message->thread($sent_folder, $thread, $folder); |
| 673 | + }); |
| 674 | + |
| 675 | + if (is_array($this->in_reply_to)) { |
| 676 | + foreach($this->in_reply_to as $in_reply_to) { |
| 677 | + $folder->query()->messageId($in_reply_to) |
| 678 | + ->setFetchBody($this->getFetchBodyOption()) |
| 679 | + ->leaveUnread()->get()->each(function($message) use(&$thread, $folder, $sent_folder){ |
| 680 | + /** @var Message $message */ |
| 681 | + $message->thread($sent_folder, $thread, $folder); |
| 682 | + }); |
| 683 | + $sent_folder->query()->messageId($in_reply_to) |
| 684 | + ->setFetchBody($this->getFetchBodyOption()) |
| 685 | + ->leaveUnread()->get()->each(function($message) use(&$thread, $folder, $sent_folder){ |
| 686 | + /** @var Message $message */ |
| 687 | + $message->thread($sent_folder, $thread, $folder); |
| 688 | + }); |
| 689 | + } |
| 690 | + } |
| 691 | + |
| 692 | + return $thread; |
| 693 | + } |
| 694 | + |
637 | 695 | /**
|
638 | 696 | * Copy the current Messages to a mailbox
|
639 | 697 | * @param string $folder_path
|
|
0 commit comments