Search code examples
phpexchange-serverwebdavurl-encoding

MSExchange URL encoding


I am writing a PHP service to query an Exchange server via WebDAV. This service has been live for roughly a month with no issues, but experienced a hiccup today when an email with the following subject line arrived in the mailbox:

FW: Daily Approval Report: Vendor/Master 007297

The message is stored in the file "FW: Daily Approval Report: Vendor/Master 007297.EML" and is referenced through a url as:

FW:%20Daily%20Approval%20Report:%20Vendor_xF8FF_Master%20007297.EML

I had been using the PHP rawurlencode() function to translate the message filename to its URL counterpart, but in this case rawurlencode() returns a mismatched string:

FW%3A%20Daily%20Approval%20Report%3A%20Vendor%2FMaster%20007297.EML

I'm no guru with Exchange and do not know how to match it's encoding. Can someone tell me if there is a mapping I can use to write my own function? I assume simply replacing / with \_xF8FF\_ and skipping colons will lead to chasing down this error again a month from now, but Google hasn't been helpful producing a full list of exceptions.


Solution

  • I've googled around a bit, but I haven't been able to find the complete reference of characters that you're looking for.
    The only thing that I've discovered is that the following five characters have a special encoding in Exchange:

    • Forward slash '/' is encoded as _xF8FF_
    • Question mark '?' is encoded as _x003F_
    • Backslash '\' is encoded as _xF8FE_
    • Tilde '~' is encoded as _x007E_
    • Euro symbol '€' is encoded as _x0080_

    Maybe it could help to have a look at the source of the Ximian Connector for Microsoft Exchange, and more precisely at the "e2k_uri_append_encoded" function, at line 280.
    The Ximian Connector enables Ximian Evolution to function as a Microsoft Exchange client by communicating with Microsoft Exchange servers through the WebDAV protocol, so it has to deal exactly with the same problem you have encountered.