Skip to content

"Empty response" when calling getFolders() on Webklex\PHPIMAP\Client instance #393

@schmidt-travixmedia

Description

@schmidt-travixmedia

Describe the bug
Since we updated PHP-IMAP to version ~5 in a project, we get an error message when calling getFolders() method on a Webklex\PHPIMAP\Client instance.
Before version 5 of PHP-IMAP (4.0, 4.1), everything worked fine.
Temporary solution is to give the 'hierarchical' parameter value = false: ->getFolders($hierarchical = false)
As I don't know if there may occur any side effects in later mail handling (e.g. move/delete messages), I create this bug report.

Infos from a similar bug report #362 did not help.

Used config
I'm using https://oauth2-client.thephpleague.com/
with Microsoft Provider
https://github.com/stevenmaguire/oauth2-microsoft
in order to be able to use "OAuth2 client credentials flow" (see https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow )

Code to Reproduce
Following 2 (simplified) functions are located in a example class 'MyClass':

 private function getAccessToken(): \League\OAuth2\Client\Token\AccessTokenInterface { $microsoftLoginHost = 'https://login.microsoftonline.com'; $microsoftRessource = 'https://outlook.office.com'; $azureTenantId = $this->getAzureTenantId(); $azureClientId = $this->getAzureClientId(); $azureClientSecret = $this->getAzureClientSecret(); $provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([ // required 'clientId' => $azureClientId, 'clientSecret' => $azureClientSecret, // optional 'urlAuthorize' => $microsoftLoginHost . '/' . $azureTenantId . '/oauth2/v2.0/authorize', 'urlAccessToken' => $microsoftLoginHost . '/' . $azureTenantId . '/oauth2/v2.0/token', 'urlResourceOwnerDetails' => $microsoftRessource . '/api/v1.0/me', 'defaultScopes' => 'openid profile email offline_access ' . $microsoftRessource . '/IMAP.AccessAsUser.All ' . $microsoftRessource . '/User.Read', ]); // Access via client credentials flow: See https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow $token = $provider->getAccessToken('client_credentials', [ 'scope' => 'https://outlook.office365.com/.default', ]); if (!$token) { throw new Exception('Error: Could not get a token.'); } /** @var \League\OAuth2\Client\Token\AccessTokenInterface $token */ return $token; } public function getPhpImapClient(): \Webklex\PHPIMAP\Client { $options = [ 'options' => [ 'soft_fail' => false, 'rfc822' => true, 'debug' => true, ], ]; $cm = new \Webklex\PHPIMAP\ClientManager($options); $client = $cm->make([ 'host' => 'outlook.office365.com', 'port' => '993', 'encryption' => 'ssl', 'validate_cert' => false, 'username' => $this->getOutlook365AccountName(), 'password' => $this->getAccessToken(), 'protocol' => 'imap', 'authentication' => "oauth", ]); $client->connect(); return $client; } 
try { $myObj = new MyClass(); $phpImapClient = $myObj->getPhpImapClient(); if ($phpImapClient->isConnected()) { echo "Status: Connected.\r\r"; // $folders = $phpImapClient->getFolders(); // -> Exception $folders = $phpImapClient->getFolders($hierarchical = false); // Temporary solution echo "Mailboxes:\r\r"; /** @var Folder $folder */ foreach ($folders as $folder) { echo '- ' . $folder->name . "\r"; } $phpImapClient->disconnect(); } else { echo "Status: Not connected.\r"; } } catch (Exception $exception) { if (isset($phpImapClient) && $phpImapClient instanceof Client) { $phpImapClient->disconnect(); } } 

Expected behavior
IMAP folders should be echo'ed:

Status: Connected. Mailboxes: - Archiv - Aufgaben - Entwürfe - Gelöschte Elemente - Gesendete Elemente - Junk-E-Mail - Kalender - Kontakte - Notizen - a_folder - another_folder - Postausgang - INBOX - Verlauf der Unterhaltung 

Actual behavior
Real token values replaced by xxxxxxxxxxx...

<< * OK The Microsoft Exchange IMAP4 service is ready. [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==] >> TAG1 AUTHENTICATE XOAUTH2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx= << TAG1 OK AUTHENTICATE completed. Status: Connected. >> TAG2 LIST "" "%" << * LIST (\HasNoChildren) "/" Archiv << * LIST (\HasNoChildren) "/" Aufgaben << * LIST (\HasNoChildren \Drafts) "/" Entw&APw-rfe << * LIST (\HasNoChildren \Trash) "/" "Gel&APY-schte Elemente" << * LIST (\HasNoChildren \Sent) "/" "Gesendete Elemente" << * LIST (\HasNoChildren \Junk) "/" Junk-E-Mail << * LIST (\HasNoChildren) "/" Kalender << * LIST (\HasChildren) "/" Kontakte << * LIST (\HasNoChildren) "/" Notizen << * LIST (\HasNoChildren) "/" a_folder << * LIST (\HasNoChildren) "/" another_folder << * LIST (\HasNoChildren) "/" Postausgang << * LIST (\Marked \HasNoChildren) "/" INBOX << * LIST (\HasChildren) "/" "Verlauf der Unterhaltung" << TAG2 OK LIST completed. >> TAG3 LIST "" "Kontakte/%%" << TAG3 OK LIST completed. >> TAG4 LOGOUT << * BYE Microsoft Exchange Server IMAP4 server signing off. << TAG4 OK LOGOUT completed. Error occurred Causes: - Empty response Commands send: TAG3 LIST "" "Kontakte/%%"\r\n Responses received: TAG3 OK LIST completed.\r\n Error occurred 

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions