[dev] Horde IMAP features (or why our webmail client is better than your webmail client)

Chuck Hagenbuch chuck at horde.org
Wed May 25 05:33:58 UTC 2011


Quoting Jan Schneider <jan at horde.org>:

> Zitat von Michael M Slusarz <slusarz at horde.org>:
>
>> Been meaning to do this for awhile, and this is only sort of a  
>> half-hearted first attempt/draft, but in the past there has been  
>> interest into what has actually gone on internally in Horde 4/IMP 5  
>> to improve performance and features.  Answer: a bunch.
>>
>> I can proudly state that Horde_Imap_Client, the Horde library that  
>> powers IMP, is by far the most complete, fastest, and most feature  
>> rich PHP library out there.  As a webmail developer, I often  
>> monitor the other freely available options there to gauge our  
>> process.  And my honest assessment is that we are unarguably the  
>> best solution when it comes to features, performance, and stability.
>>
>> So it might be good to list what I think some of these features are  
>> so that others can compare and see for themselves what we do better  
>> than anyone else.  To further this goal, I've started to add some  
>> content to the Horde_Imap_Client page:
>>
>> http://wiki.horde.org/Project/HordeImapLib
>>
>> If there is interest, I will try to expand on some of the existing  
>> entries (and add additional information).  I've thought about  
>> providing side-by-side outputs of things like IMAP transaction logs  
>> with other clients (webmail or desktop) to show our efficiency, but  
>> I'm wondering if that might be too esoteric for most people - IMAP  
>> is an incredibly complex protocol so the benefits may not be  
>> immediately or easily recognizable.  But if there is enough  
>> interest, I would consider providing these kind of demonstrations.
>>
>> For those that don't care about any of the above, and want a  
>> distilled version, I'll present the three things I am most proud  
>> about the Horde_Imap_Client library:
>>
>> 1. PHP Memory stream support.  Unlike every other PHP library I am  
>> aware of, our library does not keep the full data of body parts in  
>> memory.  Since attachments can be huge (10-20 MB), this could cause  
>> memory issues on the server.  Those running IMP 4 might be aware of  
>> this - memory limits for PHP had to be set high, partially because  
>> the PHP imap extension commands we used required all data to live  
>> in memory.  However, Horde_Imap_Client instead stores body part  
>> data in temporary streams.  These streams only store a limited  
>> amount of data in memory (2 MB), with the rest being spooled to a  
>> temporary file somewhere on your local system.  This results in  
>> vastly reduced memory loads when viewing/downloading message body  
>> parts.  As an example - I have had my memory limit set to 64 MB for  
>> over a year now.  I have not once run out of memory (as a  
>> developer, I often play around with large messages just to test for  
>> things like these).
>>
>> 2. CONDSTORE/QRESYNC support.  These are two recent IMAP extensions  
>> specifically created to add disconnected clients (like IMP) keep  
>> their local caches synced and to speed viewing when reloading a  
>> mailbox.  IMP is the *ONLY* open-source webmail client that I am  
>> aware of that supports these extensions.  Discussing the exact  
>> details is beyond the scope of this message, but absence of  
>> CONDSTORE/QRESYNC support means two things:
>>  * You can not properly cache mailbox data.  Namely, flags are not  
>> guaranteed to be synced unless they are downloaded EVERY time you  
>> access a mailbox.  Which is very slow.  So, in other words, all  
>> other webmail clients are essentially "broken" - only IMP does  
>> caching correctly.
>>  * You can not properly keep an AJAX display synchronized.  A  
>> well-written AJAX client contains yet another cache of mailbox data  
>> - it needs to be synchronized with the PHP server (which in turn  
>> needs to be synchronized with the IMAP server.  Confused yet?)   
>> Without CONDSTORE/QRESYNC, this can not be done correctly absent  
>> the AJAX interface *constantly* reloading data from the server.   
>> But this is just a waste of bandwidth, processing power, and the  
>> user's time.  Only IMP does AJAX display correctly because we only  
>> download what is needed.
>>
>> 3. Fast. The PHP imap (c-client) extension is notoriously bad at  
>> its IMAP conversations.  It would send duplicate requests, couldn't  
>> cache entries, and would request data for messages that you didn't  
>> even care about (the infamous lookahead "feature").  Additionally,  
>> there were many things that couldn't be done at all - like  
>> obtaining namespace information on the server - because the  
>> extension did not support it so an entirely separate library needed  
>> to be written, and and an entirely separate connection to the IMAP  
>> server needed to be made, to fill in the gaps.  Horde_Imap_Client  
>> has replaced all this was a single, coherent library that has been  
>> relentlessly tuned to ensure that we are doing things the most  
>> efficient way possible.
>>
>> This is probably a good place to end this message.  I try not to be  
>> braggy very often about the projects I am involved in, but now that  
>> IMP 5 has begun to stabilize I figure the next step is to try to  
>> inform people why it should be their choice.
>
> This is a great sum-up and we should indeed be more vocal about the  
> areas where Horde is superior. I always mentioned the IMAP rewrite  
> during conversations about Horde 4 on LinuxTag, but I'm afraid only  
> those people who really suffer(ed) from the other existing IMAP  
> solutions for PHP (including Horde 3/IMP 4) can really appreciate  
> the work that has gone into this library.
> I would love to see this being turned into a full (guest) blog  
> entry. My blog is listed on PHP Planet, so this might get a nice  
> spreading in the PHP community.

+1

-chuck


More information about the dev mailing list