IMAP Search skipping results
Mark Waddingham
mark at livecode.com
Mon Mar 23 12:48:13 EDT 2020
On 2020-03-23 15:21, Pi Digital via use-livecode wrote:
> Thanks Mark, your input here is appreciated.
>
> This reply in that forum wasn’t helpful, was it
>>
>> > Known bug #90 was reported in 2014. However it still occurs in 2019. Does
>> > anybody know how to overcome this situation?
>>
>> Yes: by fixing the code!
>>
> In the thread it talks of pagination (as do you) but doesn’t give an
> example of how to do it. How would we implement this in LC? If it is
> not giving us the correct count how do we know how many pages we will
> have to allow for and so on.
That's where I got the reference to pagination from - as I said it's not
a particularly useful post there. I suspect the person replying assumed
the person asking the question had a detailed understanding of IMAP
queries (my knowledge of interacting with IMAP servers is more than it
was earlier on, but still not really sufficient to give any detailed
advice).
The tsNet support for IMAP comes entirely from cURL - so it works pretty
much the same as the 'curl' shell command.
I found this with a quick search which might help:
<https://gist.github.com/akpoff/53ac391037ae2f2d376214eac4a23634>
The queries listed there at least appear to give ways to query the count
of things in a mailbox.
This page also looks like it might be helpful:
<https://nbsoftsolutions.com/blog/introduction-to-imap>
Also this has some more info on using CURL to talk to IMAP:
<https://debian-administration.org/article/726/Performing_IMAP_queries_via_curl>
Having pondered this a bit, I'm not sure that even if cURL guys fixed
the above bug it would actually make a difference to what you need to do
to have 100% correct code. The method of fetching all UIDs of messages
in a mailbox at once is completely unscalable - imagine an INBOX with
100,000s of messages for example over a slow/flaky connection; or an
INBOX which has a lot of traffic and changes exceptionally frequently;
or sits on a heavily loaded server (you can imagine that no server would
like to be polled for complete message lists all the time by lots of
clients).
The IMAP protocol appears to be designed to be treated as something to
use to synchronize local and remote state. Indeed, there is quite an
extensive description of how to 'synchronize with an IMAP server' in an
RFC:
<https://tools.ietf.org/html/rfc4549#page-18>
Indeed, it states in one place:
<quote>
The following is an example of the first FETCH:
C: A011 UID fetch 131:* (FLAGS BODYSTRUCTURE INTERNALDATE
RFC822.SIZE)
Note 1: The first FETCH may result in the server's sending a huge
volume of data. A smart disconnected client should use message
ranges (see also Section 3.2.1.2 of [RFC2683]), so that the user is
able to execute a different operation between fetching information
for a group of new messages.
</quote>
The unique id used to perform the sync operation is the UID; you can
fetch ranges of those as they are 'guaranteed' to always increase and
never be re-used. (The only caveat is the UIDVALIDITY, which is
basically a cache-generation number - i.e. if the UIDVALIDITY changes
you have to dump your local cache and start from scratch as it means the
meaning of individual UIDs has changed).
Not sure how much the above helps...
Warmest Regards,
Mark.
P.S. I've been chatting to Seb about the issue (he reported the bug
originally) - he has confirmed that the problem affects Kognition's IMAP
code too (that component is still in development at this stage which is
why it hadn't been noticed until I asked him to check). I had hoped the
approach there might have been slightly different and so provided a
viable workaround, but it would appear that it is not the case :(
--
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps
More information about the use-livecode
mailing list