我正在尝试设置 Postfix (2.11.4) 配置以便它执行以下操作:
- 发送来自本地服务器的邮件
- 接受单个别名的传入邮件,该别名实际上指向一个脚本
- 仅此而已
以下是部分 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]
。重写的罪魁祸首是参数myorigin
和append_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
== $myhostname
myserver.example.com 到george
。
因为 $myhostname (myserver.example.com) 在 `mydestination 中列出,所以 postfix 将尝试通过以下方式检查用户存在性:
- 检查用户 (george) 是否在 myserver.example.com 上列为本地用户
- 检查用户 (george) 是否定义在
alias_maps
如果用户不符合两项检查,电子邮件将被退回。否则电子邮件将被发送到本地邮箱。
建议的解决方案
从问题来看,你似乎想重写 george ->[电子邮件保护]相反,乔治 ->[电子邮件保护]。然后你可以改变参数myorigin
成为$mydomain
。在main.cf
myorigin = $mydomain