Trang chủ Proton

Bộ lọc Sieve (bộ lọc tùy chỉnh nâng cao)

Đọc
63 phút
Danh mục
Nhận và đọc email

Proton Mail cung cấp cho người dùng nhiều cách để tự động lọc email bằng cách gán thẻ hoặc phân loại vào thư mục. Nhìn chung, có ba phương pháp:

  1. Thêm người gửi vào Danh sách chặn và Danh sách cho phép để luôn hoặc không bao giờ đưa thư vào thư mục thư rác;
  2. Tạo bộ lọc tùy chỉnh bằng giao diện tương tác của Proton Mail;
  3. [Nâng cao nhất] Tạo bộ lọc tùy chỉnh trong Sieve.

Trong số các phương pháp này, việc tạo bộ lọc tùy chỉnh trong Sieve mang lại khả năng linh hoạt cao nhất, nhưng cũng phức tạp hơn khi sử dụng. Vì lý do này, Sieve được coi là một tính năng nâng cao dành cho người dùng có kinh nghiệm kỹ thuật. Với hầu hết người dùng, giao diện tương tác là phù hợp để xây dựng bộ lọc tùy chỉnh theo nhu cầu.

Mục lục

Sieve là gì?

Sieve là một ngôn ngữ lập trình được sử dụng để lọc email. Có thể tạo bộ lọc trong Sieve bằng cách viết các quy tắc đơn giản. Ví dụ: “Gán nhãn màu xanh lá cho tất cả thư từ Kyle”. Kết hợp những quy tắc này có thể tạo ra một hệ thống lọc tinh vi.

Có thể tự viết quy tắc Sieve, tham khảo từ các ví dụ như trong bài viết này hoặc sử dụng phần mềm để thực hiện dễ dàng hơn.

Trên thực tế, Proton Mail đã cung cấp cách tạo bộ lọc Sieve bằng cách sử dụng giao diện tương tác, vốn sử dụng thông tin nhập vào để tạo bộ lọc Sieve. Một cách hiệu quả khác để tìm hiểu Sieve là tạo bộ lọc bằng giao diện tương tác và chỉnh sửa bộ lọc trong Sieve, vì bản thân giao diện tương tác cũng sử dụng một tập hợp con của Sieve.

Ví dụ, hãy so sánh bộ lọc sau đây được tạo bằng giao diện tương tác…


… với mã cho cùng bộ lọc đó khi xem trong trình biên tập Sieve:

Bài viết này sẽ giới thiệu về Sieve và giải thích cách tự viết bộ lọc Sieve. Nếu cần thêm thông tin về việc sử dụng Sieve, có rất nhiều tài liệu hướng dẫn trực tuyến khác có thể hỗ trợ. Nếu có thắc mắc về Sieve trong Proton Mail chưa được giải đáp trên trang này, có thể liên hệ với đội ngũ Hỗ trợ tại đây.

Bắt đầu

Để bắt đầu tạo bộ lọc Sieve, hãy đăng nhập vào mail.proton.me(cửa sổ mới), đi tới Cài đặt → Tất cả cài đặt → Proton Mail → Bộ lọc → Thêm bộ lọc Sieve.

Một tập lệnh Sieve được cấu thành từ một danh sách các lệnh. Trong hầu hết các tập lệnh, nó bắt đầu bằng lệnh require. Lệnh require sẽ tải một phần mở rộng cung cấp một chức năng nhất định. Ví dụ: để gán nhãn hoặc đưa thư vào thư mục, cần có lệnh fileinto.

Để tải lệnh này, chỉ cần viết:

require "fileinto";

Để tải nhiều phần mở rộng, có thể sử dụng một danh sách:

require ["fileinto", "imap4flags"];

Trong trường hợp này, imap4flags tải một phần mở rộng cho phép đánh dấu thư là đã đọc. Sau lệnh require, thường sẽ thực hiện một số kiểm tra trên thư đến. Điều này được thực hiện bằng cách kết hợp if và một lệnh khác như address hoặc header.

Cuối cùng, nếu các kiểm tra thành công, có thể áp dụng một hành động cho thư. Ví dụ, giả sử muốn đưa tất cả email từ một người gửi cụ thể vào cùng một thư mục và đánh dấu thư đến là đã đọc. Đoạn mã có thể được viết như sau:

require ["fileinto", "imap4flags"];
# I don't really like Spott
if address :is "from" "Spott.Tenerman@northpark.example.com"
{ 
    addflag "\\Seen";
    fileinto "enemies";
}

Lưu ý rằng ký tự # biểu thị một bình luận và không được diễn dịch như một phần của tập lệnh Sieve. Ngoài ra, thư mục hoặc nhãn được thiết lập (ở đây là enemies) phải tồn tại trong môi trường tài khoản: có thể tìm hiểu cách tạo thư mục và nhãn tại đây. Sau khi nhập bộ lọc này, hãy nhấn nút LƯU. Bộ lọc sẽ hoạt động đối với mọi email gửi đến.

Tất nhiên, có thể muốn đưa email từ nhiều người gửi vào cùng một thư mục. Trong trường hợp này, có thể chuyển một danh sách các chuỗi vào lệnh địa chỉ (một chuỗi(cửa sổ mới) là một dãy ký tự, trong trường hợp này là một địa chỉ email):

require ["fileinto", "imap4flags"];
# I don't really like Spott and Kyyyhel
if address :is "from" ["Spott.Tenerman@northpark.example.com", "Kyhel.Broski@northpark.example.com"]
{ 
    addflag "\\Seen";
    fileinto "enemies";
}

Lưu ý rằng bất cứ khi nào có thể chuyển một chuỗi vào một điều kiện kiểm tra, thông thường cũng có thể chuyển một danh sách. Hệ thống sau đó sẽ cố gắng tìm kết quả trùng khớp bằng cách thử bất kỳ chuỗi nào trong danh sách. Điều này không áp dụng cho các lệnh như fileinto, addflag, v.v.

Nhưng Sieve còn mạnh mẽ hơn việc chỉ sắp xếp lại hộp thư. Nó cũng cho phép từ chối email kèm theo một thông điệp phản hồi:

require "reject";
# Reject mails that spell my name wrong
if header :contains "subject" "Kyhel"
{
    reject "My name is not Kyhel";
}

Sử dụng các kiểm tra

Kết hợp các kiểm tra trong Sieve

Như chúng tôi đã hiển thị cho bạn trong phần Bắt đầu, bạn có thể thực hiện các kiểm tra bằng lệnh if trên các thư đến để xác định xem một email có bị ảnh hưởng bởi lệnh require hay không.

Ngoài lệnh if, còn có các lệnh kiểm tra khác cho phép cấu trúc tập lệnh một cách đơn giản.

Else

Lệnh else cho phép thực hiện một hành động nào đó khi lệnh if không thực thi các thao tác của nó. Ví dụ về lệnh này là:

require ["fileinto"];
# If the subject contains something incomprehensible, then put the mail into the kenny folder
if header :contains "subject" "mmph mmph"
{
    fileinto "Kenny";
} else { 
    fileinto "Understandable";
}

Ở đây, email sẽ được chuyển vào thư mục Kenny nếu chủ đề chính xác là mmph mmph. Trong trường hợp khác (tức là khi chủ đề không chính xác là mmph mmph), email sẽ được chuyển vào thư mục Understandable.

Elsif

elsif là viết tắt của else if. Tương tự như lệnh else, nó sẽ được thực thi nếu điều kiện if sai, nhưng chỉ khi điều kiện elsif đúng. Nếu elsif không đúng, thì khối elsif hoặc else tiếp theo sẽ được thực thi.

require ["fileinto", "imap4flags"];
# If the subject contains something incomprehensible, then put the mail into the kenny folder
if header :contains "subject" "mmph mmph"
{
    fileinto "Kenny";
# Kyhel sends me only speeches
} elsif address :is "from" "Kyhel.Broski@northpark.example.com" { 
    fileinto "Speeches";
} else { 
# otherwise the mail is important, so add a star.
    addflag "\\Flagged";
}

Lưu ý rằng chỉ có một trong các khối if, elsif hoặc else được thực thi trong một lần chạy duy nhất.

Anyof

Đôi khi, cần thực thi một lệnh khi một trong số các kiểm tra thành công. Để thực hiện việc này, có thể sử dụng lệnh anyof. Việc này được thực hiện bằng cách viết anyof theo sau là dấu ngoặc đơn mở ‘(’, các câu lệnh muốn kiểm tra được phân tách bằng dấu phẩy, và dấu ngoặc đơn đóng ‘)’.

require ["fileinto", "imap4flags"];
# Kenny either sends from kenny@northpark.example.com or puts "mmph mmph" in the subject.
   if anyof(address :is "from" "kenny@northpark.example.com", header :contains "subject" "mmph mmph")
{
    fileinto "Kenny";
}

Tập lệnh này sẽ chuyển các thư đến từ kenny@northpark.example.com hoặc có chứa mmph mmph trong dòng chủ đề vào thư mục Kenny.

Allof

Phần đối bản của anyof cũng tồn tại: allof. Lệnh này cho phép chỉ thực thi lệnh khi tất cả các điều kiện được đưa ra đều khớp:

require ["fileinto", "imap4flags"];
# Kenny always sends me mails with mmph mmph
if allof(address :is "from" "Kenny@northpark.example.com", header :contains "subject" "mmph mmph")
{
    fileinto "Kenny";
}


Tập lệnh này sẽ chuyển các thư đến từ kenny@northpark.example.com và có chứa mmph mmph trong dòng chủ đề vào thư mục Kenny.

Not

Cuối cùng, đôi khi cần áp dụng một lệnh nếu một điều gì đó không khớp. Việc thêm not vào trước câu lệnh sẽ đảm bảo điều đó xảy ra:

require ["fileinto", "imap4flags"];
# If a subject line does not contain real guitar put it into the young people folder
if not header :contains "subject" "real guitar"
{
    fileinto "Young people";
}

Tương đương với:

require ["fileinto", "imap4flags"];
# The else part will be evaluated if the condition is not true
if header :contains "subject" "real guitar"
{
    # do nothing
} else {
    fileinto "Young people";
}

Thao tác này sẽ chuyển tất cả email không chứa real guitar trong dòng chủ đề vào thư mục Young people.

Tất nhiên có thể kết hợp tất cả các kiểm tra này lại với nhau. Ví dụ: có thể muốn gán sao cho một email nếu email đó vừa không đến từ Kenny và vừa không chứa mmph mmph trong chủ đề:

require ["fileinto", "imap4flags"];
if not anyof (    header :contains "subject" "mmph mmph", 
    address :is "from" "Kyhel.Broski@northpark.example.com" ) { 
    addflag "\\Flagged";
}

Thực hiện kiểm tra trên các tiêu đề

Bằng cách sử dụng lệnh address, có thể thực hiện kiểm tra trên các tiêu đề địa chỉ, chẳng hạn như tiêu đề from, tosender. Có thể trích xuất các phần khác nhau của địa chỉ email bằng cách sử dụng một trong các cờ sau:

  • :localpart — phần trước ký tự @
  • :domain — phần sau ký tự @
  • :all — toàn bộ địa chỉ

Đoạn mã sau giải thích cách sử dụng lệnh này:

require ["fileinto", "imap4flags"];
# Northpark people are made of paper, springfield are mostly yellow
if address :domain "from" "northpark.example.com"
{
    fileinto "PaperPeople";
} elsif address :domain "from" "springfield.example.com"{
    fileinto "YellowPeople";
}
if address :localpart "from" "chef"
{
    addflag "\\Flagged";
}

Tóm lại, tập lệnh này sẽ chuyển tất cả các thư được gửi từ miền northpark.example.com vào PaperPeople và từ springfield.example.com vào YellowPeople.

Hơn nữa, bất kể email được gửi từ miền nào, nếu phần trước @ bằng chef (ví dụ: chef@example.com), thư sẽ được gắn cờ. Một cách sử dụng thú vị khác là tự động lưu trữ tất cả thư được gửi đến một địa chỉ vào một thư mục:

require ["fileinto", "imap4flags"];
# Put support mail in a separate organized folder
if address :localpart "to" "support"
{
    fileinto "Support";
}

Nâng cao

Lệnh envelope cho phép thực hiện nhiều kiểm tra hơn. Nói chung, kiểm tra address chỉ lấy giá trị ra khỏi tiêu đề. Tuy nhiên, trong phiên SMTP, có thể chỉ định một địa chỉ from khác với địa chỉ trong tiêu đề.

Trong giao diện tiêu đề của Proton Mail, envelope-from tương đương với tiêu đề return-path và envelope-to tương đương với tiêu đề x-original-to.

Bằng cách sử dụng lệnh envelope, có thể lấy các địa chỉ to:from: thực tế từ envelope. Lưu ý rằng không có trường nào khác ngoài hai trường đó tồn tại, vì vậy sender không tồn tại trong lệnh này. Xin lưu ý rằng envelope nằm trong một phần mở rộng và do đó yêu cầu phải khai báo (require) phần mở rộng này trước.

require ["fileinto", "imap4flags", "envelope"];
# Northpark people are made of paper, springfield are mostly purple
if envelope :domain "from" "northpark.example.com"
{
    fileinto "PaperPeople";
} elsif envelope :domain "from" "springfield.example.com"{
    fileinto "PurplePeople";
}
if envelope :localpart "from" "chef"
{
    addflag "\\Flagged";
}

Sử dụng bộ so sánh để đánh giá hai giá trị

Khi một phép kiểm tra đánh giá hai giá trị, có thể chỉ định cách thực hiện so sánh này bằng cách sử dụng các cờ khác nhau được gọi là bộ so sánh. Trước đó, hai bộ so sánh đã được sử dụng là: :is:contains, dùng để kiểm tra xem chuỗi đã cho có khớp chính xác với giá trị cụ thể hay không, và giá trị cụ thể đó có chứa chuỗi đã cho hay không, như trong phép kiểm tra sau.

require ["fileinto", "imap4flags"];
if not anyof (
    header :contains "subject" "mmph mmph", # the subject contains mmph mmph 
    address :is "from" "Kyhel.Broski@northpark.example.com" # the recipient is exactly Kyhel.Broski@northpark.example.com
) { 
    addflag "\\Flagged";
}

Bộ so sánh :matches cũng có thể được sử dụng để xác định một định dạng cụ thể hơn. Bộ so sánh này sẽ so sánh cả hai giá trị từ đầu đến cuối, giống như bộ so sánh :is. Tuy nhiên, trong trường hợp của :matches, giá trị được xác định có thể chứa các giá trị ?*. Dấu chấm hỏi sẽ khớp với một ký tự, và dấu sao (được gọi là ký tự đại diện) sẽ khớp với không hoặc nhiều ký tự.

