Re: Move mails between folders on different backend servers

Frank Richter <[email protected]>
Newsgroups gmane.mail.imap.cyrus
Organization TU Chemnitz, Germany
Message-ID <[email protected]>
Hi Ellie,
thanks and sorry for the long delay.

> Hi Frank,
>
> On Mon, 11 Apr 2022, at 11:36 PM, Frank Richter wrote:
>> I'm still hunting some strange IMAP bugs with Horde Webmail. Users get 
>> messages like 'Mailbox structure on server has changed.'
>> This is in code handling UIDVALIDITY (as I understood it) – it's here:
>>
>> https://github.com/horde/imp/blob/8d19f07d87a6320df5de6b293ec05a49502005ff/lib/Mailbox.php#L672 
>> <https://github.com/horde/imp/blob/8d19f07d87a6320df5de6b293ec05a49502005ff/lib/Mailbox.php#L672>
>>
>
> If I'm reading this code correctly (someone who actually knows PHP can 
> correct me if I'm not), it looks like it's doing something like:
>
> * get the cached uidvalidity
> * if there was no cached uidvalidity, set a flag to indicate that this is 
> the first time we're caching it
> * if the cached uidvalidity does not match the uidvalidity from the server 
> (including by not having been previously cached), update the cache to match
> * if we've updated the cache, and it wasn't the first time, throw the error
>
> So, any time UIDVALIDITY changes, Horde will throw this error.

I read the same :-)
Instead of throwing an error I logged the uidvalidity values in Horde:

2022-05-09T14:47:50 NOTICE: HORDE: [imp] Mailbox structure on server has 
changed:  INBOX 944678882 [pid 71298 on line 682 of 
"/var/www/html/horde/imp/lib/Mailbox.php"]
2022-05-09T14:47:50 NOTICE: HORDE: [imp] Mailbox structure on server has 
changed:  INBOX 1647543093 [pid 71298 on line 682 of 
"/var/www/html/horde/imp/lib/Mailbox.php"]
2022-05-09T14:47:50 NOTICE: HORDE: [imp] Mailbox structure on server has 
changed:  INBOX 944678882 [pid 71298 on line 682 of 
"/var/www/html/horde/imp/lib/Mailbox.php"]

This is a telemetry log I catched during a "remove attachment" in Horde 
Webmail – it is done by storing a new message (APPEND) and delete the 
original message:

Frontend server:

<1652100470<7 APPEND INBOX (\seen) "9-May-2022 11:52:13 +0200" CATENATE (URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=HEADER TEXT {31}
>1652100470>+ i am an optimist
<1652100470<
--=_Jh9_M3APoyC6UIOy-C96gGX
<1652100470< URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=1.MIME URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=1 TEXT {31}
>1652100470>+ i am an optimist
<1652100470<
--=_Jh9_M3APoyC6UIOy-C96gGX
<1652100470< TEXT {162}
>1652100470>+ i am an optimist
<1652100470<Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment

[Anhang entfernt: Ehemaliger Anhangstyp: application/pkcs7-signature, Name: smime.p7s]<1652100470< TEXT {33}
>1652100470>+ i am an optimist
<1652100470<
--=_Jh9_M3APoyC6UIOy-C96gGX--
<1652100470<)
>1652100470>7 OK [APPENDUID *944678882*  294323] Completed
<1652100470<9 STATUS INBOX (UIDVALIDITY)
>1652100470>* STATUS INBOX (*UIDVALIDITY 1647543093*)    <<<--- Here the unchanged Horde Webmail throws an error
9 OK Completed
<1652100470<10 SELECT INBOX (QRESYNC (*944678882*  478464 294303))
>1652100470>* 180 EXISTS
* 1 RECENT
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen NonJunk Junk $Forwarded $Label1 $Label2 $Label3 $Label4 $Label5 $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen NonJunk Junk $Forwarded $Label1 $Label2 $Label3 $Label4 $Label5 $MDNSent \*)] Ok
* OK [UNSEEN 76] Ok
* OK [UIDVALIDITY 944678882] Ok
* OK [UIDNEXT 294324] Ok
* OK [HIGHESTMODSEQ 478465] Ok
* OK [URLMECH INTERNAL] Ok
* OK [ANNOTATIONS 65536] Ok
10 OK [READ-WRITE] Completed
<1652100470<11 UID STORE 294303 +FLAGS \deleted

