Dovecot

在 Dovecot 中刪除舊郵件的最安全方法

  • February 2, 2016

因此,我正在嘗試使用 cronjob 設置自動刪除 Dovecot 中的消息,每天doveadm expunge和每週執行一次doveadm purge,以清除具有某些給定條件的舊消息(主要是垃圾和垃圾文件夾中的東西,我存檔的所有其他內容)。

問題出在如下的 expunge 命令上:

doveadm expunge -A SEEN BEFORE 7d MAILBOX Trash

這似乎是一個很好的平衡,但是如果使用者在 7 天截止日期的邊緣打開一條未讀郵件,它可能會在他們對其進行處理之前被刪除,例如將其移動到另一個郵箱。

這是我知道的一個極端情況,但我希望通過將所有新消息標記為“最近”來進行某種多階段刪除,這樣我就可以執行以下操作:

doveadm expunge -A OLD SEEN BEFORE 7d MAILBOX Trash
doveadm flags -A remove '\Recent' SEEN BEFORE 7d MAILBOX Trash

通過在刪除標誌之前刪除,\Recent這意味著在截止日期看到的任何消息都將在實際刪除之前獲得額外的一天左右。問題是我找不到任何實際描述如何設置\Recent所有新消息的內容(而且sieve似乎無法做到這一點)。

我想知道的是;有沒有辦法讓我控制何時\Recent設置,以便我可以實際完成上述工作,如果沒有,是否有另一種實現相同目標的方法?

我得到的解決方案是向即將被刪除的消息添加自定義標誌。我在我的夜間腳本中這樣做:

#!/bin/bash

# Save unread messages from their impending doom
doveadm flags remove -A 'Doomed' UNSEEN KEYWORD 'Doomed'
# Soft-delete messages that were doomed by the previous pass
doveadm flags add -A '\Deleted' KEYWORD 'Doomed' SEEN

# Doom messages older than a week. In reality this will probably be
# several commands tailored to different users and/or mailboxes
doveadm flags add -A 'Doomed' SEEN SAVEDBEFORE 7d

# Purge all messages that were expunged by the previous pass
doveadm purge -A
# Expunge all messages that were deleted in this pass
doveadm expunge -A DELETED MAILBOX '*'

這實質上為大多數郵箱設置了一個多階段刪除,包括兩個步驟,對於mdbox基於郵箱的三個步驟:

  • 首先,使用者看到的每條消息都被標記為Doomed。(1)
  • 在下一次傳遞中,所有仍然Doomed添加\Deleted標誌的消息。(2)
  • 最後在第三遍時,消息實際上是從 anmdbox的儲存中清除的。(3)

如果腳本每 24 小時執行一次,那麼這會在消息被讀取(標記為Doomed)和實際被刪除之間產生至少 24 小時的延遲。然後在mdbox消息完全消失之前還有 24 小時。

  1. 將消息標記為Doomed很可能涉及針對每個使用者和每個郵箱行為的更多單獨命令,並且應該在任何類型的歸檔操作之前進行。例如,在我的情況下,我將舊郵件從受保護的郵箱移動到免於刪除的存檔郵箱(並使用 alt-move 移動到壓縮儲存)。
  2. 如果您不使用mdbox(儘管 IMO 每個人都應該使用),那麼添加\Deleted標誌的步驟可以替換為expunge,在這種情況下,可以刪除最後兩個命令。
  3. 在沒有mdbox基於帳戶的設置中,該purge命令是無操作的。

引用自:https://serverfault.com/questions/752172