Với định dạng này, có thể tạo phép kiểm tra sau:

require ["fileinto", "imap4flags"];
if header :matches "subject" "mmph*" { 
    addflag "\\Flagged";
}

Trong ví dụ này, phép kiểm tra sẽ thành công nếu chủ đề của thư bắt đầu bằng mmph và sau đó chứa bất kỳ ký tự nào phía sau. Nói cách khác, email sẽ được gắn cờ khi chủ đề bắt đầu bằng ‘mmph’. Cả ‘mmph mmph’ và ‘mmph mmph Hello’ đều sẽ khớp; còn ‘Hello mmph’ và ‘Springfield sales’ thì không.

Dấu sao cũng có thể được sử dụng ở giữa giá trị và sử dụng nhiều lần, như sau:

require ["fileinto", "imap4flags"];
if header :matches "subject" "mmph *mmph *mmph" { 
    addflag "\\Flagged";
}

Phép kiểm tra này sẽ khớp nếu chủ đề bắt đầu bằng ‘mmph ’ (có dấu cách), chứa một từ ‘mmph ’ khác (có dấu cách) và kết thúc bằng ‘mmph’ (không có dấu cách). Các chủ đề khớp là ‘mmph mmph mmph’, ‘mmph mmph mmphmmph’ hoặc ‘mmph is mmph and mmph’.

Bộ so sánh :matches này có thể rất hữu ích khi so sánh địa chỉ. Như đã biết, Proton Mail có một số miền: protonmail.comproton.me. Nếu muốn kiểm tra xem một thư có phải đến từ một người dùng Proton Mail hay không, có thể sử dụng tập lệnh này:

require ["fileinto", "imap4flags"];
# Put support mail in a separate organized folder
if address :domain :matches "from" "protonmail.*"
{
    fileinto "Internal";
}

Nếu vì lý do nào đó cần khớp chính xác ký tự * hoặc ?, thì bạn có thể trích dẫn chúng bằng cách thêm \\ vào trước: \\* sẽ khớp với dấu sao và \\? sẽ khớp với dấu chấm hỏi.

Lưu ý rằng phần mở rộng regex cũng được hỗ trợ, phần mở rộng này cũng xác định bộ so sánh :regex. Bộ so sánh này là một phiên bản chính xác hơn của :matches nhưng rất phức tạp. Để biết thêm thông tin, vui lòng đọc tài liệu chính thức(cửa sổ mới).

Trong một số trường hợp (như sẽ thấy trong phần tiếp theo của bài viết này), có thể muốn so sánh các giá trị số. Gói relational được tạo ra cho mục đích sử dụng này. Gói này xác định bộ so sánh :value theo sau là kiểu so sánh.

Gói này cho phép kiểm tra xem một giá trị có lớn hơn (kiểu so sánh là “gt”), lớn hơn hoặc bằng (“ge”), bằng (“eq”), nhỏ hơn hoặc bằng (“le”) hoặc nhỏ hơn (“lt”) giá trị đã cho hay không.

Khi so sánh các giá trị số, gói comparator-i;ascii-numeric cũng rất hữu ích. Gói này báo cho trình thông dịch tập lệnh biết rằng nội dung của chuỗi là một số chứ không phải là một chuỗi thông thường. Có thể sử dụng gói này bằng cách thêm :comparator “i;ascii-numeric” vào phép kiểm tra.

Với tất cả thông tin này, có thể xây dựng tập lệnh sau:

require ["fileinto", "relational", "comparator-i;ascii-numeric"];  
if header :value "ge" :comparator "i;ascii-numeric" "subject" "2"   
{    
 fileinto "Dummy example";
}

Phép kiểm tra này sẽ di chuyển thư sang thư mục Dummy example nếu chủ đề lớn hơn hoặc bằng 2. Nếu chủ đề không phải là số mà là văn bản, thì phép kiểm tra sẽ không thành công. Như vậy, ví dụ này trông rất ngớ ngẩn, nhưng nó được thiết kế để sử dụng kết hợp với các phần mở rộng khác như date sẽ được định nghĩa ở phần sau của bài viết này.

So sánh bằng cách sử dụng ngữ cảnh trong Sieve

Cũng có thể truy cập thông tin liên quan đến tài khoản và ngữ cảnh Proton Mail nói chung bằng cách sử dụng các phần mở rộng. Ví dụ: có thể kiểm tra xem địa chỉ người gửi có nằm trong danh sách liên hệ hay không.

Truy cập danh sách liên hệ

Có thể truy cập danh sách liên hệ bằng cách sử dụng phần mở rộng extlists. Kết hợp với các kiểm tra tiêu đề, sau đó có thể kiểm tra xem một liên hệ có nằm trong danh sách liên hệ hay không.

require ["fileinto", "extlists"];  
# Checks that the sender is in your personal address book
if header :list "from" ":addrbook:personal?label=Family"   
{    
 fileinto "Known"; 
}

Phép kiểm tra này sẽ gắn cờ một thư với nhãn Known nếu người gửi có trong danh sách :addrbook:personal?label=Family. Danh sách này có thể được chia thành hai phần. Đầu tiên, :addrbook:personal có nghĩa là địa chỉ nằm trong danh bạ cá nhân. Thứ hai, label=Family thu hẹp hơn nữa danh sách, chỉ định rằng ngoài việc có trong danh bạ, liên hệ cũng phải thuộc nhóm liên hệ Family. Nếu cần, có thể thay đổi nhãn này thành một nhóm liên hệ khác. Có thể sử dụng :addrbook:personal?label=Work nếu muốn, trong trường hợp đó phép kiểm tra sẽ chỉ thành công nếu người gửi nằm trong danh bạ và trong nhóm liên hệ Work.

Tổng quát hơn, một danh sách sẽ tuân thủ Tag URI Scheme(cửa sổ mới) và có thể thêm các tham số phụ để thu hẹp các bộ lọc. Sau đó có thể sử dụng danh sách này như sau:

require ["fileinto", "extlists"];  
# replace :your:list:here by the list you want to use
if header :list "from" ":your:list:here"
{    
 # some actions... 
}

Có bốn danh sách khác nhau được cung cấp:

  • :addrbook:personal¹ kiểm tra xem một địa chỉ có trong danh sách liên hệ hay không. Danh sách này chấp nhận tham số label khớp với một nhóm liên hệ cụ thể. Tham số này có thể được chia thành bốn phiên bản phụ:
    • :addrbook:personal?label=something sẽ khớp với một liên hệ nằm trong nhóm liên hệ “something”;
    • :addrbook:personal?label.starts-with=something sẽ khớp với một liên hệ thuộc ít nhất một nhóm bắt đầu bằng “something”;
    • :addrbook:personal?label.ends-with=something sẽ khớp với một liên hệ thuộc ít nhất một nhóm kết thúc bằng “something”;
    • :addrbook:personal?label.contains=something sẽ khớp với một liên hệ thuộc ít nhất một nhóm chứa “something”.

