後綴虛擬別名域與正則表達式虛擬別名映射匹配
使用 Postfix (2.11.3) 我想將所有郵件重定向到外部地址。
/etc/postfix/main.cf
:virtual_alias_maps = regexp:/etc/postfix/rewrite
/etc/postfix/rewrite
:/^.+$/ hijacked@example.com
發送郵件到
destination@example.net
,出現以下錯誤:[...] to=<hijacked@example.com>, orig_to=<destination@example.net> [...] status=bounced (User unknown in virtual alias table)
文件說:
有效的收件人地址與 virtual_alias_maps 參數一起列出。Postfix SMTP 伺服器以“虛擬別名表中的使用者未知”拒絕無效收件人。
事實證明,該錯誤與驗證虛擬別名域有關:
virtual_alias_domains
預設情況下$virtual_alias_maps
,將其設置為其他任何內容(設置為不匹配的域甚至將其留空)可以解決問題。我在答案中找到的另一個解決方案是以另一種形式給出正則表達式:
/^.+@.+$/ hijacked@example.com
所以我的問題是,在使用正則表達式表進行虛擬別名時,別名域的驗證如何工作?為什麼設置
virtual_alias_domains
為其他任何東西都可以解決問題?上述兩種地址映射等效模式有何不同?的輸出
postconf -n
是:config_directory = /etc/postfix inet_interfaces = loopback-only inet_protocols = ipv4 mydestination = myhostname = example.org myorigin = $myhostname virtual_alias_domains = virtual_alias_maps = regexp:/etc/postfix/rewrite
假設在這裡你有一封郵件
destination@example.net
要投遞。使用域
virtual_alias_domains
部分(使用完整地址 ( ) 作為鍵查找其中的example.net
地圖,預計將返回重寫的地址。virtual_alias_maps``destination@example.net
這意味著您可以為兩個查找共享一個映射文件,就像virtual (5)
/etc/postfix/virtual
中解釋的簡單雜湊映射一樣。Postfix ( ) 的預設配置是假設一個這種混合風格的地圖。virtual_alias_domains = $virtual_alias_maps
example.net OK aaa@example.net hijacked@example.com bbb@example.net hijacked@example.com
這些查找的重要規則是:
virtual_alias_maps
被遞歸查找。如果它返回與密鑰相同的地址,則使用該地址。- 如果返回的最終改寫地址
virtual_alias_maps
還在 中virtual_alias_domains
,則認為查找失敗(User unknown in virtual alias table
)。這似乎沒有明確記錄,我從這個執行緒中學到了。因此,您的第一個正則表達式映射 (
/^.+$/ hijacked@example.com
) 和配置是有問題的,因為映射匹配所有內容,因此hijacked@example.com
仍然存在virtual_alias_domains
並被退回。您可以通過在 中不指定任何內容來避免它
virtual_alias_domains
,或者使用另一個與單個域字元串 ( ) 不匹配的正則表達式映射/^.+@.+$/ hijacked@example.com
。但是他們中的任何一個都不認為我是正確的配置,而是一種不直覺的解決方法。我認為會有更適合您的目的的解決方案。