我正在维护一个运行 FreeBSD 的 IMAP 服务器,该服务器使用 exim 4.80 作为其 MTA。现在我尝试创建一个电子邮件别名,以便我可以向系统的所有用户发送有关计划停机时间等的通知。这个想法是将邮件[email protected]
转发给系统上的所有用户。
我最初考虑使用一个简单的/etc/aliases
条目,但发现这不是我想要的,因为系统用户可能已经安装了 Sieve 过滤器,除了少数列入白名单的邮件外,它会丢弃所有传入的邮件。
我确实注意到,可以使用以下方式让 exim 立即将邮件发送到本地 Maildir 目录(绕过任何其他 MDA,从而绕过 Sieve 过滤器)附加文件传输- 但如何才能让一封收到的邮件vmailusers
重定向到多种的本地邮件目录?
答案1
您可以使用重定向路由器来处理别名消息。这也是运行用户提供的脚本/转发文件的路由器。路由器的处理从上到下进行,因此下面的示例大致如下:
- 路由器
syswide_alias
检查/etc/aliases
文件中的别名。如果找到,则路由序列重新启动。 - forced_delivery 进行相同的检查,但这次它使用的
original_local_part
变量为空(如果未进行转发)。如果查找成功,则邮件已发送。在这种情况下,处理停止(因为已进行发送),因此用户可能拥有的任何筛选或转发都将被忽略。 - 如果
forced_delivery
路由器拒绝,.forward
则将处理该文件。如果此文件包含别名,则路由序列将重新启动。 - 最后,邮件被投递到用户的邮箱。只有当上一步中的过滤文件没有导致有效投递(即,它不包含转发别名,或者没有完全丢弃邮件)时,才会发生这种情况。
该routers
部分应如下所示:
syswide_alias:
driver = redirect
allow_defer
allow_fail
data = ${lookup{$local_part}lsearch{/etc/aliases}}
forced_delivery:
driver = accept
allow_defer
transport = local_delivery
condition = ${if eq {${lookup{$original_local_part}lsearch{/etc/aliases}}}{}{no}{yes}}
user_filters:
driver = redirect
allow_defer
allow_fail
allow_filter
file = ${home}/.forward
normal_delivery:
driver = accept
check_local_user
transport = local_delivery
和syswide_alias
路由器forced_delivery
都有这个allow_defer
选项,如果找不到文件则需要这个选项(可能不会出现这种情况,但无论如何也不会造成损害)
编辑:上述示例现在包含了实现问题目标所需的一整套路由器。