如何使用 Postfix 转发到动态确定的地址?

如何使用 Postfix 转发到动态确定的地址?

发送给本地用户的每条消息都必须发送到通过运行外部命令获得的地址。该命令将查看本地地址标签,对多个进程进行 API 调用,然后计算目标地址。

例如,我们可以使用用户主目录中的 .forward 文件将消息传送到命令 (|command),然后该命令也会负责转发消息。“别名或 ~/.forward 文件可以列出外部命令、目标文件名、:include: 指令或邮件地址的任意组合。”请参阅:www.postfix.org/local.8.html 另请参阅:www.postfix.org/aliases.5.html

也许它只需要调整收件人标题并通过 Postfix 重新发送消息?有些东西告诉我事情没那么简单。最简单的方法是 Postfix 本身处理整个转发工作,就像将目标地址直接写入 .forward 文件时一样。但地址是未知的;只能通过命令确定。这就是问题所在。

此外,如果无法确定目标地址,则消息必须通过命令提供的失败通知反弹。

解决方案已实施

此解决方案扩展了 Danila 的答案。具体来说,它会将邮件重定向到某些 wiki 用户(称为“管道”[2]),而不是将其转发给 wiki 中指定的“监护人”[1]。但一般来说,它应该适用于任何通过脚本动态确定目标地址的中继。

(a)在文件 /etc/postfix/main.cf 中:

transport_maps = regexp:/etc/postfix/transport.regexp
# enable transport mapping based on regular expressions

minder_destination_recipient_limit = 1
# See SINGLE-RECIPIENT DELIVERY [3].  relay-to-minder (master.cf) can handle only a
# single recipient per delivery, and flags DO have the same limitation.

(b)在文件 /etc/postfix/transport.regexp [4] 中执行传输映射:

if /^pipe\+.+@zelea\.com$/
# relay all deliveries for pipe users [2] ...
!/^pipe\+bounceSpam@/ minder:
# ... except 'bounceSpam' deliveries, via master.cf 'minder' service
endif

(c)在文件 /etc/postfix/master.cf 中,定义 'minder' 服务:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
minder    unix  -       n       n       -       1       pipe
  flags=DO user=pipe argv=/usr/local/libexec/relay-to-minder ${sender} ${recipient}
# With maxproc 1 because it's sufficient, let Postfix do all queuing.
# Both flags D and O (adding headers Delivered-To and X-Original-To) require main.cf
# minder_destination_recipient_limit=1 [3]

(d)使中继到思维脚本可由 master.cf user= 中指定的用户(管道)执行。脚本内容(包括这些配置说明的最新版本)位于http://zelea.com/system/host/havoc/usr/local/libexec/relay-to-minder

该脚本重新寻址目标标头(仍然不确定是否正确),重新寻址信封,并将其反馈给 MTA 以进行最终传送。

笔记

[1] zelea.com/w/Property:Minder

[2] zelea.com/w/Category:Pipe

[3] “pipe” 的这个含义与 [2] 不同。www.postfix.org/pipe.8.html

[4] www.postfix.org/transport.5.html | www.postfix.org/regexp_table.5.html

请原谅链接混乱。我还没有赚到足够的积分。

答案1

正确的方法是在 master.cf 中创建一个新的传输

像这样:

myscript unix -  n  n   -  40   pipe
flags=R user=vmail argv=/path/to/myscript -o SENDER=${sender} -m USER=${user} EXTENSION=${extension}

您可以使用自己的参数。

然后你可以使用正则表达式作为你的捕获规则

transport_maps = regexp:/etc/postfix/redirect_or_forward.regexp

然后在 /etc/postfix/redirect_or_forward.regexp 中

就像是:

 /^user-.*@mydomain\.com/   myscript:

阅读 postfix 文档,应该有更详细的解释。希望这能有所帮助。

相关内容