我怎样才能让 exim 将一封收到的邮件发送到多个本地邮件目录?

我怎样才能让 exim 将一封收到的邮件发送到多个本地邮件目录?

我正在维护一个运行 FreeBSD 的 IMAP 服务器,该服务器使用 exim 4.80 作为其 MTA。现在我尝试创建一个电子邮件别名,以便我可以向系统的所有用户发送有关计划停机时间等的通知。这个想法是将邮件[email protected]转发给系统上的所有用户。

我最初考虑使用一个简单的/etc/aliases条目,但发现这不是我想要的,因为系统用户可能已经安装了 Sieve 过滤器,除了少数列入白名单的邮件外,它会丢弃所有传入的邮件。

我确实注意到,可以使用以下方式让 exim 立即将邮件发送到本地 Maildir 目录(绕过任何其他 MDA,从而绕过 Sieve 过滤器)附加文件传输- 但如何才能让一封收到的邮件vmailusers重定向到多种的本地邮件目录?

答案1

您可以使用重定向路由器来处理别名消息。这也是运行用户提供的脚本/转发文件的路由器。路由器的处理从上到下进行,因此下面的示例大致如下:

  1. 路由器syswide_alias检查/etc/aliases文件中的别名。如果找到,则路由序列重新启动。
  2. forced_delivery 进行相同的检查,但这次它使用的original_local_part变量为空(如果未进行转发)。如果查找成功,则邮件已发送。在这种情况下,处理停止(因为已进行发送),因此用户可能拥有的任何筛选或转发都将被忽略。
  3. 如果forced_delivery路由器拒绝,.forward则将处理该文件。如果此文件包含别名,则路由序列将重新启动。
  4. 最后,邮件被投递到用户的邮箱。只有当上一步中的过滤文件没有导致有效投递(即,它不包含转发别名,或者没有完全丢弃邮件)时,才会发生这种情况。

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选项,如果找不到文件则需要这个选项(可能不会出现这种情况,但无论如何也不会造成损害)

编辑:上述示例现在包含了实现问题目标所需的一整套路由器。

相关内容