Why isn't disk space reduced after deleting mails through IMAP with Dovecot?

I'm running an email server with OpenSMTPD and Dovecot on Linux and accessing emails using IMAP with a Thunderbird client. When I delete an email in Thunderbird, why doesn't disk space usage go down?

As an example, one user's mbox files are stored in /var/vmail/${domain}/$[user}/:

$ ls
Archives  Drafts  inbox  Sent  Spam  TrainSpam  Trash

I'm not sure if mbox files are sparse files, so instead of du (which also shows the issue), I expect ls will have the most accurate "effective" file sizes, so I added up all sizes of all files in this directory:

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

Next, I go to Thunderbird, and delete a large email with attachment which shows a size of 1MB. Thunderbird sends it to the Deleted folder, then I go to the Deleted folder, delete it there, confirm the permanent deletion dialog and re-count the file sizes:

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

So it went down 1 byte. Perhaps it's just marking it deleted? How to I actually get back the disk space? I understand this may be non-trivial since an mbox file is just a huge, flat file.

1
задан 10 November 2018 в 07:57
2 ответа

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

$ doveadm expunge -u $user@$host mailbox Trash all
1
ответ дан 3 December 2019 в 17:33

В формате 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, они не удаляются физически. Даже очистка корзины не избавляет от их. Вместо этого они отмечены для удаления и скрыты от просмотра. Oни физически не удаляются, пока вы не «сжали» папку. Это компромисс для повышения производительности в больших папках.

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

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

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

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

3
ответ дан 3 December 2019 в 17:33

Теги

Похожие вопросы