我正在设置本地开发虚拟机,并且能够重定向virtual_alias_maps
所有发送出去的电子邮件都使用这个条目发送到本地邮箱/.*/ username
。
我想添加一个选项不是将电子邮件重定向到本地邮箱如果该电子邮件包含特定的标题。
或者换句话说;如果在发送的电子邮件中发现某个标题,则发送它,但如果缺少该标题,则应将其重定向到本地邮箱。
我如何使用 Postfix 实现这一点?
非常感谢你的帮助!
答案1
从 tpml7 中提取伪代码
if header exist (postfix will checks via header_cheks)
no rewrite --> different instance
else
rewrite with virtual_alias_maps same instance
据我所知,如果存在某些标头,postfix 可以重定向电子邮件。请参阅重定向功能手册 header_checks。
不幸的是 - 根据上述伪代码 - 您的请求正在重定向电子邮件如果某个标头不存在。我已经尝试了一些简单的解决方法。但由于您的请求没有得到直接支持,因此此解决方案有点复杂。特别是此解决方案需要了解Postfix 多实例。
我将在这里写出大纲 - 而不是精确的一步一步 - 如果还有什么不清楚的地方,请随时询问。
为此,您需要两个多实例。第一个实例正在执行 header_checks,第二个实例正在执行正常传出。
第一个实例将在 中定义两个 smtpd 守护进程master.cf
。一个守护进程(默认)监听 *:25,第二个守护进程监听 127.0.0.1:12525。
第二个实例将监听 127.0.0.1:22525
第一个例子
##main.cf
# your header filter
header_checks = pcre:/path/to/header_checks
# no rewriting
receive_override_options = no_address_mappings
# send to second instance
relayhost = [127.0.0.1]:22525
virtual_alias_maps = pcre:/your/catch-all
##master.cf
# second smtpd but with rewriting enabled
[127.0.0.1]:12515 inet n - n - - smtpd
-o receive_override_options=
# /path/to/header_checks
/^MyHeader/ FILTER smtp:[127.0.0.1]:12525
第二审
只需像第一个 postfix 实例一样进行设置,无需 header_checks、relayhost、virtual_alias_maps 和 accept_override_options(普通 postfix 安装)。设置 master.cf,使其仅在 [127.0.0.1]:22525 处监听。设置myhostname
后,它将与第一个实例不同。
答案2
首先我们在 中定义两个 smtpd 进程master.cf
,一个启用重写,另一个禁用重写。启用重写的 SMTPD 默认存在于 master.cf 中。现在我们将这些行
127.0.0.1:2525 inet n - n - 2000 smtpd
-o receive_override_options=no_header_body_checks,no_address_mappings
这将启用另一个 smtpd 进程
- 监听端口 localhost IP 端口 2525
- 禁用 header_checks 功能和重写功能。
这是您的请求的伪代码
if header exist (postfix will checks via header_cheks)
no rewrite
else
rewrite with virtual_alias_maps
我们将实现该逻辑header_checks。
添加此行main.cf
header_checks = regexp:/etc/postfix/mycustomheader
内容/etc/postfix/mycustomheader
/^X-Your-Header/ FILTER smtp:[127.0.0.1]:2525
怎么运行的
每当 postfix 检测到X-你的标题在您的邮件中,它会将电子邮件重定向到我们之前定义的第二个 smtpd 进程。如果标头不存在,您的电子邮件将通过启用重写的默认 smtpd 进程。