Backend:
<1652100470<7 Localappend {5+}
INBOX "" (\seen) "9-May-2022 11:52:13 +0200" CATENATE (URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=HEADER TEXT {31+}

--=_Jh9_M3APoyC6UIOy-C96gGX
  URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=1.MIME URL /INBOX;UIDVALIDITY=944678882/;UID=294303/;SECTION=1 TEXT {31+}

--=_Jh9_M3APoyC6UIOy-C96gGX
  TEXT {162+}
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment

[Anhang entfernt: Ehemaliger Anhangstyp: application/pkcs7-signature, Name: smime.p7s] TEXT {33+}

--=_Jh9_M3APoyC6UIOy-C96gGX--
)
>1652100470>7 OK [APPENDUID *944678882*  294323] Completed
<1652100470<N01 NOOP
>1652100470>N01 OK Completed
<1652100470<9 Status {5+}
INBOX (UIDVALIDITY)
>1652100470>* STATUS INBOX (UIDVALIDITY *1647543093*)
9 OK Completed
<1652100470<N01 NOOP
>1652100470>N01 OK Completed
<1652100470<PROXY1 Enable Qresync
>1652100470>PROXY1 OK Completed
<1652100470<10 Select {5+}
INBOX (QRESYNC (*944678882*  478464 294303))
>1652100470>* 180 EXISTS
* 1 RECENT
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen NonJunk Junk $Forwarded $Label1 $Label2 $Label3 $Label4 $Label5 $MDNSent)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen NonJunk Junk $Forwarded $Label1 $Label2 $Label3 $Label4 $Label5 $MDNSent \*)] Ok
* OK [UNSEEN 76] Ok
* OK [UIDVALIDITY 944678882] Ok
* OK [UIDNEXT 294324] Ok
* OK [HIGHESTMODSEQ 478465] Ok
* OK [URLMECH INTERNAL] Ok
* OK [ANNOTATIONS 65536] Ok
10 OK [READ-WRITE] Completed

I just don't understand why the UIDVALIDITY changes to 164754309, than back 
to the old value 944678882.

mbexamine says:
…
   UIDValidity: 944678882  Last UID: 294323

Frank


>
> UIDVALIDITY is /supposed/ to change, from time to time (ideally as rarely 
> as possible).  Message UIDs try to be persistent, so clients can cache 
> them.  UIDVALIDITY stays the same as long as the message UIDs remain the 
> same, but changes if the UIDs change.  The hypothetical client caches 
> message UIDs along with the UIDVALIDITY, and if it ever gets a /different/ 
> UIDVALIDITY back from the server, it then knows that its cached UIDs are 
> no longer valid, and discards them.  The server tries to keep message UIDs 
> the same, but if it ever needs to renumber them for whatever reason, it 
> bumps UIDVALIDITY to indicate it has done so.
>
> This is all normal IMAP behaviour.
>
> It's strange that Horde would throw this error up to the user, who 
> probably has no idea what it means. IMO they should just discard any 
> now-invalid cached UIDs, and carry on as usual.
>
> It's not clear to me whether Horde actually discards its cached UIDs on 
> UIDVALIDITY change, like it's supposed to, or whether it just complains to 
> the user.
>
> Either way, there's no indication that Cyrus is doing anything wrong in 
> this case.  Whatever shape this problem ends up being, it looks like a 
> Horde problem.
>
> Cheers,
>
> ellie
> *Cyrus <https://cyrus.topicbox.com/latest>* / Info / see discussions 
> <https://cyrus.topicbox.com/groups/info> + participants 
> <https://cyrus.topicbox.com/groups/info/members> + delivery options 
> <https://cyrus.topicbox.com/groups/info/subscription> Permalink 
> <https://cyrus.topicbox.com/groups/info/T25c7531b76d23ba0-M2027d1f75cb88e5ba37c020e> 
>

This is a multi-part message in MIME format...

------------=_1652102116-220731-1--
smime.p7s (application/pkcs7-signature, 5.8 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.