Я использую почтовый сервер с 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