Postfix

創建後綴別名“all@domain.tld”以發送給域的所有使用者

  • August 24, 2015

我使用 Postfix + Dovecot 和 MySQL 數據庫作為後端和 PostfixAdmin 來管理使用者和域。現在我正在尋找一種簡單自動化的方法來定義模式的每個域別名,all@domain.tld並將解析給給定域的所有使用者。我想設置一次,即使添加或刪除帳戶,它也應繼續按預期工作 - 因此手動創建包含帳戶列表的文件或使用某些郵件列表是沒有選擇的。

從數據庫中檢索給定域的所有現有使用者應該很容易:

SELECT username
 FROM vmail
WHERE domain='%d';

%d作為域的佔位符)。但是我怎樣才能告訴 postfix 對定向到的郵件這樣做all@domain.tld,當然只有當這樣的郵件來自受信任的來源(permit_sasl_authenticatedpermit_mynetworks?)?

我已經用Google搜尋了幾個小時,但我發現的只是“包羅萬象”(與我想要的相反)、基於 shell 腳本的解決方案(遍歷域目錄)或使用郵件-列出方法——這些都不符合我的需要。

您可以使用virtual_alias_maps定義別名 all@example.com這裡是virtual 5使用的格式。

pattern address1, address2, address3, ...

所以你需要構造查詢來連接所有行。取自該執行緒:我可以將多個 MySQL 行連接到一個欄位中嗎?,您可以使用此查詢。

SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
 FROM vmail
WHERE DOMAIN='%d'
  AND '%s'='all@%d'

這需要轉到您的mysql_virtual_alias_maps.cf並且可以使用UNION- 附加到現有查詢中,因此結果如下所示:

query = SELECT goto FROM alias WHERE address='%s' AND active = '1' UNION 
SELECT GROUP_CONCAT(CASE WHEN active='1' THEN username ELSE NULL END separator ', ')
 FROM vmail
WHERE DOMAIN='%d'
  AND '%s'='all@%d'

(可能需要全部放在一行中——此處的格式只是為了使其更易於閱讀)。


要僅允許 permit_mynetworks 和 permit_sasl_authenticated,請按以下順序放置限制

smtpd_recipient_restrictions =  ....
                       permit_mynetworks
                       permit_sasl_authenticated
                       check_recipient_access regexp:/etc/postfix/restrict.all.alias
                       reject_unauth_destination

在 /etc/postfix/restrict.all.alias 中,定義

/^all@/  REJECT access denied

當從 mynetworks 發送或由經過身份驗證的使用者發送時,它將允許向 all@domain 發送電子郵件,但之後拒絕。

引用自:https://serverfault.com/questions/716336