在我的邮件服务器上,我有一些按类别分组的别名。这些别名存储在带有 postmap 的哈希数据库中。
aaa@domain foo-filter@domain
bbb@domain foo-filter@domain
ccc@domain bar-filter@domain
ddd@domain foo-filter@domain
...
foo-filter@domain mymailbox@domain
bar-filter@domain mymailbox@domain
...
我的目标是通过添加自定义标头来围绕 foo-filter 和 bar-filter 地址构建自动过滤。我创建了一个标头检查:
/(.+filter)@domain/ PREPEND X-MyCustomFilter: $1
我将其添加到 main.cf:
smtpd_recipient_restrictions = (...) check_recipient_access pcre:/etc/postfix/addheader
当我向 aaa@domain 发送邮件时,不会创建标头,只有当我直接向 foo-filter@domain 发送邮件时才会创建,这违背了使用不同地址的目的。
我也会接受使用 mysql 查找的解决方案,因为相同的数据也可在 mysql 表中使用。
答案1
我找到了一个简单的/强力的解决方案。这不是我所期望的,但也许值得在这里发布,因为我在此过程中遇到了很多小事故。
解决方案:硬编码的正则表达式表
由于我无论如何都会生成别名文件,因此我现在只需生成第二个文件,categories
该文件名为,每个别名都有一行,如下所示:
/^aaa@domain/ PREPEND X-Category: foo
/^bbb@domain/ PREPEND X-Category: foo
/^ccc@domain/ PREPEND X-Category: bar
/^ddd@domain/ PREPEND X-Category: bar
顺便说一下,之间的第一部分/
是一个与 exakt 地址匹配的正则表达式,其中^
标记开始,因此我不会遇到aaa@domain
和的麻烦aaaa@domain
。(在此处查看更多信息:http://www.postfix.org/regexp_table.5.html)
来自文档:
按照表中指定的顺序应用模式,直到找到与输入字符串匹配的模式。
这意味着这个解决方案有一个警告:像这样的硬编码大概对于大型服务器来说不可行。(我的服务器仅服务于两个邮箱)
我在调试时发现的其他有用的东西:
确保最后一行也是换行符,否则将无法识别。然后将此内容添加到 main.cf:
smtpd_recipient_restrictions = (...) check_recipient_access regexp:/path/to/categories
重新加载一次 postfix。类别文件更改时无需重新加载。
非常有用的命令来检查一切是否正常,而无需发送 20k 封测试邮件,如下所示:
postmap -q "aaa@domain" regexp:/path/to/categories
这一切是为了什么:现在我可以使用 sieve 过滤器来检查该类别。我们使用了很多别名,在创建别名时设置类别变得很容易,而不必去将新别名添加到 sieve 脚本中。