Sieve 篩選器撰寫 - 教學

以下是 Sieve 的程式撰寫教學,讓您了解如何撰寫 Sieve 的規則。如果您是尚未有經驗的初學者,請參考 Sieve 入門 文件。

本章節內容

本章節將透過練習來指導您如何使用 Sieve 撰寫規則。您將會學到一些基本的概念。內容將會教您如何建立以下的篩選器:

  • 拒絕超過大小限制的郵件
  • 將群組信件歸類到特定的資料夾
  • 將惡意或疑似垃圾信件歸類到垃圾信 (Junk) 資料夾中

Sieve 能設定很多篩選條件,本章節僅介紹幾個基本範例。目的在於讓您了解 Sieve 的基礎架構,讓您能在未來能自行撰寫其他規則。若您想查看更多 Sieve 的使用方法,請看 Mozilla’s Sieve 參考 中的說明。您可以 在此 查看到 Gandi 所支援的 Sieve 擴充功能與 Gandi 所提供的 範例

宣告要使用的擴充功能

首先,你要宣告你要使用的擴充功能。

Sieve 基本上已經內建了一些功能,但可安裝其他擴充功能。您的 Sieve 程式碼首行必須宣告您要使用的擴充功能。本教學中將會使用到 「fileinto」 與 「reject」。

所以您的第一行程式碼需宣告:

require ["fileinto", "reject"];

您可以在此查詢到 Gandi 郵件伺服器所支援的 擴充功能

註解

撰寫程式碼時,註解是讓編譯器可忽略的文字或段落。因此最好使用註解來描述您的程式碼用途,以便您在未來可以了解。註解還能讓別人清楚的了解您的程式碼。

使用井字號表示註解,可以將井字號後的整行內容視為註解,範例:

#This is a comment.

或是您可以註解特定的行或是多行,範例:

/* This is also a comment. */

/* This
* is
* a comment
* which spans multiple lines. * \/

您在本教學中所建立的篩選器都將包含註解,以便解釋每個步驟的用途,範例:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

建立篩選規則

我們來建立一個篩選信件大於 2MB 的規則。首先,您必須告訴篩選器您要搜尋的條件,您可以使用 if 命令,記得要撰寫註解。使用註解與 if 後,現在您的程式碼看起來應該像這樣:

# Messages bigger than 2MB will be rejected with an error message
if

接下來,您要告訴需要篩選出郵件的什麼條件,例如寄件者、收件者、主旨、寄出日期等。我們的條件式要篩選出信件的 大小

# Messages bigger than 2MB will be rejected with an error message
if size

接下來,您需要告訴篩選器如何比較您的條件與郵件的內容。這稱為 比較運算子 ,以冒號開頭。此處,我們將使用 :over 運算子。篩選器將會找出 超過 或是大於您所限制的條件。下方範例中,2000K 等於 2MB。

現在篩選比較運算子已經完成,接者告訴篩選器符合條件的信件要執行哪些動作,請使用大括號 { 來表示動作的開始,範例如下:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {

符合條件的執行動作

在您設定好條件式後,接者您要告訴過濾器需要執行什麼動作。使用雙大括號 {} 來宣告動作。在大括號內撰寫您要處理符合條件的郵件的動作。

您可以同時執行很多動作,例如歸類到指定的資料夾、刪除郵件、轉寄郵件等等。本範例會將符合條件的郵件採用 拒絕 的動作,範例如下:

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
  reject

您可以在 reject 後方加入錯誤訊息,寄件者會收到此錯誤訊息,最後以分號作為該行的結束。

小訣竅

每一行都是以分號作為結束,別忘了在最後加上分號,很重要!

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
  reject "I am unable to accept email larger than 2MB.";

在加入要執行的所有動作之後,再以一個大括號作為動作的結束,到目前為止,您的程式碼看起來應該如下:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
 reject "I am unable to accept email larger than 2MB.";
}

到此您已經完成了一個完整的篩選器!您可以暫時休息一下,但還有很多過濾條件可以練習,讓我們繼續向前!

增加其他篩選條件

您可能有很多不同類的郵件想要建立不同的篩選器。要增加不同的篩選條件,您可以用 elsif。這是 「else if」 的縮寫,讓篩選器知道若不符合第一個條件是的話,則會進行第二個條件式比對。

警告

撰寫 Sieve 程式碼時,必須將 所有 篩選器都放在同一個檔案內。當您上傳新的 Sieve 程式碼到郵件伺服器上面時,系統將會自動覆蓋舊的檔案。換句話說,您不需要建立新的檔案來撰寫新的規則,否則舊的篩選器將會遺失。

我們要建立的下一個條件式是將來自某個郵件列表的信件全部歸類到一個資料夾。使用 elsif 來開始撰寫。

# Mails from a mailing list will be put into the folder "mailinglist"
elsif

篩選器會檢查信件中的 位址 (address) 部份。您將需要找出完全符合某個位址的條件,因此您需要使用 :is。

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is

現在您已經指定了要查看郵件的特定資訊,再來需要撰寫比對的條件。此篩選器將會比對收件者 (「to」) 或寄件者 (「from」) 的位址,查找任何一個是 「mailinglist@example.com」 的值。請使用中括號,然後輸入要比對的位址,如下範例:

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com"

然後我們用大括號來標示」動作」的開始,現在程式碼看起來會像這樣:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
 reject "I am unable to accept email larger than 2MB.";
}

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com" {

將指定的信件歸類到資料夾

Sieve 篩選器最常使用到的功能之一就是將特定的郵件歸類到資料夾中。您可以使用 fileinto 命令。此命令會將郵件歸類到指定的資料夾。

此篩選器會將寄給 (或來自) mailinglist@example.com 的郵件歸類到 「mailinglist」 資料夾中。此資料夾位於 inbox 的資料夾內,所以您需要使用 「INBOX/mailinglist」 的方式來指定路徑。

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com" {
  fileinto "INBOX/mailinglist";
}

目前您的篩選器看起來應該會像這樣:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
 reject "I am unable to accept email larger than 2MB.";
}

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com" {
  fileinto "INBOX/mailinglist";
}

同時比對多個條件

若要同時比對多個條件,您可以使用 anyof 或是 allof 關鍵字。anyof 表示只要符合一個條件,或是 allof 表示要同時符合所有條件,此範例使用 anyof 來設定只要符合一個條件就會執行動作,範例如下:

# If the email isn't directly addressed to me, or if the subject has "free money" or "Nigerian
# prince" in it, put it in the spam folder.
elsif anyof

然後,您需要將條件放到括號內,不同條件用逗號分隔。第一個條件式是比對不是發送給您 (例如您是 myemailaddress@gmail.com) 的信件。我們需要使用反向 not 條件 (此範例就是找出不是寄給您的信)。因為電子郵件位址中可能包含多個其他位址,因此此篩選器需使用 :contains 來找出在收件者 (「to」)、副本 (「cc」) 或密件副本 (「bcc」) 的內容。

# If the email isn't directly addressed to me, or if the subject has "free money" or "Nigerian
# prince" in it, put it in the spam folder.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress@example.com",

下一個條件式是查看主旨中是否出現一些關鍵字。現在您必須使用 :matches 運算子來查找。:matches 運算子與 :contains 運算子非常類似,但前者可以使用通配字符。通配字符 * 是表示任何字元的意思,例如 free money 表示找尋任何字串中有 「free money」 的字眼。因此範例如下:

header :matches "Subject" ["*free money*","*Nigerian prince*"]

當您將兩個條件式都寫入程式碼後,看起來會如下:

# If the email isn't directly addressed to me, or if the subject has "free money" or "Nigerian
# prince" in it, put it in the spam folder.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress@example.com",
header :matches "Subject" ["*free money*","*Nigerian prince*"]) {

最後我們要再次使用 fileinto 命令來歸類符合條件的信件到垃圾信資料夾。目前,您的程式碼看起來會如下:

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
  reject "I am unable to accept email larger than 2MB.";
}

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com" {
  fileinto "INBOX/mailinglist";
}

# If the email isn't directly addressed to me, or if the subject has "free money" or "Nigerian
# prince" in it, put it in the spam folder.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress@example.com",
header :matches "Subject" ["*free money*","*Nigerian prince*"]) {
  fileinto "INBOX/spam";
}

將其他信件都歸類到特定資料夾

最後,我們將建立一個 Sieve 動作,將所有不符合上述條件的電子信件都歸類到 「to sort」 資料夾內。請注意!這不是撰寫 Sieve 篩選器的必要設定,任何未被篩選的信件都應該回歸到收件夾中。我們只是示範如何設定篩選器將郵件歸類的一個特定的資料夾 (如果您希望這樣做)。

# Put the remaining new mail into a folder to sort later.
else {
  fileinto "INBOX/tosort";
}

最後,您已完成了所有篩選器撰寫。

# My Sieve Filter

# List the extensions used by this script
require ["fileinto", "reject"];

# Messages bigger than 2MB will be rejected with an error message
if size :over 2000K {
  reject "I am unable to accept email larger than 2MB.";
}

# Mails from a mailing list will be put into the folder "mailinglist"
elsif address :is ["From", "To"] "mailinglist@example.com" {
  fileinto "INBOX/mailinglist";
}

# If the email isn't directly addressed to me, or if the subject has "free money" or "Nigerian
# prince" in it, put it in the spam folder.
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "myemailaddress@example.com",
header :matches "Subject" ["*free money*","*Nigerian prince*"]) {
  fileinto "INBOX/spam";
}

# Put the remaining new mail into a folder to sort later.
else {
  fileinto "INBOX/tosort";
}

希望本章節能幫助您了解 Sieve 的幾個重要元素。請記住,Sieve 非常具有彈性,除上述的指令之外還有很多其他功能。若您想進一步了解更多 Sieve 的命令與使用方式,您可以查看 Mozilla’s Sieve 參考文件。或查閱 Gandi 所支援的 Sieve 功能列表。與 其他更多 Sieve 範例