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

With outlook mail servers, the charset shouldn't be send with the imap_search #100

Closed
tkayfun opened this issue May 18, 2018 · 7 comments
Closed

Comments

@tkayfun
Copy link

tkayfun commented May 18, 2018

Hi Webklex,

Firstly, thanks for the great package!

I encountered some problems today with the package, which is actually an edge case..

With every mayor mail server besides Microsofts (outlook) imap servers, the charset shouldn't be send with the imap search. For some reason, if we send the default UTF-8 charset with the imap_search, every search criteria besides ALL doesn't work.. If I leave it blank, every search criteria works :)

For myself I added a check if it is a microsoft account (@outlook.com / @hotmail.com), than the charset shouldn't be given to the imap_search, otherwise I am using the UTF-8 charset. If I didn't do this, I couldn't use search criteria like UNSEEN, SEEN, etc :)

For myself I did something like this;

Define somewhere logical (for me I implemented in the Folder class) an CONST with common microsoft domains;

CONST MICROSOFT_DOMAINS = [
        'outlook.com',
        'hotmail.com'
];

In the searchMessages function;

I tried it with setting the $charset = NIL, but it really shouldn't be passed when doing an imap_search.

.........
$query = trim($query);

if(in_array(substr(strrchr($this->getClient()->username, "@"), 1), self::MICROSOFT_DOMAINS)) {
    $availableMessages = imap_search($this->getClient()->getConnection(), $query, SE_UID);
} else {
    $availableMessages = imap_search($this->getClient()->getConnection(), $query, SE_UID, $charset);
}

.........

I'd like to hear from you, if you approve this approach I'll make a PR for you, otherwise I'd like to hear what your approach would be! 👍 :-)

@tkayfun tkayfun changed the title With outlook mail servers, the charset shouldn't be send with the search With outlook mail servers, the charset shouldn't be send with the imap_search May 18, 2018
@Webklex
Copy link
Owner

Webklex commented Jun 7, 2018

Hi @tayfunkayahan ,
the default $charset value is actually null according to the official php imap_search() documentation.

So setting $charset to NULL should perfectly work..

Folder::searchMessages(array $where, $fetch_options = null, $fetch_body = true, NULL);

I wouldn't like the idea to perform an unnecessary (unless I' using a microsoft domain) array lookup every time I call the search method. I think it's fair to implement the logic outside if necessary :)

Instead I would like to add it to the known issue section and link it to this issue as well as the future wiki.

If I'm wrong and the majority is actually using microsoft related email addresses the $charset parameter could also be set to null in a breaking version change (2.*). But I honestly doupt that this is the case :)

Best regards

@tkayfun
Copy link
Author

tkayfun commented Jun 10, 2018

Hi @Webklex,

Thanks for your response.

I know, the PHP documentation says that it is null. imap_search has actually $charset = NIL, but when I try to pass NULL it really doesn't work. But when I totally remove the variable and set nothing for the charset it is working like a charm. So when I keep the 4rd argument empty of imap_search it is working like a charm. This BTW only happens with microsoft domains 🤦‍♂️

Did you actually try it with a Microsoft domain? Because I also tried on different environments and created different new accounts. For now it's not a that huge of problem, but that's because I just kept the 4rd argument empty in searchMessages. Running PHP 7.1.7 BTW.

True that, an extra array lookup is actually unnecessary in the library itself but if this problem really occurs with everyone with a microsoft account than it would be handy, or maybe like you said put it somewhere in the known issues so people know about this :-)

UPDATE:
Even this piece of code doesn't work;
$availableMessages = imap_search($this->getClient()->getConnection(), $query, SE_UID, null);
Even if I hard code null as 4rd parameter in imap_search it doesn't work, so I guess it is a bug in the imap_search mechanism of PHP itself?

UPDATE 2:
It is actually a known issue; barbushin/php-imap#128

@Webklex
Copy link
Owner

Webklex commented Jul 22, 2018

@tayfunkayahan please update to the latest version. You can now set the charset to null. If however the charset is null it won't be set anymore:

if($this->getCharset() === null){
    $available_messages = imap_search($this->getClient()->getConnection(), $this->getRawQuery(), SE_UID);
}else{
    $available_messages = imap_search($this->getClient()->getConnection(), $this->getRawQuery(), SE_UID, $this->getCharset());
}

@Webklex Webklex closed this as completed Jul 22, 2018
@tkayfun
Copy link
Author

tkayfun commented Jul 22, 2018

@Webklex thnx for the update! should work perfectly now!

@freescout-helpdesk
Copy link
Contributor

We are using the following code:

$folder = $client->getFolder('INBOX');
$folder->query()->unseen()->leaveUnread()->get();

The following error uccurs when trying to fetch messages from outlook.office365.com server:
[BADCHARSET (US-ASCII)] The specified charset is not supported.

It looks like we need somehow to set charset to null when executing the query. Is it possible?

@freescout-helpdesk
Copy link
Contributor

Here is the solution: freescout-help-desk/freescout#176 (comment)

@Webklex
Copy link
Owner

Webklex commented Mar 15, 2019

Hi @freescout-helpdesk ,
yes it is posiible:

/** @var \Webklex\IMAP\Folder $folder */
/** @var \Webklex\IMAP\Message $message */
$message = $folder->query(null)->get()->first();

Folder::query() Folder::search() Folder::messages() can be parsed a desired charset. UTF-8 ist the default. However by setting it to null, the charset wont be set on imap_search() and therefor prevent this error.

Best regards

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

No branches or pull requests

3 participants