Postfix

Postfix + Dovecot + Sieve + forwarding + sieve

  • June 14, 2018

假設我的域位於 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 的別名 viavirtual在任何操作之前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";
 }
}

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