我可以这样做吗:
mv
一封来自 Postfix 保留队列的电子邮件说,/tmp/foo/
。将电子邮件保留
/tmp/foo/
任意一段时间(从几秒到几天)。在此期间,Postfix 服务器甚至可能会被退回一次或多次。然后,在我选择的时间,
mv
这封电子邮件从/tmp/foo/
Postfix 保留队列返回......所有这些都没有任何队列 ID 冲突和导致的电子邮件覆盖?
根据这个关联,队列 ID 只能保证在 1 秒间隔内是唯一的!我不确定这是否仍然正确。
如果我不能做到上述的事情,那么我可以这样做吗:
在 Postfix 之外生成一个新的 11 个字符的队列 ID(例如,使用
mktemp
),该 ID 在 Postfix 保持队列中是唯一的(在生成时),并且mv
是否使用这个新的队列 ID将消息返回/tmp/foo/
到 Postfix 保持队列?
本质上,我的要求是将某些电子邮件保留任意一段时间;只是,不要将它们保留在 Postfix 保留队列中,而是将它们保留在其他地方。
提前谢谢了。
答案1
我的理解是 Postfix 队列 ID 有两个组成部分,一个是每秒重复的毫秒时间计数器,另一个是消息文件的 Inode 编号。
如果是这样,时间冲突的概率是 1/1000 或 0.1%,我认为这是不可靠的,因此必须仅基于 Inode 编号来管理唯一性。
当文件存在于 Postfix 队列文件系统中时,Inode 编号是唯一的,因此任何移动都必须在同一文件系统内进行,以保持 Inode 编号的唯一性。移动到另一个文件系统会释放 Postix 队列文件系统中的 Inode,从而允许 Inode 重用。大多数文件系统没有定义何时重用 Inode,有些文件系统会快速定义,因为重用缓存的空闲 Inode 比从后备存储读取速度快得多。
仅在同一文件系统约束内观察移动确实能保证在消息文件存在时队列 ID 不会被重复使用。
我不知道 Postfix 是否会在邮件返回到保留队列时对其进行处理。我希望其他人知道,这样我们就能得到完整的答案。