Cũng có thể truy cập thông tin mã hóa liên quan đến email khớp:

  • :addrbook:personal?keypinning=true sẽ khớp với một liên hệ có chìa khóa tin cậy. Việc thay đổi từ true sang false sẽ khớp với một liên hệ không có chìa khóa tin cậy;
  • :addrbook:personal?encryption=true sẽ khớp với một liên hệ đã được kích hoạt mã hóa. Việc thay đổi từ true sang false sẽ khớp với một liên hệ chưa được thiết lập hoặc đã bị vô hiệu hóa mã hóa;
  • :addrbook:personal?signing=true sẽ khớp với liên hệ đã được kích hoạt tính năng ký. Việc thay đổi từ true sang false sẽ khớp với liên hệ bị vô hiệu hóa tính năng ký.
  • :addrbook:myself¹ khớp với mọi địa chỉ sở hữu bởi chính mình;
  • :addrbook:organization khớp với mọi địa chỉ sở hữu bởi một thành viên trong tổ chức đang tham gia;
  • :incomingdefaults:inbox kiểm tra xem địa chỉ có nằm trong Danh sách cho phép hay không;
  • :incomingdefaults:spam kiểm tra xem địa chỉ có nằm trong Danh sách chặn hay không.

Khi kết hợp với phần mở rộng biến (được mô tả trong đoạn tiếp theo), các biến khớp sẽ thay đổi. Biến khớp ${0} sẽ luôn chứa địa chỉ email cuối cùng trong danh sách được chỉ định. Nếu danh sách được đánh dấu bằng ghi chú 1, biến khớp ${1} sẽ chứa tên hiển thị.

Ví dụ: với các danh sách dưới đây, có thể xây dựng một bộ lọc để xóa mọi email nhận được từ bất kỳ ai khác ngoài gia đình hoặc những người trong danh sách cho phép:

require "extlists";  
# checks that the sender is not in the contact group Family, whilelisted or yourself
if not anyof(
    header :list "from" ":addrbook:personal?label=Family", 
    header :list "from" ":incomingdefaults:inbox",
    header :list "from" ":addrbook:myself"
) {    
  discard; # permanently delete the email
}

Nếu điều kiện đó được đáp ứng, thao tác discard sẽ được thực thi. Thao tác này sẽ xóa email ngay lập tức và vĩnh viễn . Cũng có thể di chuyển email sang thư mục thùng rác bằng cách sử dụng thao tác fileinto thay vì discard: fileinto “trash”;.

Tạo biến

Một công cụ hữu ích khác khi quản lý ngữ cảnh là định nghĩa biến. Biến là vị trí lưu trữ tạm thời cho phép đặt văn bản và gắn thẻ bằng một tên gọi. Sau đó, có thể tái sử dụng nội dung này bằng cách gọi tên của biến. Ví dụ, có thể sử dụng tập lệnh sau:

require ["reject", "variables"];
# First check who is the sender
if allof(
    address :is "from" "Kenny@northpark.example.com", 
    header :contains "subject" "mmph mmph"
) {
    # It's from Kenny!
    # Create the variable message containing 'mmph mmph'
    set "message" "mmph mmph";
} else {
    # Create the variable message containing 'Sorry, I don't want emails today!'
    set "message" "Sorry, I don't want emails today!";
}
# Then, reject the message
reject "${message}";

Mục tiêu của tập lệnh này là từ chối một email bằng thư tùy chỉnh. Nếu email gốc được gửi từ kenny và có chủ đề là ‘mmph mmph’, biến ‘message’ sẽ được tạo, chứa mmph mmph. Trong trường hợp khác, thư sẽ được điền nội dung ‘Sorry, I don’t want emails today!’. Sau đó, ở bước cuối cùng, biến này sẽ được tái sử dụng trong lệnh từ chối.

Sieve không định nghĩa sẵn các biến, do đó các biến này được định nghĩa trong phần mở rộng variables và phải được yêu cầu khai báo ở đầu tập lệnh. Có hai cách để định nghĩa biến.

  • Tạo biến một cách tường minh:

Thao tác set được cung cấp để tạo biến.

require "variables";
# Create a variable called "labelname" and containing the string "Work".
set "labelname" "Work";

Chuỗi đầu tiên là tên của biến và chuỗi thứ hai là giá trị của biến. Vì vậy, ví dụ trước đó tạo ra một biến gọi là labelname và chứa Work.

Sau khi một biến được định nghĩa, có thể gọi biến đó bằng cách thêm định dạng sau vào chuỗi: ${name}, với name là tên của biến. Khi được thực thi, định dạng này sẽ được thay thế bằng giá trị của biến. (Nếu biến chưa được định nghĩa, biến sẽ được thay thế bằng một chuỗi trống.) Do đó, trong tập lệnh sau:

require "variables";
require "fileinto";
# Create a variable called "labelname" and containing the string "Work".
set "labelname" "Work";
# Move the email in "${foldername}/${labelname}" which becomes after variable resolution "/Work";
fileinto "${foldername}/${labelname}";

Email sẽ được gắn nhãn /Work. Do biến labelname đã được định nghĩa nên sẽ được thay thế bằng Work. Tuy nhiên, do foldername chưa được định nghĩa nên sẽ chỉ bị xóa đi.

  • Gán biến ngầm định:

Trường hợp sử dụng thú vị nhất của biến là khi sử dụng kiểm tra :matches. Hãy xem ví dụ sau, trong đó người gửi email là test@proton.me:

require "variables";
require "fileinto";
# do a matches test 
if header :matches "from" "*@*" {
    # The first * matches "test", the second "protonmail".  
    # Thus, the first matching variable contains "test"
    fileinto "${1}";
}

Khi được sử dụng với phần mở rộng biến, kết quả của thao tác khớp match sẽ được lưu trữ trong các biến. Một vài biến sẽ được đặt tên bằng số. Đầu tiên, biến 0 sẽ chứa toàn bộ chuỗi khớp (trong ví dụ là địa chỉ đầy đủ: test@proton.me). Sau đó, nhóm khớp đầu tiên sẽ được gán cho biến 1 (trong ví dụ là test), nhóm khớp thứ hai sẽ được gán cho biến thứ hai (proton.me), và cứ tiếp tục như vậy cho đến nhóm khớp cuối cùng.

Trong ví dụ này, lệnh fileinto được thực thi. Vị trí được xác định là ${1}, được nhận diện là một biến và do đó được thay thế bằng giá trị đã tính toán ở trên: test.

Lưu ý rằng cũng có thể gán các biến trong kiểm tra :regex bằng cách sử dụng các nhóm khớp biểu thức chính quy.

Biến đổi biến

Một khả năng tuyệt vời là biến đổi các biến. Để thực hiện việc đó, từ khóa set có thể được sử dụng kết hợp với các cờ dùng để thay đổi giá trị trước khi gán cho biến.

  • :lower sẽ chuyển giá trị của biến thành chữ thường;
  • :upper sẽ chuyển giá trị của biến thành chữ hoa;
  • :lowerfirst sẽ chuyển chữ cái đầu tiên của giá trị biến thành chữ thường;
  • :upperfirst sẽ chuyển chữ cái đầu tiên của giá trị biến thành chữ hoa;
  • :quotewildcard sẽ trích dẫn mọi ký tự đại diện có trong chuỗi, để có thể sử dụng theo nghĩa đen trong câu lệnh khớp;
  • :length sẽ trả về độ dài của giá trị.

Lưu ý rằng cũng có thể tái sử dụng một biến đã định nghĩa trong một thao tác set khác. Hãy cải thiện các ví dụ trước đó:

