<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[IMAP and POP3 on the server: capabilities, switches, shared mailboxes, search limits]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.7 (17 October 2026) changes some of what a client gets. IMAP <code>COPY</code> and <code>MOVE</code> by message number read their set in the client's numbering, and a set that names a message another session has just expunged is refused <code>NO [EXPUNGEISSUED]</code> for the client to send again; a <code>COPY</code> or <code>MOVE</code> that fails part way leaves the destination as it was; <code>SEARCH</code>, <code>SORT</code> and <code>THREAD</code> ask a criterion named again beside itself once; and <code>FETCH BODY[N.MIME]</code>, and <code>BODY[N]</code> of a multipart, are the stored octets. POP3 accepts the <code>UTF8</code> classic Outlook for Windows (2016 to 2024) sends after the login, until the session's first <code>STAT</code>, <code>LIST</code>, <code>UIDL</code>, <code>RETR</code>, <code>TOP</code>, <code>DELE</code> or <code>RSET</code>, so its downloads work again. SMTP, POP3 and ManageSieve refuse a SASL PLAIN sign-in that asks to act as another account. The IMAP and POP3 listeners can take the client's address from a PROXY protocol header, as the SMTP listener does, each from the peers on a list of its own, both off by default. The send-as grant now bears on DKIM too: an authenticated submission is signed as another hosted domain only when its account may send as the address its From names - its own, an alias pointing at it, a mailbox that granted it the post right, an address it proved, or a masked address of its own - and is otherwise accepted and sent unsigned as that domain. See <a href="/topic/28277">the 6.3.7 announcement</a>. hMailServer 6.3.8 (2 November 2026) signs a name in to an account only when it is the account's stored address, compared in lower case after a domain alias and the default domain, on IMAP, POP3 and SMTP alike, SCRAM-SHA-256 among them: a client that signs in with another spelling of the address, in more than the case of the letters A to Z, or with white space at either end, may no longer sign in, since such a name fails as a name that does not exist fails and is counted as a failure. Correct the name in the client. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic is the server side of IMAP, POP3 and SMTP in hMailServer 6.3.4: what each listener advertises and which switch gates it, search limits and the full-text index, QRESYNC's expunge history, connection limits, shared mailboxes, and what 6.3.4 fixed that a client may notice. <strong>Know this first: a capability missing from an answer is nearly always a switch or the session's state, not a fault.</strong> Two IMAP switches ship off, and since 6.3.4 IMAP offers <code>STARTTLS</code> only before TLS and sign-in, and <code>COMPRESS=DEFLATE</code> only after sign-in. What a mail client needs is in <a href="/topic/28255">Connecting a mail client</a>; the ACL rights table is in <a href="/topic/28270">Aliases, distribution lists, mailing lists and public folders</a>.</p>
<h3><a class="anchor-offset" name="seeing-what-the-server-advertises"></a>Seeing what the server advertises</h3>
<p dir="auto">Ask the server, from any machine with OpenSSL. For SMTP type <code>EHLO test.example.org</code>; for IMAP, <code>CAPABILITY</code>:</p>
<pre><code>openssl s_client -connect mail.yourcompany.com:25 -starttls smtp -quiet
openssl s_client -connect mail.yourcompany.com:993 -quiet
</code></pre>
<p dir="auto">On 6.3.4 ask IMAP before <code>LOGIN</code> and after: the answers differ by design. For POP3, connect to 995 the same way and send <code>CAPA</code>. Ports 993 and 995 exist only once you have created them (<strong>Connections &amp; protocols → TCP/IP ports</strong> in the Windows Control Panel, or the Control Deck).</p>
<h3><a class="anchor-offset" name="imap-what-is-always-there"></a>IMAP: what is always there</h3>
<p dir="auto">On every connection, as in 6.3.3:</p>
<pre><code>IMAP4 IMAP4rev1 IMAP4rev2 CHILDREN THREAD=ORDEREDSUBJECT THREAD=REFERENCES
NAMESPACE RIGHTS=texk MOVE ID SPECIAL-USE CREATE-SPECIAL-USE UNSELECT UIDPLUS ENABLE
STATUS=SIZE ESEARCH CONDSTORE QRESYNC LIST-EXTENDED SEARCHRES WITHIN UTF8=ACCEPT
LIST-STATUS PREVIEW MULTIAPPEND REPLACE SAVEDATE METADATA OBJECTID BINARY LITERAL- APPENDLIMIT
</code></pre>
<p dir="auto"><code>APPENDLIMIT</code> is bare before authentication and <code>APPENDLIMIT=&lt;bytes&gt;</code> after. <code>LITERAL-</code> caps non-synchronising literals at 4096 bytes, so an oversized <code>APPEND</code> can still be refused with <code>TOOBIG</code>.</p>
<p dir="auto"><strong>A client opts in to IMAP4rev2 per session</strong> with <code>ENABLE IMAP4rev2</code>, which implies <code>UTF8=ACCEPT</code>. <code>ENABLE</code> recognises exactly four names: <code>QRESYNC</code> (implies <code>CONDSTORE</code>), <code>CONDSTORE</code>, <code>UTF8=ACCEPT</code> and <code>IMAP4rev2</code>. After <code>ENABLE IMAP4rev2</code> the session drops the <code>RECENT</code> response and the <code>[UNSEEN]</code> code on <code>SELECT</code> and <code>EXAMINE</code>, drops <code>RECENT</code> as a <code>STATUS</code> item, and answers a <code>SEARCH</code> with no <code>RETURN</code> options as <code>ESEARCH</code>.</p>
<h3><a class="anchor-offset" name="imap-what-is-gated-and-by-what"></a>IMAP: what is gated, and by what</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Capability</th>
<th>Advertised when</th>
<th>Shipped</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>IDLE</code></td>
<td><code>enableimapidle</code> is on</td>
<td>On</td>
</tr>
<tr>
<td><code>QUOTA QUOTA=RES-STORAGE</code></td>
<td><code>enableimapquota</code> is on</td>
<td>On</td>
</tr>
<tr>
<td><code>SORT</code></td>
<td><code>enableimapsort</code> is on</td>
<td>On</td>
</tr>
<tr>
<td><code>ACL</code></td>
<td><code>enableimapacl</code> is on; it also switches the <code>#Users</code> namespace</td>
<td>On</td>
</tr>
<tr>
<td><code>AUTH=PLAIN</code>, <code>AUTH=SCRAM-SHA-256</code></td>
<td><code>EnableImapSASLPlain</code> is on and authentication is available</td>
<td><strong>Off</strong></td>
</tr>
<tr>
<td><code>SASL-IR</code></td>
<td><code>EnableImapSASLInitialResponse</code> is on</td>
<td><strong>Off</strong></td>
</tr>
<tr>
<td><code>COMPRESS=DEFLATE</code></td>
<td><code>IMAPCompressionEnabled=1</code>, the client has signed in (since 6.3.4), and the session is not yet compressed</td>
<td>On</td>
</tr>
<tr>
<td><code>STARTTLS</code></td>
<td>The port is STARTTLS-optional or -required, TLS is not active, and (since 6.3.4) the client has not signed in</td>
<td>Per port</td>
</tr>
<tr>
<td><code>LOGINDISABLED</code></td>
<td>Authentication is refused on this cleartext connection (STARTTLS-required port, or <code>RequireTLSForAuth</code> on the IP range)</td>
<td>Per range</td>
</tr>
</tbody>
</table>
<p dir="auto">The rest depend on the connection: <code>AUTH=SCRAM-SHA-256-PLUS</code> only on TLS (and behind the same SASL switch), <code>AUTH=XOAUTH2 AUTH=OAUTHBEARER</code> with <code>OAuth2Enabled</code> and, unless <code>OAuth2RequireTLS=0</code>, only over TLS, <code>AUTH=EXTERNAL</code> on a verified client certificate that names an address, and <code>UNAUTHENTICATE</code> once signed in.</p>
<ul>
<li><strong><code>IDLE</code></strong> reports changes in the selected folder (<code>EXISTS</code>, <code>RECENT</code>, <code>EXPUNGE</code>, <code>FLAGS</code>) as they happen. A folder another client has just created is seen at the next folder-list refresh, as there is no IMAP <code>NOTIFY</code>; that is IMAP, not a fault.</li>
<li><strong><code>QUOTA</code></strong> answers with one unnamed root, <code>""</code>, and a <code>STORAGE</code> resource in kilobytes from the account's maximum size; an account with no limit gets an empty list. <code>SETQUOTA</code> is refused, because the quota is the administrator's. Refusals of <code>APPEND</code>, <code>COPY</code> and <code>MOVE</code> for a full mailbox carry <code>OVERQUOTA</code>.</li>
<li><strong><code>SORT</code></strong>: with message indexing off, as it ships, <code>SORT</code> reads each message's header from disk.</li>
<li><strong><code>EnableImapSASLPlain</code></strong> gates SCRAM as well as PLAIN, despite its name. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/Roadmap.md" rel="nofollow ugc">Roadmap.md</a> says it gates the whole <code>AUTHENTICATE</code> command, while the Capabilities wiki gives OAuth2 and <code>EXTERNAL</code> conditions of their own: with it off, test <code>XOAUTH2</code>, <code>OAUTHBEARER</code> and <code>EXTERNAL</code> over IMAP before relying on them.</li>
</ul>
<p dir="auto"><strong><code>COMPRESS DEFLATE</code></strong> (RFC 4978) compresses both directions of the rest of the session; a client that does not ask is unaffected. A second one is <code>NO [COMPRESSIONACTIVE]</code>, <code>STARTTLS</code> under compression is <code>BAD</code>, and <code>IMAPCompressionEnabled=0</code> withdraws it, the command then answering <code>BAD</code> like an unknown one.</p>
<h3><a class="anchor-offset" name="pop3-and-smtp-the-same-question"></a>POP3 and SMTP: the same question</h3>
<p dir="auto"><strong>POP3 <code>CAPA</code></strong> always carries <code>UIDL</code>, <code>TOP</code>, <code>RESP-CODES</code>, <code>AUTH-RESP-CODE</code>, <code>IMPLEMENTATION hMailServer</code>, <code>PIPELINING</code>, <code>UTF8</code> and <code>EXPIRE NEVER</code>. The <code>SASL</code> mechanisms depend on TLS, <code>STLS</code> on the port, and <code>LOGIN-DELAY &lt;n&gt;</code> appears only when <code>Pop3LoginDelaySeconds</code> is above 0 (0 ships). That key advertises and enforces a minimum interval between sign-ins, refusing an early one with <code>-ERR [LOGIN-DELAY] …</code>; on Windows it is the POP3 tab's card <em>How often a client may check for mail</em>.</p>
<p dir="auto"><strong>SMTP <code>EHLO</code></strong> always carries <code>SIZE &lt;n&gt;</code> (the maximum message size in KB times 1024; bare <code>SIZE</code> when 0), <code>8BITMIME</code>, <code>PIPELINING</code>, <code>CHUNKING</code>, <code>BINARYMIME</code>, <code>SMTPUTF8</code>, <code>ENHANCEDSTATUSCODES</code>, <code>DSN</code> and <code>HELP</code>. <code>BINARYMIME</code> is for local delivery: a recipient needing onward relay is refused at <code>RCPT TO</code> with 554 5.6.3. Conditionally:</p>
<ul>
<li><code>XCLIENT</code> only when <code>SMTPXClientEnabled=1</code> and the real peer is in <code>SMTPXClientTrustedIPs</code>; an untrusted peer that tries it gets 550.</li>
<li><code>STARTTLS</code> on a cleartext connection to a STARTTLS-optional or -required port.</li>
<li><code>AUTH</code> only when authentication is enabled, withheld on cleartext when the port requires STARTTLS or the range sets <code>RequireTLSForAuth</code>, and never on the ports in <code>DisableAUTHList</code>.</li>
<li>Not a keyword, but decided the same way: the HAProxy PROXY protocol is accepted only with <code>SMTPProxyProtocolEnabled=1</code> and from a peer in <code>SMTPProxyProtocolTrustedIPs</code>, and nothing in <code>EHLO</code> announces it.</li>
</ul>
<p dir="auto">On SMTP and POP3 the <code>AUTH</code> line and its SASL responses take up to 12,288 octets; every other line keeps 510 (SMTP) or 500 (POP3). What 6.3.4 added to SMTP is refusals, not capabilities.</p>
<h3><a class="anchor-offset" name="where-the-switches-are-set-and-when-a-change-applies"></a>Where the switches are set, and when a change applies</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>What</th>
<th>Windows Control Panel</th>
<th>Elsewhere</th>
<th>Applies</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>IDLE</code>, <code>QUOTA</code>, <code>SORT</code>, <code>ACL</code>, the two SASL switches, the connection limits</td>
<td><strong>Connections &amp; protocols → Protocols</strong>, IMAP, SMTP and POP3 tabs</td>
<td>COM <code>Settings</code> (<code>IMAPIdleEnabled</code> and its neighbours); REST <code>PUT /api/v1/settings</code> (<code>imap_idle_enabled</code>, <code>imap_quota_enabled</code>, <code>imap_sort_enabled</code>, <code>imap_acl_enabled</code>, <code>imap_sasl_plain_enabled</code>, <code>imap_sasl_initial_response_enabled</code>); the Deck's Settings view; <code>hmctl settings set</code></td>
<td>At once</td>
</tr>
<tr>
<td>Message indexing</td>
<td><strong>Maintenance → Performance</strong>, Indexing tab</td>
<td>COM <code>Settings.MessageIndexing</code>; <code>PUT /api/v1/settings/indexing</code> (<code>enabled</code>); <code>hmctl settings</code>, group <code>indexing</code></td>
<td>At once</td>
</tr>
<tr>
<td><code>IMAPCompressionEnabled</code>, <code>IMAPSearchTimeout</code>, <code>IMAPSearchMaxMegabytes</code>, <code>IMAPExpungeRetentionRecords</code>, <code>Pop3LoginDelaySeconds</code>, <code>IndexerFullText</code> and its tuning keys</td>
<td>Cards on the IMAP and POP3 tabs; the Indexing tab</td>
<td>COM <code>Settings.SetIniSetting</code>; <code>PUT /api/v1/settings/ini/{name}</code> (administrator password only); <code>hmctl ini</code>; on Linux <code>hmailserver --set-setting NAME=VALUE</code>. No Deck page</td>
<td>When saved</td>
</tr>
</tbody>
</table>
<p dir="auto">The Control Panel and COM are Windows-only. The last row's keys were the <code>[Settings]</code> section of <code>hMailServer.ini</code>; <strong>since 6.3.4 the database holds them</strong>, none of them waits for a reinitialise or a restart (<a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">docs/SettingsApply.md</a>), and the server does not take a line edited in the file, so set them through an interface. <a href="/topic/28222">Settings: when a save takes effect</a> covers the store, <code>HM5804</code>, and a value stored by <code>--set-setting</code> while the service runs.</p>
<p dir="auto">The REST lines assume the listener on <code>127.0.0.1:8443</code>, as the REST API wiki's examples do; <code>RestApiPort</code> ships at 0 (off) and waits for a reinitialise.</p>
<pre><code class="language-bash"># Switch IDLE off; in effect when the answer comes back
curl -u Administrator:your-admin-password -X PUT -H "Content-Type: application/json" \
     -d '{"imap_idle_enabled":false}' http://127.0.0.1:8443/api/v1/settings

