Postfix
Postfix + Dovecot + Sieve + forwarding + sieve
假設我的域位於 exampleserver.com。我有以下篩分規則:
require ["fileinto", "subaddress", "mailbox", "variables"]; if address :detail :matches "to" "*" { set "folder" "${1}"; fileinto :create "INBOX.${folder}"; }
user@exampleserver.com 想要將郵件轉發到 xxxxx@gmail.com。它是通過 /etc/postfix/virtual 完成的
user@exampleserver.com xxxxx@gmail.com
轉發非常好,但是發送到 user+Something@exampleserver.com 的郵件現在被轉發到 user+Something@gmail.com,這是完全錯誤的。如何修復它,以便篩選的消息被重定向到 xxxxx+Something@exampleserver.com?
Postfix 的別名 via
virtual
在任何操作之前sieve
執行。因此,您必須完全禁用後綴別名並僅通過 dovecot 的篩子轉發消息。有多種模式地址與模式進行比較:...... # rule:[gmailfwd1] if header :is "to" "user@exampleserver.com" { redirect "user@gmail.com"; } # rule:[gmailfwd2] if header :contains "to" "user" { redirect "otheruser@gmail.com"; } # rule:[gmailfwd3] if header :regex "to" "user.*@exampleserver.com" { redirect "otheruser@gmail.com"; } ......
header :is
表示嚴格匹配整個收件人的地址
header :contains
表示地址的任何部分都與字元串匹配。
header :regex
表示收件人的地址與正則表達式匹配。無論如何,您必須記住
sieve
從上到下檢查規則,直到匹配某些規則。因此,您可以按某種順序對規則重新排序,這樣會在任何其他不需要的規則之前擷取並處理更具體的情況。附言
如
dovecot
手冊https://wiki.dovecot.org/Pigeonhole/Sieve/Examples#Plus_Addressed_mail_filtering中所述,所有這些都可以通過以下方式進行:require ["variables", "fileinto", "subaddress"]; if header :is :user "to" "someuser" { if header :matches :detail "to" "*" { set "tag" "${1}"; /* extract "Something" into var "tag" */ } if string :is "${tag}" "" { /* empty/no tag */ redirect "user@gmail.com"; } else { /* tag is present*/ redirect "otheruser+${tag}@exampleserver.com"; } }