require "variables";
require "fileinto";
# Set labelname to WORK, and modify it to lowercase with the first letter in upper case 
set :lower :upperfirst "labelname" "WORK";
set :lower :upperfirst "foldername" "geneva";
# Create a variable that is a combination of foldername and labelname
set "location" "${foldername}/${labelname}";
fileinto "${location}";

Từng bước một, bộ lọc sẽ tạo ra ba biến. Lệnh set đầu tiên sẽ tạo ra biến labelname. Nội dung của biến là Work. Thật vậy, giá trị gốc WORK được biến đổi bằng cách sử dụng cả hai cờ :lower:upperfirst, chuyển đổi chữ thành work rồi thành Work.

Lệnh set thứ hai sẽ tạo biến thứ hai có tên là foldername và chứa chuỗi Geneva. Thật vậy, các cờ :lower:upperfirst đã được sử dụng.

Cuối cùng, biến location được tạo. Giá trị “${foldername}/${labelname}” chứa hai biến: foldernamelabelname. Vì vậy, trình thông dịch Sieve sẽ thay thế các biến này bằng giá trị tương ứng: Work và Geneva.

Cuối cùng, biến location được sử dụng làm đối số cho lệnh fileinto. Do đó, email sẽ được di chuyển đến thư mục có tên là giá trị của biến location: Work/Geneva.

Các bộ so sánh cũng có thể được áp dụng cho các biến khớp:

require "variables";
require "fileinto";
if address :all :matches "from" "*@*" {
    set :lower :upperfirst "fileintovar" "${1}";
    fileinto "${fileintovar}";
}

Tại đây, nếu người gửi của email là test@proton.me, email đó sẽ được gắn nhãn Test.

Một cách khác để thay đổi giá trị của biến là sử dụng phần mở rộng vnd.proton.eval. Phần mở rộng này định nghĩa cờ mới :eval, cho phép thực hiện một số phép toán đơn giản:

require "variables";
require "fileinto";
require "vnd.proton.eval";
# do a match test on the sender address
if header :matches "from" "*" {
    # create a variable called length, containing the length of the first     
    # matching variable
    set :length "length" "${1}"; 
    # Create a variable called fileintovar containing the result of the expression written below
    set :eval "fileintovar" "${length} * 25 - 1 / 8+3";
    fileinto "${fileintovar}";
}

Trong ví dụ này, và vẫn giả định email được gửi đến từ test@proton.me, email sẽ được gắn nhãn với giá trị 478. Thật vậy, độ dài của biến khớp đầu tiên là 19, và kết quả của phép tính 19 * 25 – 1 / 8 + 3 được làm tròn lên thành 478.

Điều này ban đầu có vẻ vô ích, nhưng phần mở rộng này sẽ có ý nghĩa hơn khi kết hợp với các thao tác khác.

So sánh với các trường khác trong Sieve

Cũng có thể khớp theo các tiêu đề cụ thể. Ví dụ, để phân loại tất cả các thư gửi đến danh sách (thường là thư tiếp thị hoặc bản tin), có thể làm như sau:

require "fileinto";
# Filter all lists into the same folder
if exists "list-unsubscribe"
{
    fileinto "advertisements";
}

Để phân loại các email từ mạng xã hội vào thư mục riêng, có thể viết như sau:

require "fileinto";
# Filter all lists into the same folder
if anyof(exists "x-facebook", exists "x-linkedin-id") {
    fileinto "social";
} elsif exists "list-unsubscribe"
{
    fileinto "advertisements";
}

Lưu ý sử dụng:

anyof(exists "x-facebook", exists "x-linkedin-id")

thay vì:

exists ["x-facebook", "x-linkedin-id"]

Vì cách thứ hai sẽ kiểm tra xem cả x-facebookx-linkedin-id đã được đặt hay chưa.

Để kiểm tra chính xác giá trị mà tiêu đề chứa, có thể sử dụng kiểm tra header:

require "fileinto";
# Put all mails that have been sent without TLS/SSL into the same folder
if header :is "x-pm-transfer-encryption" "none" {
    fileinto "unencrypted";
}

Ngoài thao tác :is thực hiện so khớp chính xác, lệnh header cũng hỗ trợ :matches, thực hiện khớp bằng cách sử dụng các ký tự đại diện (ví dụ: “*@*.com” sẽ khớp với bất kỳ địa chỉ email nào kết thúc bằng dot com) và lệnh :contains, kiểm tra xem tiêu đề có chứa một chuỗi nhất định hay không.

Để thiết kế các bộ lọc Sieve, việc truy xuất tiêu đề của email có thể rất hữu ích. Để thực hiện việc này trong giao diện web Proton Mail, hãy đi tới Thêm () → Xem tiêu đề. Một cửa sổ mới sẽ mở ra chứa tất cả tiêu đề của email.

Lọc bằng kích thước thư trong Sieve

Có thể xử lý các email dung lượng lớn khác với các email dung lượng nhỏ. Ví dụ, có thể muốn gắn cờ các email lớn để xóa nhằm tiết kiệm dung lượng hộp thư. Điều này có thể được thực hiện theo cách sau:

require ["imap4flags"];
# Flag emails that probably have large attachments (> 2 MiB)
if size :over 2M # you can also use 2097152 if you want, they are synonymous
{
    addflag "\\Flagged";
}
# Automatically mark as read really small messages. They can't have much content anyway...
if size :under 1000
{
    addflag "\\Seen";
}

Như có thể thấy, có thể sử dụng các đơn vị khi muốn chỉ định kích thước lớn bằng cách thêm chữ cái tương ứng với đơn vị mong muốn ngay sau chữ số. Có ba đơn vị khả dụng: K cho kibioctet (hoặc 1024 byte), M cho mebioctet (hoặc 1 048 576 byte) và G cho gibioctet (hoặc 1 073 741 824 byte).

Lưu ý rằng “over” trong trường hợp này nghĩa là lớn hơn, và “under” nghĩa là nhỏ hơn. Điều này có nghĩa là nếu thư có kích thước chính xác là 1000 byte, thì cả

size :under 1000

lẫn

size :over 1000

đều không khớp.

Lưu ý rằng các bộ lọc Sieve không thể truy cập nội dung thực tế và chỉ hiển thị kích thước đã mã hóa.

Thực hiện các thao tác nâng cao trên thư

Có thể thực hiện các phản hồi khác nhau đối với một thư trong Sieve. Các thao tác fileinto, addflag, discard, và reject đã được giới thiệu trong các phần trước. Phần này sẽ giới thiệu thêm các thao tác nâng cao.

Thư vắng mặt và kiểm tra ngày

Có thể sao chép tính năng tự động trả lời trong Sieve bằng cách sử dụng lệnh vacation. Trên thực tế, tính năng tự động trả lời trong Cài đặt dựa vào Sieve để hoạt động. Nhưng bằng cách sử dụng các tùy chọn vắng mặt bên trong một tập lệnh, sẽ có nhiều khả năng hơn để tùy chỉnh các câu trả lời tự động. Ví dụ, có thể điều chỉnh các thư cụ thể tùy thuộc vào các điều kiện. Lưu ý: Tương tự như tính năng tự động trả lời trong Cài đặt, thao tác vacation chỉ khả dụng trong các gói trả phí.

Lệnh vacation gửi phản hồi vắng mặt đến bất kỳ ai cố gắng liên hệ. Lệnh này thường được kết hợp với các kiểm tra currentdate hoặc date để gửi phản hồi trong một khoảng thời gian cụ thể.

Giả sử nghỉ lễ từ ngày 14 tháng 7 năm 2017 đến ngày 14 tháng 8 năm 2017 theo giờ Colorado. Có thể sử dụng mã Sieve sau đây để thiết lập bộ trả lời tự động:

require ["date", "vacation", "relational"];
if allof(currentdate :zone "US/Mountain" :value "ge" "date" "2017-07-14",
 currentdate :zone "US/Mountain" :value "le" "date" "2017-08-14")
{
    vacation "Queue you guys, I'm going on vacation.";
}

Một trong các đối số tùy chọn cho lệnh vacation là các đối số :handle:days. Theo mặc định, Sieve sẽ không trả lời nhiều lần cho cùng một người gửi trong một số ngày nhất định được gọi là thời gian chờ (timeout). Điều này giúp tránh vô tình gửi nhiều email tự động.

Để kiểm soát thời gian chờ, có thể sử dụng tham số :days. Đối số :days được sử dụng để chỉ định khoảng thời gian lưu giữ địa chỉ và không phản hồi, và luôn được chỉ định bằng ngày. Đôi khi, có nhiều lệnh vacation trong tập lệnh Sieve, và cần đảm bảo rằng mỗi lệnh trong số đó sẽ gửi phản hồi ít nhất một lần (nếu quy tắc khớp). Trong trường hợp đó, có thể sử dụng tùy chọn :handle (tên tài khoản). Đối số cho :handle là một chuỗi xác định loại phản hồi đang được gửi.

Để xem cách thức hoạt động của tính năng này, hãy giả sử trường hợp giáo viên. Giáo viên thường nhận bài tập về nhà qua email. Việc sắp xếp chúng vào thư mục riêng là rất hữu ích. Hơn nữa, có thể từ chối bất kỳ bài nộp nào gửi sau hạn chót.

Trong trường hợp như vậy, có thể muốn sử dụng tên tài khoản (handle) để đảm bảo các phản hồi được gửi khi cần thiết:

require ["date", "vacation", "reject", "fileinto", "relational"];
if header :contains "subject" "Homework assignment 1"
{
    # remind people not to forget the attachments
    if size :under 5000
    {
        vacation :handle "Homework assignment 1 - missing attachment" "Your message size is really low. Please make sure you didn't forget to add the homework as an attachment.";
    }
   
    # check if the student made the deadline
    if  currentdate :zone "US/Mountain" :value "le" "date" "2017-06-12"
    {
        fileinto "Homework Assignment 1";
    } else {
        reject "Too late, you missed the deadline.";
    }
}
if header :contains "subject" "Homework assignment 2"
{
    # remind people not to forget the attachments
    if size :under 5000
    {
        vacation :handle "Homework assignment 2 - missing attachment" "Your message size is really low. Please make sure you didn't forget to add the homework as an attachment.";
    }
   
    # check if the student made the deadline
    if  currentdate :zone "US/Mountain" :value "le" "date" "2017-06-12"
    {
        fileinto "Homework Assignment 2";
    } else {
        reject "Too late, you missed the deadline.";
    }
}

Dưới đây là tất cả các đối số được cho phép đối với phản hồi vắng mặt, được liệt kê theo thứ tự cần truyền đối số:

  • :days là số ngày bộ trả lời tự động cần tránh gửi phản hồi cho cùng một người gửi sau khi đã gửi một thư báo vắng mặt
  • :subject là tiền tố (mặc định là auto) mà bộ trả lời tự động nên sử dụng để phản hồi người gửi. Ví dụ: “Homework Assignment 2” sẽ nhận được phản hồi với tiêu đề “late: Homework Assignment 2” nếu :subject “late” được truyền vào.
  • :mime cho biết dòng đầu tiên của phản hồi đang sử dụng một định dạng cụ thể. Điều này cho phép gửi phản hồi bằng thư định dạng HTML. Ví dụ: để viết phản hồi HTML, hãy truyền đối số :mime và viết Content-Type : text/html ở dòng đầu tiên của phản hồi.
  • :handle là một chuỗi xác định loại phản hồi đang được gửi.

Lưu ý rằng tham số :zone trong currentdate là một tham số tùy chọn và sẽ sử dụng giờ địa phương của máy chủ (Geneva, Thụy Sĩ, trong trường hợp của Proton Mail) nếu không được thiết lập.

