Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solution to display only subscribed Folders #539

Open
Kollos2k opened this issue Dec 17, 2024 · 0 comments
Open

Solution to display only subscribed Folders #539

Kollos2k opened this issue Dec 17, 2024 · 0 comments

Comments

@Kollos2k
Copy link

Kollos2k commented Dec 17, 2024

Hey there I want only to list subscribed Folders. I do this by manipulation of the Package but maybe you can add the code anywhere.

My solution is:

Goto ProtocolInterface.php and add after folders function:


    /**
     * Get a list of available subscribed folders
     * @param string $reference mailbox reference for list
     * @param string $folder mailbox / folder name match with wildcards
     *
     * @return Response containing mailboxes that matched $folder as array(globalName => array('delim' => .., 'flags' => ..))
     * @throws RuntimeException
     */    
    public function foldersSubscribed(string $reference = '', string $folder = '*'): Response;

after that goto: ImapProtocol.php and add after folders Function:

/**
     * Get a list of available subscribed folders
     *
     * @param string $reference mailbox reference for list
     * @param string $folder mailbox name match with wildcards
     *
     * @return Response folders that matched $folder as array(name => array('delimiter' => .., 'flags' => ..))
     *
     * @throws ImapBadRequestException
     * @throws ImapServerErrorException
     * @throws RuntimeException
     */
    public function foldersSubscribed(string $reference = '', string $folder = '*'): Response {
        $response = $this->requestAndResponse('LSUB', $this->escapeString($reference, $folder))->setCanBeEmpty(true);
        $list = $response->data();

        $result = [];
        if ($list[0] !== true) {
            foreach ($list as $item) {
                if (count($item) != 4 || $item[0] != 'LSUB') {
                    continue;
                }
                $item[3] = str_replace("\\\\", "\\", str_replace("\\\"", "\"", $item[3]));
                $result[$item[3]] = ['delimiter' => $item[2], 'flags' => $item[1]];
            }
        }

        return $response->setResult($result);
    }

finaly goto Client.php and add after getFolders function:

/**
     * Get folders list.
     * If hierarchical order is set to true, it will make a tree of folders, otherwise it will return flat array.
     *
     * @param boolean $hierarchical
     * @param string|null $parent_folder
     * @param bool $soft_fail If true, it will return an empty collection instead of throwing an exception
     *
     * @return FolderCollection
     * @throws AuthFailedException
     * @throws ConnectionFailedException
     * @throws FolderFetchingException
     * @throws ImapBadRequestException
     * @throws ImapServerErrorException
     * @throws ResponseException
     * @throws RuntimeException
     */
    public function getFoldersSubscribed(bool $hierarchical = true, string $parent_folder = null, bool $soft_fail = false): FolderCollection {
        $this->checkConnection();
        $folders = FolderCollection::make([]);

        $pattern = $parent_folder.($hierarchical ? '%' : '*');
        $sub = $this->connection->foldersSubscribed('', $pattern)->validatedData();
        $items = $this->connection->folders('', $pattern)->validatedData();

        if(!empty($items)){
            foreach ($items as $folder_name => $item) {
                if(!isset($sub[$folder_name]))continue;
                $folder = new Folder($this, $folder_name, $item["delimiter"], $item["flags"]);

                if ($hierarchical && $folder->hasChildren()) {
                    $pattern = $folder->full_name.$folder->delimiter.'%';

                    $children = $this->getFoldersSubscribed(true, $pattern, $soft_fail);
                    $folder->setChildren($children);
                }

                $folders->push($folder);
            }

            return $folders;
        }else if (!$soft_fail){
            throw new FolderFetchingException("failed to fetch any folders");
        }

        return $folders;
    }

From now on you can get the subscribed Folders by:

$cm = new ClientManager('YOUR OPTIONS ARRAY');
$client = $cm->make('YOUR CONNECTION ARRAY');
$client->getFoldersSubscribed();

Have a nice Day
Florian

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant