在 Postfix 中停止(大多数)本地传送

在 Postfix 中停止(大多数)本地传送

我正在尝试设置 Postfix (2.11.4) 配置以便它执行以下操作:

  1. 发送来自本地服务器的邮件
  2. 接受单个别名的传入邮件,该别名实际上指向一个脚本
  3. 仅此而已

以下是部分 main.cf:

mydomain               = example.com
inet_interfaces        = all
inet_protocols         = all
mydestination          = $myhostname, localhost.$mydomain, localhost
alias_maps             = hash:/etc/postfix/aliases
alias_database         = hash:/etc/postfix/aliases
relayhost              = outbound.example.com
allow_mail_to_commands = alias,forward,include
allow_mail_to_files    = alias,forward,include
luser_relay            = [email protected]

对于 #1,服务器上生成的邮件[电子邮件保护]自动发送到“outbound.example.com”进行处理。对于 #2,我在 /etc/postfix/aliases 中拥有此信息,因此发送到“[电子邮件保护]“可以通过 Perl 脚本处理

robot: | "/usr/local/bin/robomail.pl"

到目前为止一切顺利。但问题 #3 让我很头疼。

看看吧,这台服务器曾经运行过启用了域名伪装的 Sendmail。这台服务器上还有一些应用程序(我不要控制)发送电子邮件给“george”(例如),并期望服务器自动将其转换为“[电子邮件保护]",然后被路由到“outbound.example.com”进行传送。

我尝试通过设置luser_relay指令来修复此问题:

luser_relay = [email protected]

这种方式有效 - 当本地投递到“george”失败时,Postfix 将重写它为[电子邮件保护]

但是如果“george”实际上是服务器上的有效帐户(即在 /etc/passwd 中列出),那么 Postfix 将接受该消息并将其传递到本地邮件目录,而不是重写地址并转发。

我可以通过创建另一个 /etc/postfix/aliases 条目来解决这个问题:

george: [email protected]

但是,当服务器有几十个本地用户帐户,并且不断添加更多帐户时,这显然是不可扩展的。据我从文档中了解到,/etc/postfix/aliases 没有通配符等效项。否则,我想做这样的事情:

robot: | "/usr/local/bin/robomail.pl"
*: *@example.com

Postfix 中有办法做到这一点吗?接受“robot”的邮件,但将其他所有邮件转发到“outbound.example.com”进行投递(如果需要,添加 @example.com)?

更新: 一些 postconf 详细信息,以及在本地服务器上从“root”发送到“george”的消息日志:

myhostname = myserver.example.com
myorigin = $myhostname
masquerade_domains = 

Mar 23 14:07:26 myserver postfix/pickup[12851]: D2B4A4763D: uid=0 from=<root>
Mar 23 14:07:26 myserver postfix/cleanup[19630]: D2B4A4763D: message-id=<[email protected]>
Mar 23 14:07:26 myserver postfix/qmgr[29583]: D2B4A4763D: from=<[email protected]>, size=323, nrcpt=1 (queue active)
Mar 23 14:07:26 myserver postfix/local[19632]: D2B4A4763D: to=<[email protected]>, orig_to=<george>, relay=local, delay=0.04, delays=0.02/0/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox)
Mar 23 14:07:26 myserver postfix/qmgr[29583]: D2B4A4763D: removed

答案1

从日志来看,域名伪装进程重写发件人和收件人,从something[email protected]。重写的罪魁祸首是参数myoriginappend_at_myorigin。正如 postfix 文档所述

append_at_myorigin(默认值:是)

对于本地提交的邮件,将字符串“@$myorigin”附加到不含域信息的邮件地址。对于远程提交的邮件,则改为附加字符串“@$remote_header_rewrite_domain”。

注 1:此功能默认启用,不得关闭。Postfix 不支持无域名地址。

注 2:对于 Postfix 2.2 版本,仅当下列条件之一成立时才会发生邮件头地址重写:

  • 使用 Postfix sendmail(1) 命令接收消息,
  • 该消息是从与 $local_header_rewrite_clients 匹配的网络客户端收到的,
  • 消息从网络接收,remote_header_rewrite_domain参数指定非空值。

要获取 Postfix 2.2 版之前的行为,请指定“local_header_rewrite_clients = static:all”。

在您的配置中,postfix append $myorigin== $myhostnamemyserver.example.com 到george

因为 $myhostname (myserver.example.com) 在 `mydestination 中列出,所以 postfix 将尝试通过以下方式检查用户存在性:

  1. 检查用户 (george) 是否在 myserver.example.com 上列为本地用户
  2. 检查用户 (george) 是否定义在alias_maps

如果用户不符合两项检查,电子邮件将被退回。否则电子邮件将被发送到本地邮箱。

建议的解决方案

从问题来看,你似乎想重写 george ->[电子邮件保护]相反,乔治 ->[电子邮件保护]。然后你可以改变参数myorigin成为$mydomain。在main.cf

myorigin = $mydomain

相关内容