Tham số múi giờ chấp nhận các khoảng lệch múi giờ, là các chuỗi có dạng “+0100” nghĩa là UTC+1, và các múi giờ thực tế trong cơ sở dữ liệu ICANN (xem https://en.wikipedia.org/wiki/List_of_tz_database_time_zones(cửa sổ mới)). Tùy chọn cuối cùng thường hữu ích hơn (mặc dù không phải là chuẩn Sieve) vì nó cũng mã hóa thời gian tiết kiệm ánh sáng ban ngày của mỗi múi giờ.

Có thể so sánh ngày bằng cách sử dụng tham số thông thường :is/ :contains/ :matches. Ví dụ, lệnh Sieve sau đây khớp với bất kỳ ngày nào trong tháng 7 năm 2017:

currentdate :zone "US/Mountain" :matches "date" "2017-07-??"

Nhưng trong hầu hết các trường hợp, tham số :value hữu ích hơn nhiều.

Tham số cuối cùng cần truyền vào là định dạng. Định dạng này cũng mã hóa phần ngày muốn so sánh. Trong ví dụ đã cho, định dạng ngày đã được sử dụng. Tất cả các định dạng được hỗ trợ là:

  • year, năm được mã hóa theo định dạng từ “0000” đến “9999”
  • month, tháng được mã hóa từ “01” đến “12”
  • day, ngày được mã hóa từ “01” đến “31”
  • date, được mã hóa dưới dạng yyyy-mm-dd
  • hour, giờ được mã hóa từ “00” đến “23”
  • minute, phút được mã hóa từ “00” đến “59”
  • second, giây được mã hóa từ “00” đến “60” (60 là giây nhuận(cửa sổ mới), chỉ xảy ra vào lúc 23:59:60 bất cứ khi nào các nhà khoa học cho là cần thiết)
  • time, thời gian dưới dạng hh:mm:ss
  • iso8601, ngày và thời gian theo tiêu chuẩn ISO8601, ví dụ: 2005-08-15T15:52:01+00:00
  • std11, ngày và thời gian theo tiêu chuẩn RFC2822, ví dụ: Mon, 15 Aug 2005 15:52:01 +0000
  • zone, khoảng lệch múi giờ theo định dạng +/-zzzz, ví dụ +0000 hoặc -1200
  • julian, số ngày kể từ ngày 17 tháng 11 năm 1858 UTC
  • weekday, ngày trong tuần bắt đầu từ Chủ Nhật là 0 đến Thứ Bảy là 6

Cuối cùng, cũng có thể lấy ngày từ tiêu đề thay vì sử dụng currentdate. Lệnh ngày này hoạt động giống như currentdate, ngoại trừ việc nó yêu cầu một chuỗi bổ sung trước chuỗi định dạng: tên tiêu đề. Ví dụ:

date :zone "US/Mountain" :matches "received" "date" "2017-07-??"

Lưu ý rằng các tiêu đề không nhất thiết phải chính xác: người gửi có thể thay đổi chúng tùy ý và do đó chúng không đáng tin cậy.

Các lưu ý:

  1. Bộ trả lời tự động không phản hồi các thư được tạo tự động như danh sách gửi thư, email được gửi bởi một bộ trả lời tự động khác hoặc thư được gửi từ địa chỉ noreply.
  2. Bộ trả lời tự động sẽ không gửi thư nhiều lần đến cùng một địa chỉ email, ngoại trừ khi lệnh vacation có một :handle khác.

Quản lý thời gian hết hạn

Một tính năng độc đáo của Proton Mail là khả năng đặt thời gian hết hạn cho các thư đã gửi, tại thời điểm đó thư sẽ bị xóa khỏi hộp thư của người nhận.

Cũng có thể sử dụng tính năng này để quản lý các thư đến bằng cách thêm thời gian hết hạn:

require "vnd.proton.expire"; 
# permanently delete all incoming and outgoing emails after 10 days
expire "day" "10";

Tập lệnh trên sẽ xóa bất kỳ email nào nhận được sau 10 ngày. Việc này có phần hơi cực đoan vì nó áp dụng cho tất cả email. Thay vào đó, có lẽ nên sử dụng một điều kiện để chỉ áp dụng tập lệnh cho một nhóm email cụ thể. Ví dụ: có thể cho hết hạn bất kỳ thư nào từ người không có trong danh bạ liên hệ:

require ["extlists", "vnd.proton.expire"];
# permanently delete after 10 days any email not from me or from someone in my address book.
if not anyof(
    header :list "from" ":addrbook:personal",
    header :list "from" ":addrbook:myself"
) {
 expire "day" "10";
}

Lưu ý: Nếu thời gian hết hạn đã chỉ định vượt quá 730 ngày, thời gian này sẽ tự động được giới hạn ở mức 730 ngày.

Giới hạn của Sieve

Có một số giới hạn của Sieve cần lưu ý.

  • Thư đã gửi không thể di chuyển thủ công hoặc bằng bộ lọc sang Hộp thư đến/Thư nháp. Các thư này sẽ luôn ở trong thư mục Đã gửi và thư mục/nhãn do người dùng hoặc bộ lọc áp dụng.
  • Thư đã nhận không thể di chuyển thủ công hoặc bằng bộ lọc sang Thư nháp/Đã gửi.
  • Thư nháp không thể di chuyển thủ công hoặc bằng bộ lọc sang Hộp thư đến/Đã gửi.
  • Đối với thư trong Thư rác — hoặc thư được đưa vào thư rác trong quá trình xử lý — tin nhắn tự động trả lời/vắng mặt sẽ không được gửi. Nếu cần tính năng này, hãy cân nhắc thêm một thư mục tùy chỉnh — ví dụ: mySpam — và vô hiệu hóa thông báo cho thư mục đó.
  • Giới hạn của tin nhắn tự động trả lời/vắng mặt

Lưu ý về hỗ trợ Biểu thức chính quy

Bản triển khai Sieve của Proton tuân theo tiêu chuẩn lọc email Sieve, vốn chỉ bao gồm hỗ trợ biểu thức chính quy ở mức tối thiểu. Một số cú pháp viết tắt biểu thức chính quy phổ biến, chẳng hạn như \\b (ranh giới từ), \\w (ký tự từ), \\W (ký tự không phải từ) và \\d (chữ số), không được hỗ trợ trong Sieve. Do đó, việc sử dụng các ký tự viết tắt này trong các bộ lọc có thể khiến chúng bị lỗi mà không có thông báo. Giới hạn này là do chính tiêu chuẩn Sieve, vốn ưu tiên sự đơn giản và khả năng tương thích trên các nền tảng. Để biết chi tiết đầy đủ, hãy xem Dự thảo RFC về Biểu thức chính quy của Sieve.

Danh sách các thao tác và kiểm tra được hỗ trợ

Gói

Sieve hỗ trợ các phần mở rộng sau. Có thể tham khảo tài liệu chính thức để biết thêm thông tin.

Date

  • Cách dùng: date
  • Mô tả: (cửa sổ mới)Cung cấp cách kiểm tra thông tin ngày tháng.
  • Tài liệu: https://tools.ietf.org/html/rfc5260(cửa sổ mới)
  • Triển khai: Trình so sánh mặc định là i;ascii-numeric chứ không phải i;ascii-casemap. Thật vậy, date không hữu dụng với trình so sánh casemap.
  • Xem: Tin nhắn vắng mặt và kiểm tra ngày tháng

Envelope

FileInto

  • Cách dùng: fileinto
  • Mô tả: Áp dụng một nhãn cho một thư hoặc di chuyển thư đó vào một thư mục.
  • Tài liệu: https://tools.ietf.org/html/rfc5228#section-4.1(cửa sổ mới)
  • Triển khai: Các dấu gạch chéo biểu thị đường dẫn đầy đủ của thư mục và chúng phải được thoát nếu tên nhãn có chứa dấu gạch chéo. Các tùy chọn sau được hỗ trợ:
    • Work“: đây là nhãn hoặc thư mục có tên là ‘Work’
    • Work/Project1“: đây là thư mục con ‘Project1’ nằm trong thư mục ‘Work’
    • Work/Project1/Docs“: đây là thư mục con ‘Docs’ nằm trong thư mục con ‘Project1’ thuộc thư mục ‘Work’
    • Work/Misc\\/Others“: đây là thư mục con ‘Misc/Others’ nằm trong thư mục ‘Work’
  • Xem: Bắt đầu

Imap4flags

Từ chối

Vacation

Variables

Quan hệ

  • Cách sử dụng: relational
  • Mô tả: Cung cấp các toán tử so khớp quan hệ.
  • Tài liệu: https://tools.ietf.org/html/rfc5231

Regex

  • Cách sử dụng: regex
  • Mô tả: Cung cấp các toán tử so khớp regex.
  • Tài liệu: https://tools.ietf.org/id/draft-ietf-sieve-regex-01.html

Bộ so sánh dạng số ASCII

Danh sách được lưu trữ bên ngoài

  • Cách sử dụng: extlists
  • Mô tả: Cung cấp quyền truy cập vào danh sách liên hệ.
  • Tài liệu: https://tools.ietf.org/html/rfc6134(cửa sổ mới)
  • Triển khai: Các danh sách sau được hỗ trợ
    • addrbook:personal : Danh sách liên hệ cá nhân. Các truy vấn sau được hỗ trợ:
      • label[.starts-with / .ends-with / .contains]=<group: string>: thao tác đối với một nhóm liên hệ;
      • keypinning=<value: true / false> định nghĩa khóa công khai của liên hệ;
      • encryption=<value: true / false> mã hóa mặc định của liên hệ;
      • signing=<value: true / false>  chữ ký mặc định của liên hệ.
    • :addrbook:myself Các địa chỉ thuộc về người dùng hiện tại;
    • :addrbook:organization Các địa chỉ thuộc về các thành viên của tổ chức hiện tại;
    • :incomingdefaults:inbox Danh sách cho phép
    • :incomingdefaults:spam Danh sách chặn
  • Xem: Truy cập danh sách liên hệ

Eval

  • Cách sử dụng: vnd.proton.eval
  • Mô tả: Tính toán một hàm số học đơn giản được cung cấp trong một chuỗi.
  • Tài liệu: Chuyển đổi biến

Include

Hết hạn

Kiểm tra

Currentdate

  • Cách sử dụng:
currentdate [":zone" <time-zone: string>] [COMPARATOR] [MATCH-TYPE] <date-part: string> <key-list: string-list>

Date

  • Cách sử dụng:
date [":zone" <time-zone: string> / ":originalzone"] [MATCH-TYPE] <header-name: string> <date-part: string> <key-list: string-list

HasFlag

  • Cách sử dụng:
hasflag [MATCH-TYPE] [COMPARATOR] <list-of-flags: string-list>
  • Mô tả: Kiểm tra xem một thư nhất định có một cờ nhất định hay không.
  • Gói: imap4flags
  • Xem: Bắt đầu

Envelope

  • Cách sử dụng:
envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <envelope-part: string-list> <key-list: string-list>

Địa chỉ·

  • Cách sử dụng:
address [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <header-list: string-list> <key-list: string-list>
  • Mô tả: Kiểm tra xem (các) tiêu đề được chỉ định sau khi phân tích cú pháp dưới dạng địa chỉ có khớp với (các) khóa được chỉ định hay không.
  • Gói: <mặc định>
  • Xem: So sánh với các địa chỉ trong Sieve

Tiêu đề

  • Cách sử dụng:
header [COMPARATOR] [MATCH-TYPE] <header-names: string-list> <key-list: string-list>

HasExpiration

  • Cách dùng:
hasexpiration
  • Mô tả: Kiểm tra xem thư có được đặt thời gian hết hạn hay không.
  • Gói: vnd.proton.expire

Exists

  • Cách sử dụng:
exists <header-names: string-list>

Hết hạn

  • Cách sử dụng:
expiration :comparator "i;ascii-numeric" [MATCH-TYPE] <unit: "day" / "minute" / "second"> <key-list: string-list>
  • Mô tả: So sánh thời gian hết hạn của thư với (các) khóa được cung cấp. Phép kiểm tra sẽ thất bại nếu chạy đối với thư không hết hạn.
  • Gói: vnd.proton.expire

Kích thước

  • Cách sử dụng:
size <":over" / ":under"> <limit: number>
  • Mô tả: Kiểm tra xem tổng kích thước của thư (bao gồm cả tệp đính kèm) vượt quá hay dưới một giới hạn nhất định.
  • Gói: <mặc định>
  • Xem: Lọc bằng kích thước thư trong Sieve

Chuỗi

  • Cách sử dụng:
string [MATCH-TYPE] [COMPARATOR] <source: string-list> <key-list: string-list>
  • Mô tả: Đánh giá xem có bất kỳ chuỗi nguồn nào khớp với bất kỳ khóa nào hay không.
  • Gói: variables

Anyof

  • Cách sử dụng:
anyof <tests: test-list>
  • Mô tả: Thực hiện phép logic OR trên các kiểm tra được cung cấp cho nó.
  • Gói: <mặc định>
  • Xem: Bắt đầu

Allof

  • Cách sử dụng:
allof <tests: test-list>
  • Mô tả: Thực hiện phép logic AND trên các kiểm tra được cung cấp cho nó.
  • Gói: <mặc định>
  • Xem: Bắt đầu

Not

  • Cách sử dụng:
not <test: test>
  • Mô tả: Đảo ngược kết quả của kiểm tra được cung cấp.
  • Gói: <mặc định>
  • Xem: Bắt đầu

True

  • Cách sử dụng:
true
  • Mô tả: Luôn khớp.
  • Gói: <mặc định>

False

  • Cách sử dụng:
false
  • Mô tả: Không bao giờ khớp.
  • Gói: <mặc định>

Các thao tác

Require

  • Cách sử dụng:
require <packages: string-list>
  • Mô tả: Tải một phần mở rộng được chỉ định để có thể sử dụng các phương thức hoặc sửa đổi của phần mở rộng đó.
  • Gói: <mặc định>
  • Xem: Bắt đầu

FileInto

  • Cách sử dụng:
fileinto <folder: string>
  • Mô tả: Di chuyển thư đang được xử lý đến một thư mục nhất định.
  • Gói: fileinto
  • Xem: Bắt đầu

Addflag

  • Cách sử dụng:
addflag <list-of-flags: string-list>
  • Mô tả: Thêm cờ được chỉ định vào thư đang được xử lý.
  • Gói: imap4flags
  • Xem: Bắt đầu

Removeflag

  • Cách sử dụng:
removeflag <list-of-flags: string-list>
  • Mô tả: Xóa các cờ được chỉ định khỏi thư đang được xử lý.
  • Gói: imap4flags

Setflag

  • Cách sử dụng:
setflag <list-of-flags: string-list>
  • Mô tả: Xóa tất cả các cờ và đặt các cờ được chỉ định trên thư đang được xử lý.
  • Gói: imap4flags

Stop

  • Cách sử dụng:
stop
  • Mô tả: Dừng xử lý tất cả bộ lọc Sieve. Các bộ lọc Sieve tiếp theo sẽ không chạy.
  • Gói: <mặc định>

Return

  • Cách dùng:
return
  • Mô tả: Dừng xử lý bộ lọc Sieve hiện tại. Các bộ lọc Sieve tiếp theo vẫn sẽ chạy.
  • Gói: include

Set

  • Cách sử dụng:
set [MODIFIER] <name: string> <value: string>
  • Mô tả: Tạo các biến mới liên kết tên đã cho và giá trị đã cho.
  • Gói: variables
  • Xem: Tạo biến

Discard

  • Cách sử dụng:
discard
  • Mô tả: Hủy bỏ thư ở cuối bộ lọc Sieve này. Sau khi hủy bỏ, không có bộ lọc Sieve nào khác được chạy.
  • Gói: <mặc định>

Keep

  • Cách sử dụng:
keep
  • Mô tả: Hoàn tác lệnh hủy bỏ (discard) cuối cùng. Chỉ có hiệu lực nếu nằm trong cùng một bộ lọc Sieve. Nếu chưa có lệnh hủy bỏ nào được thực thi thì lệnh này sẽ không thực hiện gì cả.
  • Gói: <mặc định>

Từ chối

  • Cách sử dụng:
reject <reason: string>
  • Mô tả: Gửi một email đến địa chỉ SMTP của người gửi kèm theo lý do và hủy bỏ thư này ngay lập tức. Lệnh giữ lại (keep) sẽ không hủy hoạt động này.
  • Gói: <mặc định>
  • Xem thêm: Bắt đầu, Thư vắng mặt và kiểm tra Ngày

Expire

  • Cách dùng:
expire <unit: "day" / "minute" / "second"> <value: string>

Unexpire

  • Cách sử dụng:
unexpire
  • Mô tả: Xóa thời gian hết hạn của thư.
  • Gói: vnd.proton.expire

Vacation

  • Cách sử dụng:
vacation [":days" number] [":subject" string] [":mime"] [":handle" string] <reason: string>
  • Mô tả: Gửi phản hồi tự động đến địa chỉ SMTP của người gửi với lý do được chỉ định làm phần thân thư.
  • Gói: vacation (yêu cầu tài khoản trả phí)
  • Xem thêm: Thư vắng mặt và kiểm tra Ngày

Danh sách bên ngoài hợp lệ

  • Cách dùng:
valid_ext_list <ext-list-names: string-list>
  • Mô tả: Kiểm tra xem tất cả các danh sách bên ngoài được cung cấp có được hỗ trợ và hợp lệ hay không.
  • Gói: extlists