<?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[Quotas, retention and the archive: how much mail the server keeps, and for how long]]></title><description><![CDATA[<p dir="auto">This topic covers how much mail an hMailServer 6.3.4 server keeps, and for how long: each mailbox's <strong>limit</strong> and the quota policy 6.3.4 adds around it; <strong>retention</strong>, the administrator's and each person's, with the recover-deleted window; and the <strong>server archive</strong> under <code>ArchiveDir</code>. The one thing to know first: <strong>out of the box nothing is deleted because of its age.</strong> A new account has no limit (<code>0</code>), no domain has a retention policy, the archive is off, and once it is on, <code>ArchiveRetentionDays</code> is <code>0</code>, keep for ever.</p>
<h3><a class="anchor-offset" name="the-limit-and-what-a-full-mailbox-does"></a>The limit, and what a full mailbox does</h3>
<p dir="auto"><strong>Where it is set.</strong> <code>Account.MaxSize</code> over COM, <code>max_size_mb</code> over REST, in megabytes; <code>0</code>, the default, is no limit. Set it on the Control Panel's account dialog (<strong>Quota (MB)</strong>, Windows only), in the Control Deck's account editor, with <code>PUT /api/v1/accounts/{address}</code>, in the <code>max_size_mb</code> column of an accounts CSV file (since 6.3.4), or with <code>Set-HmAccount</code>. A domain's <strong>Limits</strong> tab caps the whole domain (<strong>Maximum domain size (MB)</strong>, <code>0</code> for none; once reached, delivery to its mailboxes fails) and sets the quota new accounts get.</p>
<p dir="auto"><strong>What counts</strong> is each message's original size: compression does not lower it, and a mailbox encrypted at rest keeps its sizes in the clear. The kept copy of a message the person sent to expire counts against their quota (413, <code>quota_exceeded</code>).</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Where</th>
<th>At the limit</th>
</tr>
</thead>
<tbody>
<tr>
<td>SMTP <code>RCPT TO</code>, with <code>RejectFullMailboxAtRcpt</code> on (<code>1</code>, the default)</td>
<td>A mailbox already at or over its limit, and past any grace (below), is answered <code>452 4.2.2 Mailbox is full.</code>, a temporary refusal: the sending server keeps the message and retries</td>
</tr>
<tr>
<td>A message that arrives while there is room and would overflow it</td>
<td>Caught at delivery, with a non-delivery report to the envelope sender</td>
</tr>
<tr>
<td><code>RejectFullMailboxAtRcpt</code> at <code>0</code></td>
<td>Accepted, then bounced to an envelope sender that spam has usually forged. Leave it on</td>
</tr>
<tr>
<td>IMAP <code>APPEND</code>, <code>COPY</code>, <code>MOVE</code></td>
<td>Refused with <code>[OVERQUOTA]</code>, so a client can tell a full mailbox from any other refusal</td>
</tr>
<tr>
<td><code>APPEND</code> into a folder shared from another mailbox</td>
<td>Since 6.3.4 charged to the folder's owner, as <code>COPY</code> and <code>MOVE</code> were</td>
</tr>
<tr>
<td>A migration or PST import job</td>
<td>Pauses with <em>the account has no room left under its quota</em> and tries again; raise the limit or make room</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>A full disk is a different refusal.</strong> Below <code>MinimumFreeDiskSpaceMB</code> (100) free on the store's volume, <code>MAIL FROM</code> gets <code>452 4.3.1 Insufficient system storage.</code> and IMAP <code>APPEND</code> <code>NO [UNAVAILABLE]</code>, for every mailbox. The log warns first, below <code>DiskSpaceWarningThresholdMB</code> (1024).</p>
<p dir="auto"><strong>What the person sees.</strong></p>
<ul>
<li>The webmail's <strong>Storage</strong> page (since 6.3.2, <code>GET /api/v1/me/storage</code><img src="https://www.hmailserver.co.uk/assets/plugins/nodebb-plugin-emoji/emoji/android/1f61e.png?v=6eecd33477c" class="not-responsive emoji emoji-android emoji--disappointed" style="height:23px;width:auto;vertical-align:middle" title="):" alt="😞" /> the share used, every folder by size, the twenty largest messages, and a clean-up of Trash and Junk older than 7, 30 or 90 days, or everything. See <a href="/topic/28191">The webmail portal at /portal</a>.</li>
<li><code>GET /api/v1/me</code> answers <code>quota</code> with <code>limit_mb</code> and <code>used_bytes</code>.</li>
<li><strong>IMAP QUOTA</strong>: <code>QUOTA=RES-STORAGE</code> is advertised; <code>GETQUOTA</code> and <code>GETQUOTAROOT</code> answer one unnamed root for the whole account with <code>STORAGE</code> in kilobytes, and an empty list for an account with no limit. <code>SETQUOTA</code> is refused: the limit is the administrator's. It is on as seeded; the switch is <code>imap_quota_enabled</code> on <code>PUT /api/v1/settings</code> (<code>IMAPQuotaEnabled</code> over COM).</li>
</ul>
<h3><a class="anchor-offset" name="the-quota-policy-since-6.3.4"></a>The quota policy (since 6.3.4)</h3>
<p dir="auto">The server-wide warning at <code>QuotaWarningPercent</code> (90) has been there since 6.2.22-pre6. Schema 6061 adds a domain's own warning share and words, a grace and a send-stop, each a share of the limit; schema 6088 lets an account hold its own shares too.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Point</th>
<th>Server</th>
<th>Domain (<code>-1</code> takes the server's)</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td>Warning</td>
<td><code>QuotaWarningPercent</code>, 90; <code>0</code> warns nobody</td>
<td><code>quota_warning_percent</code></td>
<td>The delivery that takes the mailbox across this share sends its owner one notice, from the domain's postmaster</td>
</tr>
<tr>
<td>Grace</td>
<td><code>quota_grace_percent</code>, 0</td>
<td><code>quota_grace_percent</code></td>
<td>How far past the limit mail from other people is still accepted</td>
</tr>
<tr>
<td>Send-stop</td>
<td><code>quota_send_stop_percent</code>, 0 (never)</td>
<td><code>quota_send_stop_percent</code></td>
<td>The share at which the account can no longer send</td>
</tr>
</tbody>
</table>
<p dir="auto">Over COM (Windows): <code>Settings.QuotaGracePercent</code>, <code>Settings.QuotaSendStopPercent</code>, and <code>Domain</code> properties of the same names.</p>
<p dir="auto"><strong>The warning is sent once</strong>, by the delivery that crosses the threshold; nothing records who was warned, so a mailbox emptied and filled again is warned again.</p>
<p dir="auto"><strong>The grace is for mail other people send</strong>, the mail otherwise lost. A 1 GB mailbox with a 50% grace receives until it holds 1.5 GB; the owner's own saves and copies over IMAP and the webmail stop at the limit.</p>
<p dir="auto"><strong>The send-stop refuses the account, not the address.</strong> An authenticated <code>MAIL FROM</code> is refused with <code>552 5.2.2</code> and the reason, keyed on the account that signed in, even under a domain alias, not the address it named. Receiving goes on. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/QuotaPolicy.md" rel="nofollow ugc">QuotaPolicy.md</a> describes the refusal at SMTP only; test the webmail's send and the send API before relying on it there.</p>
<p dir="auto"><strong>The words</strong> are the <code>QUOTA_WARNING_SUBJECT</code> and <code>QUOTA_WARNING</code> server messages, with <code>%MACRO_MAILBOX%</code>, <code>%MACRO_QUOTA%</code> (MB), <code>%MACRO_USED%</code> (MB) and <code>%MACRO_PERCENT%</code>. Server messages are server-wide (the Control Panel's <strong>Mail flow &amp; delivery → Server messages</strong>, the Deck's Server messages page, <code>PUT /api/v1/settings/messages/{name}</code>). A domain sets its own subject and text, <code>quota_warning_subject</code> and <code>quota_warning_text</code> (<code>Domain.QuotaWarningSubject</code>, <code>Domain.QuotaWarningText</code>), so its people can be warned in their own language. They are chosen apart: a domain that sets only the text keeps the server's subject.</p>
<p dir="auto"><strong>Levels.</strong> The warning is a <em>preference</em>: the deepest level holding a value wins. The grace and the send-stop are <em>limits</em>: an account's own value may tighten its domain's, never loosen it, while a domain's may sit either side of the server's. The domain's shares are the domain administrator's, and a domain-restricted key's. <code>&lt;name&gt;_effective</code> and <code>&lt;name&gt;_source</code> on the domain and account routes say why a mailbox was not warned. An account's own quota shares are tested only through what the routes answer, and only on Windows. The mechanism is in <a href="/topic/28222">Settings: what is not stock, when a save takes effect, and the three levels</a>.</p>
<p dir="auto"><strong>Where it is set.</strong></p>
<ul>
<li><strong>Control Deck:</strong> the domain editor's <em>Quota policy</em> group; the server's grace and send-stop on the Settings page.</li>
<li><strong>Control Panel</strong> (Windows): the domain dialog's <strong>Limits</strong> tab; the server's grace and send-stop under SMTP, beside <code>QuotaWarningPercent</code>.</li>
<li><strong>REST:</strong> the five domain keys on <code>PUT /api/v1/domains/{name}</code>; the server's two on <code>PUT /api/v1/settings</code>.</li>
<li><strong>An account's own value:</strong> the <strong>Levels</strong> tab of the Control Panel's account dialog, the Deck account editor's levels card, <code>hmctl account set</code>, or <code>PUT /api/v1/accounts/{address}</code>.</li>
</ul>
<p dir="auto"><code>QuotaWarningPercent</code> is a key of the settings store: set it in the Control Panel (Windows) on <strong>Connections &amp; protocols → Protocols</strong>, SMTP tab, with <code>PUT /api/v1/settings/ini/{name}</code> or <code>hmctl ini set</code>, which answer to the administrator password alone (never an API key, nor an account holding a role), or, on the Linux server itself, <code>hmailserver --set-setting</code>, not by editing <code>hMailServer.ini</code>. Every value here applies when it is saved through the server, at every level; <a href="/topic/28222">when a save takes effect</a> explains why a line edited in the file does not hold and when a value stored by <code>--set-setting</code> arrives. A backup taken before the policy restores with the server's values.</p>
<p dir="auto">One domain warned at 85%, stopped from sending at the limit and given a 20% grace, with a German subject; then one account put back on its domain's grace:</p>
<pre><code class="language-bash">hmctl domain set example.com quota_warning_percent 85
hmctl domain set example.com quota_send_stop_percent 100
hmctl domain set example.com quota_grace_percent 20
hmctl domain update example.com --set "quota_warning_subject=Ihr Postfach ist fast voll"
hmctl account set ann@example.com quota_grace_percent inherit
</code></pre>
<h3><a class="anchor-offset" name="who-is-nearest-their-limit"></a>Who is nearest their limit</h3>
<p dir="auto"><code>GET /api/v1/reports/quota</code> lists every mailbox with a limit and at least one message, nearest first: <code>megabytes</code>, <code>quota_megabytes</code>, <code>percent</code>, the <code>warns_at</code> and <code>sending_stops_at</code> points that apply to it, and a <code>state</code> of <code>ok</code>, <code>warned</code>, <code>stopped</code> or <code>over</code>. It takes <code>domain</code>, <code>top</code> (1 to 200, default 10) and <code>format=csv</code>, and ignores the date window. Its test has run on the Windows bench only. The Deck's <strong>Reports</strong> page shows it as <em>Near their quota</em>. Other than the administrator password, a credential needs <code>view_configuration</code> and <code>view_message_trace</code>. The sections <code>hmctl report</code> documents do not include it:</p>
<pre><code class="language-bash">curl -u Administrator:your-admin-password \
  "http://127.0.0.1:8443/api/v1/reports/quota?domain=example.com&amp;top=200&amp;format=csv"
</code></pre>
<p dir="auto">Nothing records what a mailbox held yesterday; per-domain storage by day is the <code>storage</code> section, in <a href="/topic/28273">Alerts, the audit trail, syslog and the journal, and per-domain reports</a>.</p>
<h3><a class="anchor-offset" name="retention-the-administrator-s-policy"></a>Retention: the administrator's policy</h3>
<p dir="auto"><code>MessageRetentionDays</code> (since 6.2.25) is set per domain and per account; there is no server value. On a domain, <code>0</code> (the default) is no policy and a number deletes mail older than that many days. On an account, <code>0</code> (the default) takes the domain's, a number is its own, and <code>-1</code> keeps for ever whatever the domain says.</p>
<p dir="auto"><strong>The sweep.</strong> <code>MailboxRetentionTask</code> runs at start-up and every six hours. It removes delivered messages whose stored creation time is older than the window, in <strong>every folder</strong> of the mailbox, through the same deletion an IMAP <code>EXPUNGE</code> performs, so the quota, the QRESYNC record and an open IMAP session all see it. <code>Utilities.RunMessageRetention</code> (COM, Windows only) runs it now and returns the count; no document names a REST route or <code>hmctl</code> verb for it, so on Linux wait for the next pass.</p>
<p dir="auto"><strong>Where it is set.</strong> On Windows the Control Panel's domain dialog (<strong>Limits</strong> tab) and account dialog (General tab); the Deck's domain and account editors; <code>message_retention_days</code> on the domain and account routes; <code>hmctl domain set</code> and <code>hmctl account set</code>. <strong>A domain's retention is the server administrator's</strong> (COM refuses a domain administrator, the domain route a restricted key); an account's own value is the domain administrator's, so an account's <code>-1</code> can switch its domain's policy off for that account.</p>
<p dir="auto"><strong>Before switching a domain's policy on:</strong></p>
<ol>
<li>Give <code>-1</code> to each account that must keep everything.</li>
<li>Decide whether what the sweep removes should be recoverable for a while (<code>recover_deleted_days</code>, below). Off, a removed message is gone.</li>
<li>Set the domain's days. It applies when saved; the next pass, at most six hours away, deletes.</li>
</ol>
<p dir="auto"><strong>Easy to miss.</strong> A <strong>restore</strong> of the built-in backup does not carry a domain's retention days: the wiki's Backup and Restore page lists them as silently reset to <code>0</code>, so re-enter them. And a <strong>legal hold</strong> outranks retention: a held account is left alone by the policy and by the person's own choices, and the log says so.</p>
<h3><a class="anchor-offset" name="each-person-s-own-retention-since-6.3.4"></a>Each person's own retention (since 6.3.4)</h3>
<p dir="auto">Three choices on the webmail's preferences page: <em>Empty Trash after</em>, <em>Empty Junk after</em> and <em>Archive Inbox mail after</em>, each never, 7, 30 or 90 days, or a year, kept as <code>retention_trash_days</code>, <code>retention_junk_days</code> and <code>retention_archive_days</code>. The same six-hourly sweep runs them after the administrator's policy. Trash and Junk (the folders designated <code>\Trash</code> and <code>\Junk</code>, or named as clients name them) are emptied of what is older; Inbox mail older than the choice is copied to the <code>\Archive</code> folder, made as a top-level <code>Archive</code> if there is none, then removed from the Inbox. That is a folder of the person's mailbox, not the server archive. A value that is not a whole number of days from 1 to 3650 is off.</p>
<h3><a class="anchor-offset" name="the-recover-deleted-window-since-6.3.4"></a>The recover-deleted window (since 6.3.4)</h3>
<p dir="auto"><code>recover_deleted_days</code> on <code>PUT /api/v1/settings</code> or the Deck's Settings view (0 to 365; <code>0</code>, off, by default) keeps a copy of what a person deletes, and of what either retention removes, for the person to put back from the webmail's <em>Recover deleted items</em>. A domain or an account may keep copies for fewer days than the level above, never more. The copies, under <code>&lt;data directory&gt;/Recoverable/&lt;account id&gt;/</code>, <strong>count against no quota</strong> and are <strong>not in the backup</strong>, so size the window with the disk in mind; the six-hourly task ends those past the window, and all of them at <code>0</code>. The person's side is in <a href="/topic/28254">The webmail in depth: search, offline mail, expiring messages, send-as and recovery</a>.</p>
<h3><a class="anchor-offset" name="the-server-archive"></a>The server archive</h3>
<p dir="auto">With <code>ArchiveDir</code> set, the server writes a copy of every message received by SMTP into a tree of its own, as received and in the clear: encryption at rest does not cover it, and the mailbox retention policy does not reach it. The layout, as the Settings Reference writes it (Windows separators, names lower-cased):</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Message</th>
<th>Where the copy goes</th>
</tr>
</thead>
<tbody>
<tr>
<td>From a local sender</td>
<td><code>ArchiveDir\&lt;senderdomain&gt;\&lt;sendername&gt;\Sent-&lt;file&gt;</code></td>
</tr>
<tr>
<td>From anybody else</td>
<td><code>ArchiveDir\Inbound\&lt;file&gt;</code></td>
</tr>
<tr>
<td>For each local recipient</td>
<td><code>ArchiveDir\&lt;recipientdomain&gt;\&lt;recipientname&gt;\&lt;file&gt;</code>, made from the first copy when there is one</td>
</tr>
<tr>
<td>A bounce or report with a null sender</td>
<td>The archive's <code>Error</code> folder, with no index row</td>
</tr>
</tbody>
</table>
<p dir="auto">The archive's settings:</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>ArchiveDir</code></td>
<td>empty (off)</td>
<td>The folder the copies go to</td>
</tr>
<tr>
<td><code>ArchiveDomains</code></td>
<td>empty (every message)</td>
<td>Comma-separated: a message is archived only when its local sender or a recipient is in a listed domain, and only the listed domains' copies are made</td>
</tr>
<tr>
<td><code>ArchiveHardLinks</code></td>
<td><code>0</code></td>
<td>Hard-link instead of copy: a promise that nothing outside the server edits a message file in place</td>
</tr>
<tr>
<td><code>ArchiveRetentionDays</code></td>
<td><code>0</code> (keep for ever)</td>
<td>Deletes archived copies older than this many days</td>
</tr>
</tbody>
</table>
<p dir="auto"><strong>Its sweep</strong> runs at start-up and every twelve hours. It removes only <code>.eml</code> files, follows no symbolic link or junction, is depth-capped, and asks the index first: a <strong>held</strong> copy stays however old.</p>
<p dir="auto"><strong>The index</strong> (since 6.2.25, schema 6029): a row per copy in <code>hm_archiveindex</code>, with who, when, what, where and whether it is held; copies made before schema 6029 have none. Search it in the Deck's <strong>Archive</strong> view (since 6.3.4), with <code>GET /api/v1/archive</code> (<code>domain</code>, <code>mailbox</code>, <code>sender</code>, <code>recipient</code>, <code>subject</code>, <code>since</code>, <code>until</code>, <code>hold=1</code>, <code>limit</code> 1 to 1000, default 200, newest first), or with <code>Utilities.SearchArchive</code> over COM (Windows). A role needs <code>view_archive</code>; a key restricted to named domains must name one of its own, and the Inbound copies are the administrator's alone. Searching the words of archived mail is an eDiscovery case's work.</p>
<p dir="auto"><strong>A hold on one copy</strong>, <code>POST /api/v1/archive/{id}/hold</code> or <code>Utilities.SetArchiveHold</code>, keeps its file and row from the sweep and from an address's erasure; <code>DELETE</code> lifts it. Holds on whole accounts and domains are eDiscovery's: see <a href="/topic/28242">Compliance: eDiscovery, legal holds, personal data, erasure and the audit trail</a>.</p>
<pre><code class="language-bash">curl -u Administrator:your-admin-password \
  "http://127.0.0.1:8443/api/v1/archive?domain=example.com&amp;sender=alice@example.com&amp;since=2026-09-01&amp;limit=50"
curl -u Administrator:your-admin-password -X POST http://127.0.0.1:8443/api/v1/archive/4471/hold
</code></pre>
<p dir="auto"><strong>Where it is set.</strong> On Windows, the Control Panel's <strong>Maintenance → Advanced</strong>, <em>Copies of mail</em> tab (<code>ArchiveDir</code>, <code>ArchiveHardLinks</code>, <code>ArchiveDomains</code>), and <code>ArchiveRetentionDays</code> on the SMTP tab of <strong>Connections &amp; protocols → Protocols</strong>. The Deck has no page for these keys: use <code>PUT /api/v1/settings/ini/{name}</code> or <code>hmctl ini set &lt;name&gt; &lt;value&gt;</code> (the administrator password only), which take effect when saved, or <code>hmailserver --set-setting NAME=VALUE</code> (with <code>sudo</code>) on the Linux server itself, which, while the service runs, waits for the next save, a reinitialise (<code>POST /api/v1/server/reinitialize</code>) or a restart.</p>
<p dir="auto"><strong>Setting one up:</strong></p>
<ol>
<li>Choose a folder <strong>outside the data directory</strong>: a full restore with the messages option replaces that directory, and an archive inside it too, held copies included.</li>
<li>On Windows, a new installation runs the service as <code>NT SERVICE\hMailServer</code>, which writes only where it is granted: approve the folder by running <code>hMailServer.exe /GrantServiceAccess</code> with <code>--approve-modify "&lt;folder&gt;"</code> from an elevated Command Prompt in the installation's <code>Bin</code> folder. It must be a full path on a fixed local drive, outside the program folder, Program Files, the Windows folder and the profiles folder: never a share, a drive's root, or a path through a junction or link.</li>
<li>On Linux the service runs as <code>User=hmailserver</code>, and the packaged unit lets it write only under <code>/var/lib/hmailserver</code>, the data directory itself, and <code>/var/log/hmailserver</code>. Every other folder is read-only to it (<code>/home</code> is not even visible), and an <code>ArchiveDir</code> it cannot write stops archiving. Make the folder writable by the <code>hmailserver</code> user, add it to the unit with a drop-in (<code>sudo systemctl edit hmailserver</code>, then under <code>[Service]</code> a <code>ReadWritePaths=</code> line naming the folder) and restart the service. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecureDefaults.md" rel="nofollow ugc">SecureDefaults.md</a> gives this drop-in for a data folder; no document gives it for the archive.</li>
<li>Set <code>ArchiveDomains</code> first if only some domains are archived, then <code>ArchiveDir</code>.</li>
<li>Send a test message and find its row in the Deck's Archive view.</li>
</ol>
<p dir="auto"><strong>Before relying on it.</strong></p>
<ul>
<li><strong>The backup does not carry it.</strong> The backup copies the data directory, and <code>hm_archiveindex</code> is not carried: back up the archive folder, and the database with its own tool for the index.</li>
<li><strong>Moving it strands the index.</strong> <code>hm_archiveindex.archivepath</code> is matched as an exact string by the sweep, holds and erasure; do not rewrite it in bulk. If the folder moves, move it back or accept that older rows point at the old place.</li>
<li><strong>A mailbox move leaves the archive under the old address</strong>, and an address's erasure with the archive included leaves the copies in other people's trees and in <code>Inbound</code> until <code>ArchiveRetentionDays</code> ages them out.</li>
<li><strong>It is not journaling</strong>, which sends a copy elsewhere and keeps nothing here: <a href="/topic/28271">Journaling and dual delivery</a>.</li>
<li><strong>SMTP, as documented.</strong> No 6.3.4 document says whether mail the server queues itself, such as the webmail's send, or mail a fetch account collects, is archived.</li>
</ul>
<h3><a class="anchor-offset" name="what-it-does-not-do"></a>What it does not do</h3>
<ul>
<li><strong>No message-count quota</strong>: storage is the only quota enforced.</li>
<li><strong>No server-wide retention policy</strong>, and no documented way to run the retention sweep on demand on Linux.</li>
<li><strong>No write-once archive</strong>: a hold is a flag an administrator can lift.</li>
<li><strong>The archive only grows</strong> while <code>ArchiveRetentionDays</code> is <code>0</code>, and the recover-deleted store is bounded by its window alone: watch the disk they are on.</li>
</ul>
<h3><a class="anchor-offset" name="where-to-read-more"></a>Where to read more</h3>
<ul>
<li>Documents at v6.3.4: <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/QuotaPolicy.md" rel="nofollow ugc">QuotaPolicy.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingLevels.md" rel="nofollow ugc">SettingLevels.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Reports.md" rel="nofollow ugc">Reports.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/RecoverDeleted.md" rel="nofollow ugc">RecoverDeleted.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Discovery.md" rel="nofollow ugc">Discovery.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Backup.md" rel="nofollow ugc">Backup.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/RelocatingAnInstallation.md" rel="nofollow ugc">RelocatingAnInstallation.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/PersonalData.md" rel="nofollow ugc">PersonalData.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Journaling.md" rel="nofollow ugc">Journaling.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecureDefaults.md" rel="nofollow ugc">SecureDefaults.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SettingsApply.md" rel="nofollow ugc">SettingsApply.md</a>.</li>
<li>Wiki: <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Settings-Reference" rel="nofollow ugc">Settings Reference</a> (section 9.13), <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Your-First-Domain-and-Mailbox" rel="nofollow ugc">Your First Domain and Mailbox</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Compliance-and-eDiscovery" rel="nofollow ugc">Compliance and eDiscovery</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Backup-and-Restore" rel="nofollow ugc">Backup and Restore</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/APIs-Reference" rel="nofollow ugc">APIs Reference</a>.</li>
<li>The documentation page: <a href="https://www.progressiverobot.com/hmailserver-documentation/#storage-retention-and-archive" rel="nofollow ugc">Storage, retention and archive</a>, <a href="https://www.progressiverobot.com/hmailserver-documentation/#2411-queue-quarantine-and-archive" rel="nofollow ugc">Queue, quarantine and archive</a>.</li>
<li>On this forum: <a href="/topic/28221">Backup and restore</a>, for what a restore resets; <a href="/topic/28244">Relocating an installation, and moving or renaming a mailbox</a>, for the archive index; <a href="/topic/28227">the service account on Windows</a> and <a href="/topic/28245">the Linux unit</a>, for the folders the service may write; <a href="/topic/28192">The Control Deck</a>.</li>
</ul>
]]></description><link>https://www.hmailserver.co.uk/topic/28236/quotas-retention-and-the-archive-how-much-mail-the-server-keeps-and-for-how-long</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:50 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28236.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:18:13 GMT</pubDate><ttl>60</ttl></channel></rss>