# A [Settings] key: the administrator password only, never an API key
curl -u Administrator:your-admin-password -X PUT -H "Content-Type: application/json" \
     -d '{"value":"120"}' http://127.0.0.1:8443/api/v1/settings/ini/IMAPSearchTimeout

# On Linux, then a restart so the running server takes it
sudo hmailserver --set-setting IMAPSearchTimeout=120
sudo systemctl restart hmailserver
</code></pre>
<h3><a class="anchor-offset" name="search-two-ceilings-and-the-full-text-index"></a>Search: two ceilings and the full-text index</h3>
<p dir="auto"><strong>Without the full-text index, <code>SEARCH BODY</code> and <code>TEXT</code> read every message in the mailbox</strong>, attachments whose media type is text included (decoded, bounded at 1 MB). Two ceilings, measured from the moment a command starts and never re-armed by progress, bound <code>SEARCH</code>, <code>SORT</code> and <code>THREAD</code>: <code>IMAPSearchTimeout</code> (60 seconds) and <code>IMAPSearchMaxMegabytes</code> (2048 MB of message content read); 0 turns either off. They are the IMAP tab's card <em>IMAP search limits</em>, and <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/README.md" rel="nofollow ugc">README.md</a> says to raise them for mailboxes of several hundred thousand messages.</p>
<p dir="auto"><strong>What a client gets at a ceiling is stated two ways.</strong> <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/Roadmap.md" rel="nofollow ugc">Roadmap.md</a> records <code>NO</code> with RFC 9051 <code>LIMIT</code> and no untagged result, so a cut-short list cannot pass for a complete one; <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/README.md" rel="nofollow ugc">README.md</a>'s comment beside <code>IMAPSearchTimeout</code> says the search returns the matches found so far. Until that is settled, treat a search that hit a ceiling as incomplete, and let nothing act on its result in bulk.</p>
<p dir="auto"><strong>The full-text index is off, and needs two switches</strong>: <code>IndexerFullText=1</code> indexes nothing unless message indexing (<code>Settings.MessageIndexing</code>) is on too. It costs a term table of a few kilobytes per message and a backfill pass over every message already delivered, which is why no upgrade turns it on. <strong>The index can only prove that a message cannot match</strong>; everything else is read and scanned as before, so results are identical on or off. The webmail's search and eDiscovery use the same filter.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Key</th>
<th>Default</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>IndexerFullTextBatchSize</code></td>
<td>250 (1 to 100000)</td>
<td>Messages one backfill pass reads before the cursor is saved and the thread pauses</td>
</tr>
<tr>
<td><code>IndexerFullTextMinTokenLength</code></td>
<td>3 (3 to 64)</td>
<td>The shortest search string the index answers for</td>
</tr>
<tr>
<td><code>IndexerFullTextMaxTokensPerMessage</code></td>
<td>2048 (64 to 1000000)</td>
<td>Distinct terms before a message is marked always-scanned instead of indexed</td>
</tr>
</tbody>
</table>
<p dir="auto">The Indexing tab's <em>Index now, and show how far behind it is</em> and <em>Discard the index and rebuild it</em> are <code>POST /api/v1/settings/indexing/index</code> and <code>/clear</code> over REST, and <code>Index()</code> and <code>Clear()</code> over COM, where <code>TotalIndexedCount</code> against <code>TotalMessageCount</code> shows a rebuild's progress. With mailboxes encrypted at rest, the indexed count stays short by their messages for good: those are never indexed.</p>
<h3><a class="anchor-offset" name="qresync-how-much-expunge-history-is-kept"></a>QRESYNC: how much expunge history is kept</h3>
<p dir="auto"><code>IMAPExpungeRetentionRecords</code> keeps the newest 5000 expunge records per mailbox (0 keeps all), pruned every twelve hours and once at service start; on Windows it is the card <em>Change history for synchronising clients</em>. The newest is never removed. <strong>A client whose last sync is older than what is kept gets a full resync, never a wrong one</strong>: every UID in its range that the mailbox does not hold. An installation upgraded from a release older than 6.2.23-alpha1 prunes the table in one pass at its first start. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/README.md" rel="nofollow ugc">README.md</a> says 0 defers that prune, and an <code>IMAPExpungeRetentionRecords</code> line of 0 added to <code>[Settings]</code> before the upgrade is taken: 6.3.4's first start adopts from the file a key the database has never held, and before 6.2.23-alpha1 the database held this one only if the file had the line. Restart the old service once after adding or changing it (Upgrading hMailServer wiki, 18.3, step 6): <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/CHANGELOG.md" rel="nofollow ugc">CHANGELOG.md</a>'s note that a line edited to prepare an upgrade is put back concerns a key the database already holds, and that restart settles it. Set it back to 5000 afterwards through an interface; <a href="/topic/28193">Upgrading to 6.3.4</a> has the rest of the order.</p>
<h3><a class="anchor-offset" name="connection-limits-and-what-guards-them"></a>Connection limits and what guards them</h3>
<p dir="auto"><code>MaxSMTPConnections</code>, <code>MaxIMAPConnections</code> and <code>MaxPOP3Connections</code> are on the Protocols page (REST <code>max_smtp_connections</code>, <code>max_imap_connections</code>, <code>max_pop3_connections</code>). None has a limit by default; SMTP and IMAP ship at 0, no cap. The Services tab turns a protocol off altogether (<code>ServiceSMTP</code>, <code>ServiceIMAP</code>, <code>ServicePOP3</code>).</p>
<p dir="auto">Watch <code>hmailserver_sessions{protocol}</code> on <code>/metrics</code> (off until <code>MetricsServerPort</code> is set, which waits for a reinitialise) or <code>sessions</code> in <code>GET /api/v1/status</code>. Around the limits: auto-ban counts failed sign-ins per IP across SMTP, IMAP, POP3, ManageSieve and REST (on: 3 in 30 minutes, a 60-minute ban); <code>LogonTarpitSeconds</code> (off) delays each failed sign-in's refusal; a second POP3 session on one mailbox gets <code>-ERR [IN-USE]</code>; and since 6.3.4 an IMAP <code>LIST</code> or <code>LSUB</code> pattern over 8,192 characters, or more than 32 patterns in one <code>LIST</code>, is answered <code>BAD</code>. The submission rate limit and the tarpits are in <a href="/topic/28239">IP ranges, auto-ban, lockout and tarpits</a>; refusing a connection by country is in <a href="/topic/28249">allow and block lists and country blocking</a>.</p>
<h3><a class="anchor-offset" name="opening-a-mailbox-to-a-colleague"></a>Opening a mailbox to a colleague</h3>
<p dir="auto">Shared and delegated mailboxes are IMAP ACL (RFC 4314). The owner opens a folder to another account, and it appears to that account under the Other Users namespace as <code>#Users.owner@domain.folder</code>. <strong>No administrator step is needed</strong>: any account whose client speaks <code>SETACL</code> can do it, and the audit trail records no row for it.</p>
<ol>
<li>Leave ACL on. With it off, <code>#Users</code> stops existing (<code>NAMESPACE</code> advertises <code>NIL</code>), public folders are open to everyone, and the send-as grant is not honoured.</li>
<li>The owner grants rights from an IMAP client with ACL support. An administrator can do it over REST: <code>GET</code> on <code>/api/v1/accounts/{address}/folders</code> gives the folder's id, and <code>/api/v1/accounts/{address}/folders/{id}/permissions</code> lists, adds, changes and removes entries (since 6.3.3; writes need a full key). On Windows, COM has <code>IMAPFolderPermissions.Add</code>. The grantee is an account, a group (<code>/api/v1/groups</code>, since 6.3.4), or Anyone, which is every authenticated account on the server.</li>
<li>Grant <code>l</code>, or the folder does not exist for the colleague. <code>r</code> reads, <code>s</code> changes read state, <code>i</code>, <code>t</code> and <code>e</code> file and delete, and <code>p</code> on the INBOX is the send-as grant.</li>
<li>Grant on each top-level folder needed. A right is decided at the nearest folder up the owner's tree that has any entries, and entries are not merged: a grant on INBOX reaches its sub-folders that have none of their own, not the Sent folder, and one entry on a sub-folder cuts it off from the parent's.</li>
<li>Over SMTP the <code>p</code> grant counts only while <code>SmtpAuthenticatedSenderCheck</code> is on, and it ships off: until then nothing constrains an authenticated <code>MAIL FROM</code>, so any account can send as the mailbox, or as anyone else. Turned on, it applies to every authenticated session on the server; the addresses it then allows are in <a href="/topic/28239">who may send as whom</a>.</li>
<li>In the colleague's client, a pane of subscribed folders shows only the ones the owner subscribed to; the webmail shows them under <code>Shared by &lt;owner&gt;</code>.</li>
</ol>
<p dir="auto"><strong>What follows from sharing:</strong></p>
<ul>
<li><code>\Seen</code> is stored on the message, not per person: with <code>s</code>, a delegate marks a message read for everyone; with <code>lr</code> alone they leave no trace, and their client cannot track what they have read.</li>
<li>Since 6.3.4 an <code>APPEND</code> into a <code>#Users</code> folder is charged to the owner's quota, as <code>COPY</code> and <code>MOVE</code> already were.</li>
<li>A delegate reads a folder of a mailbox encrypted at rest only while the owner's key is open; otherwise a <code>FETCH</code> that reads the message answers <code>NO [UNAVAILABLE]</code>, and copying out is refused.</li>
<li>In the webmail a read-only share refuses a flag or a delete with 403, a message cannot move between one's own mailbox and a shared one, and the owner cannot grant access from the page.</li>
<li>Since 6.3.4 a restore puts each folder's access grants back. Every <code>LIST</code> runs one more query while ACL is on.</li>
</ul>
<h3><a class="anchor-offset" name="what-6.3.4-fixed-that-a-client-may-notice"></a>What 6.3.4 fixed that a client may notice</h3>
<p dir="auto">Where Dovecot's <code>imaptest</code> found IMAP answering other than the RFCs say (<code>\Seen</code> without <code>.PEEK</code>, <code>APPEND</code> byte for byte, <code>SORT</code> and <code>THREAD</code> order, among others), <a href="/topic/28255">Connecting a mail client</a> has the list. The rest:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>What a client did</th>
<th>What it gets since 6.3.4</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sent <code>STARTTLS</code> after <code>LOGIN</code>, or inside TLS</td>
<td><code>BAD</code>, and no <code>STARTTLS</code> in <code>CAPABILITY</code></td>
</tr>
<tr>
<td>Sent <code>COMPRESS DEFLATE</code> before signing in</td>
<td><code>NO</code></td>
</tr>
<tr>
<td>Appended over a compressed connection, data inflating past the 250,000-octet receive buffer</td>
<td>The whole message, where it was stored cut short or never finished</td>
</tr>
<tr>
<td>Read <code>ENVELOPE</code> with a backslash in <code>Date</code>, or <code>BODYSTRUCTURE</code> with a quote or backslash in a part's parameters</td>
<td>A structure that parses: the date's backslashes left out; quotes and backslashes escaped, a control character sent as a space</td>
</tr>
<tr>
<td>Fetched a message the server cannot read</td>
<td><code>NO [UNAVAILABLE]</code> for a closed key; a damaged one (<code>HM7350</code>) left out, the rest fetched and the command ending <code>NO</code> - not <code>OK</code> with an empty <code>ENVELOPE</code></td>
</tr>
<tr>
<td>Changed one message's flags from two sessions at once</td>
<td>Both changes kept; <code>STORE ... (UNCHANGEDSINCE n)</code> tested in the same step</td>
</tr>
<tr>
<td>Went on sending a <code>MULTIAPPEND</code>'s later literals after a refusal, one over the maximum message size (and 1 MB)</td>
<td>The connection closed with <code>BAD [TOOBIG]</code>, where it was read whatever its size</td>
</tr>
<tr>
<td>Fetched a message only an unreachable object store holds</td>
<td>IMAP <code>NO [UNAVAILABLE]</code>, POP3 <code>-ERR [SYS/TEMP]</code> (object storage is new in 6.3.4, and off)</td>
</tr>
</tbody>
</table>
<p dir="auto">Two heap-corruption aborts are gone as well (two sessions on one message's keywords; <code>LIST</code> beside folder changes). Most of these were in 6.3.3 too.</p>
<h3><a class="anchor-offset" name="what-it-does-not-do"></a>What it does not do</h3>
<ul>
<li><strong>No APOP or CRAM-MD5</strong> on POP3, and <code>THREADID</code> is answered <code>NIL</code>.</li>
<li><strong>Delegation is not measured in Thunderbird or Outlook</strong>, and an Outlook IMAP profile never acts on the Autodiscover answer's delegated mailboxes; the <code>#Users</code> namespace is what works.</li>
</ul>
<h3><a class="anchor-offset" name="where-to-read-more"></a>Where to read more</h3>
<ul>
<li>Wiki: <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Capabilities-and-Configuration" rel="nofollow ugc">Capabilities and Configuration</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Settings-Reference" rel="nofollow ugc">Settings Reference</a> (9.12), <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Connecting-a-Mail-Client" rel="nofollow ugc">Connecting a Mail Client</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Aliases-Lists-and-Public-Folders" rel="nofollow ugc">Aliases, Lists and Public Folders</a> (13.3), <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Control-Panel-Reference" rel="nofollow ugc">Control Panel Reference</a> (7.5), <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Security-Hardening" rel="nofollow ugc">Security Hardening</a> (17.5, 17.7), <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Changes-Since-6210" rel="nofollow ugc">Changes Since 6.2.10</a> (4.3, 4.4).</li>
<li>At the 6.3.4 tag: <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SendAs.md" rel="nofollow ugc">SendAs.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/EncryptionAtRest.md" rel="nofollow ugc">EncryptionAtRest.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/DeckParity.md" rel="nofollow ugc">DeckParity.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/README.md" rel="nofollow ugc">README.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/CHANGELOG.md" rel="nofollow ugc">CHANGELOG.md</a> (6.3.4, <em>IMAP, POP3 and the webmail</em>), <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/Roadmap.md" rel="nofollow ugc">Roadmap.md</a>.</li>
<li>The public documentation: <a href="https://www.progressiverobot.com/hmailserver-documentation/#343-imap-details-worth-knowing" rel="nofollow ugc">34.3 IMAP details worth knowing</a>, <a href="https://www.progressiverobot.com/hmailserver-documentation/#303-imap-folders-and-permissions" rel="nofollow ugc">30.3 IMAP folders and permissions</a>.</li>
<li>On this forum: <a href="/topic/28193">Upgrading to 6.3.4</a>, <a href="/topic/28192">The Control Deck</a>, <a href="/topic/28264">The REST API: turning it on</a>, <a href="/topic/28233">Message storage: object storage and encryption at rest</a>, <a href="/topic/28238">What runs out first: pools, connections, large folders</a> and <a href="/topic/28272">Monitoring and health</a>.</li>
<li>A client that does not get on with these answers is a bug: a GitLab issue or, without a GitLab account, an email to <a href="mailto:contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com" rel="nofollow ugc">contact-project+hmailserver-hmailserver-86730559-issue-@incoming.gitlab.com</a>, filed as a confidential issue (<a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/SUPPORT.md" rel="nofollow ugc">SUPPORT.md</a>). A vulnerability goes only by <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/SECURITY.md" rel="nofollow ugc">SECURITY.md</a>'s routes.</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28224/imap-and-pop3-on-the-server-capabilities-switches-shared-mailboxes-search-limits</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:53 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28224.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:06:13 GMT</pubDate><ttl>60</ttl></channel></rss>