Назад | Перейти на главную страницу

Почему после удаления почты через IMAP с помощью Dovecot не уменьшается дисковое пространство?

Я использую почтовый сервер с OpenSMTPD и Dovecot в Linux и получаю доступ к электронной почте с помощью IMAP с помощью клиента Thunderbird. Когда я удаляю письмо в Thunderbird, почему не уменьшается использование дискового пространства?

Например, файлы mbox одного пользователя хранятся в / var / vmail / $ {domain} / $ [user} /:

$ ls
Archives  Drafts  inbox  Sent  Spam  TrainSpam  Trash

Я не уверен, что файлы mbox являются разреженными, поэтому вместо du (что также показывает проблему), я ожидаю ls будут иметь наиболее точные "эффективные" размеры файлов, поэтому я сложил все размеры всех файлов в этом каталоге:

$ ls -al | grep vmail | awk '{print $5}' | paste -sd+ | bc
1119217444

Затем я перехожу в Thunderbird и удаляю большое электронное письмо с вложением размером 1 МБ. Thunderbird отправляет его в папку «Удаленные», затем я перехожу в папку «Удаленные», удаляю ее там, подтверждаю диалог безвозвратного удаления и повторно подсчитываю размеры файлов:

$ ls -al | grep vmail | awk '{print $5}' | paste -sd+ | bc
1119217443

Таким образом, он опустился на 1 байт. Может, просто отметка как удаленная? Как мне вернуть дисковое пространство? Я понимаю, что это может быть нетривиально, поскольку файл mbox - это просто огромный плоский файл.

В формате MBOX сообщения хранятся в одном огромном файле одно под другим с очень простой структурой:

From envelope-sender@example.com  Sat Nov 10 06:00:00 2018
From: Author <author@example.com>
To: Recipient <recipient@example.com>
Subject: Sample message 1

Message body.
>From is escaped. Otherwise it would break the MBOX file.

From envelope-sender@example.net  Sat Nov 10 06:30:00 2018
From: Author <author@example.net>
To: Recipient <recipient@example.com>
Subject: Sample message 2

Another message body.

Следовательно, удаление сообщения из середины файла приведет к перезаписи остальной части файла, что может отрицательно сказаться как на производительности, так и на целостности данных, поскольку файл может быть поврежден, если запись будет прервана.

Одно из решений - пометить сообщение как удаленное, а не удалять его на самом деле, поскольку для этого требуется изменить только одну строку, сохранив остальную часть файла нетронутой. Это позволяет позже объединить несколько удалений в одну операцию.

Статья MozillaZine о Сжатие папок объясняет это с точки зрения Thunderbird:

Когда вы удаляете сообщения в почтовом клиенте, таком как Thunderbird, они не удаляются физически. Даже очистка корзины не избавит от них. Вместо этого они отмечены для удаления и скрыты от просмотра. Они не удаляются физически, пока вы не «уплотните» папку. Это компромисс для повышения производительности в больших папках.

Статья Dovecot о Формат почтового ящика Mbox объясняет, как Dovecot решает проблемы с форматом MBOX. Удаление сохраняется в X-Status: D заголовок добавлен в заголовки сообщений.

Dovecot использует заголовки, совместимые с C-Client (например, UW-IMAP, Pine), в сообщениях mbox для хранения метаданных. Эти заголовки:

  • X-IMAPbase: Содержит UIDVALIDITY, последний использованный UID и список использованных ключевых слов
  • X-IMAP: То же, что X-IMAPbase, но также указывает, что сообщение является «псевдосообщением».
  • X-UID: Выделенный UID сообщения
  • Status: R (\ Seen) и O (не \ Недавние) флаги
  • X-Status: A (\ Ответил), F (\ Flagged), T (\ Draft) и D (\ Удалено) флаги
  • X-Keywords: Ключевые слова сообщения
  • Content-Length: Длина тела сообщения в байтах

Когда какой-либо из этих заголовков существует, Dovecot рассматривает их как свои собственные личные метаданные. Он проверяет их работоспособность, поэтому заголовки также могут быть изменены или полностью удалены. Ни один из этих заголовков не отправляется клиентам IMAP / POP3, когда они читают почту.

Нашел команду dovecot:

$ doveadm expunge -u $user@$host mailbox Trash all