因此,我尝试使用 cronjob 在 Dovecot 中设置消息的自动删除,以每天doveadm expunge
和每周运行一次doveadm purge
,根据给定的标准清除旧消息(主要是垃圾箱和垃圾文件夹中的内容,其他所有内容我都存档)。
问题在于如下的删除命令:
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
设置时间,以便我可以真正完成上述工作,如果没有,是否有其他方法可以实现相同的目标?
答案1
我找到的解决方案是向即将删除的消息添加自定义标志。我在夜间脚本中执行此操作,如下所示:
#!/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) - 最后,在第三次传递时,该消息实际上已从 的存储中清除
mdbox
。(3)
如果脚本每 24 小时运行一次,那么在消息被阅读(标记为Doomed
)和实际被删除之间至少会有 24 小时的延迟。然后,mdbox
消息完全消失之前还需要 24 小时。
- 将邮件标记为
Doomed
很可能涉及针对每个用户和每个邮箱行为的更多单独命令,并且应先执行任何类型的存档操作。例如,在我的情况下,我将旧邮件从受保护的邮箱移动到免于删除的存档邮箱(并使用 alt-move 移动到压缩存储)。 - 如果您不使用
mdbox
(尽管在我看来每个人都应该使用),那么添加标志的步骤\Deleted
可以用 替换expunge
,在这种情况下可以删除最后两个命令。 mdbox
在没有基于账户的设置中,该purge
命令是无操作的。