我想在我的 Postfix 邮件服务器上实施自毁电子邮件地址规则。想法是拥有如下公共地址:
[email protected]
其中0220
地址表示“2020 年 2 月”。如果 Postfix 在 2020 年 3 月 1 日之前收到发往此地址的电子邮件,它将被发送到某个非公开电子邮件(例如[email protected]
),但在此日期之后,电子邮件将被丢弃(/dev/null
)。
这样的系统可以让我拥有无数个临时地址。
Postfix 允许使用正则表达式匹配收件人地址,但如何根据时间进行条件重写?
答案1
做出任何合适的查找表通过添加足够动态的查找方法来动态化,例如SQLite。如果后缀本身会发送邮件(没有 dovecot 等),alias
表格似乎合适。我将演示local
邮件(类似的配置可用于virtual
)。
您可以保留现有的(例如hash:
)查找并添加新方法:
alias_maps = hash:/etc/aliases sqlite:/etc/postfix/date-dependant-aliases.cf
您可能需要安装对新查找类型的支持。我选择SQLite
,因为如果我的查询不使用数据库,我就不需要设置数据库。
# /etc/postfix/date-dependant-aliases.cf
dbpath = /dev/null
expansion_limit = 1
query = WITH T (prio, forward_addr, condition) AS ( VALUES (1, '[email protected]', '%s' >= ('john' || substr(strftime('%%Y%%m', 'now'),3))), (2, 'devnull', 1=1)) SELECT forward_addr FROM T WHERE '%s' LIKE 'john____' AND condition ORDER BY prio ASC LIMIT 1;
查询解释(注意local
交付代理插入小写键为%s
,其他%
需引用):
WITH T (prio, forward_addr, condition) -- sub-query
AS ( VALUES -- with these 2 rows:
(1, '[email protected]', -- 1: real address,
'%s' >= ('john' || substr(strftime('%%Y%%m', 'now'),3))), -- if >= current months alias
-- SQLite doesnt have 2-digit dates in strftime
(2, 'devnull', 1=1)) -- 2: discard, always
SELECT forward_addr FROM T -- postfix only needs the target
WHERE '%s' LIKE 'john____' -- require matching template
-- no REGEXP support; just match 4 arbitrary chararacters
AND condition ORDER BY prio ASC LIMIT 1; -- select best match from sub-query
您应该使用以下命令验证该查询是否适合您的需要postmap
:
postmap -q john$(date +'%y%m' -d '+1 year') sqlite:/etc/postfix/date-dependant-aliases.cf
[email protected]
postmap -q john$(date +'%y%m') sqlite:/etc/postfix/date-dependant-aliases.cf
[email protected]
postmap -q john$(date +'%y%m' -d '-31 days') sqlite:/etc/postfix/date-dependant-aliases.cf
devnull
postmap -q john1801 sqlite:/etc/postfix/date-dependant-aliases.cf
devnull
请注意propagate_unmatched_extensions
参数(参见man 5 postconf
和man 5 aliases
),如果地址扩展(+foo)先前未匹配,它会改变行为。