Proton 홈페이지

Sieve 필터 (고급 사용자 지정 필터)

읽기
11분
카테고리
이메일 수신 및 읽기

Proton Mail은 태그를 지정하거나 폴더로 분류하여 이메일을 자동으로 필터링하는 다양한 방법을 사용자에게 제공합니다. 일반적으로 세 가지 방법이 있습니다:

  1. 보낸 사람을 차단 목록 및 허용 목록에 추가하여 항상 스팸 폴더에 넣거나 절대 넣지 않도록 설정하기;
  2. Proton Mail의 대화형 인터페이스를 사용하여 사용자 지정 필터 생성하기;
  3. [최고급] Sieve에서 사용자 지정 필터 생성하기.

이 방법들 중 Sieve에서 사용자 지정 필터를 생성하는 것은 가장 뛰어난 다용성을 제공하지만, 사용하기가 더 복잡하기도 합니다. 이러한 이유로 Sieve는 기술적 경험이 어느 정도 있는 사용자를 위한 고급 기능으로 간주됩니다. 대부분의 사용자의 경우, 필요한 사용자 지정 필터를 구축하는 데 대화형 인터페이스가 적합합니다.

목차

Sieve란 무엇인가요?

Sieve는 이메일을 필터링하는 데 사용되는 프로그래밍 언어입니다. 간단한 규칙을 작성하여 Sieve에서 필터를 생성할 수 있습니다. 예를 들어, “Kyle이 보낸 모든 메시지에 초록색 라벨 지정”과 같은 규칙입니다. 이러한 규칙을 결합하면 정교한 필터링 시스템을 구축할 수 있습니다.

Sieve 규칙을 처음부터 직접 작성하거나, 이 글의 예시에서 가져와 사용하거나, 작업을 더 쉽게 만들어 주는 소프트웨어를 사용할 수 있습니다.

사실, 저희는 이미 귀하의 입력을 사용하여 Sieve 필터를 생성하는 대화형 인터페이스를 통해 Sieve 필터를 만드는 방법을 제공하고 있습니다. 대화형 인터페이스 자체도 Sieve의 하위 집합을 사용하므로, 대화형 인터페이스를 통해 필터를 만든 다음 Sieve에서 직접 편집하면서 배우는 것도 Sieve를 익히는 좋은 방법입니다.

예를 들어, 대화형 인터페이스를 사용하여 생성된 다음 필터와…


Sieve 편집기에서 본 동일한 필터의 코드를 비교해 보세요:

이 글은 Sieve를 소개하고 귀하만의 Sieve 필터를 작성하는 방법을 설명합니다. Sieve 사용법에 대해 더 많은 정보가 필요하시다면, 도움이 될 수 있는 다양한 기타 온라인 튜토리얼이 있습니다. 이 페이지에서 해결되지 않은 Proton Mail의 Sieve에 관한 궁금한 점이 있으시다면, 언제든지 여기에서 지원 팀에 문의하실 수 있습니다.

시작하기

Sieve 필터 생성을 시작하려면 mail.proton.me(새 창)에 로그인한 후, 설정 → 전체 설정 → Proton Mail → 필터 → Sieve 필터 추가로 이동하세요.

Sieve 스크립트는 명령 목록으로 구성됩니다. 대부분의 스크립트에서는 require 명령으로 시작합니다. require 명령은 특정 기능을 제공하는 확장을 불러옵니다. 예를 들어, 라벨을 지정하거나 메시지를 폴더에 넣으려면 fileinto 명령이 필요합니다.

이 명령을 불러오려면 다음과 같이 작성하면 됩니다:

require "fileinto";

여러 확장을 불러오려면 다음과 같이 목록을 사용할 수 있습니다:

require ["fileinto", "imap4flags"];

이 경우, imap4flags는 메일을 읽음 상태로 표시할 수 있는 확장을 불러옵니다. require 명령을 실행한 후에는 수신되는 메시지에 대해 몇 가지 테스트를 수행하는 경우가 많습니다. 이는 ifaddress 또는 header와 같은 다른 명령을 조합하여 수행됩니다.

마지막으로, 테스트가 성공하면 메시지에 동작을 적용할 수 있습니다. 예를 들어, 특정 보낸 사람의 모든 이메일을 동일한 폴더에 넣고 수신 메일을 읽음 상태로 표시하고 싶다고 가정해 보겠습니다. 이는 다음과 같이 작성할 수 있습니다:

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

# 기호는 주석을 나타내며 Sieve 스크립트의 일부로 해석되지 않음에 유의하세요. 또한, 설정하는 폴더 또는 라벨(여기서는 enemies )은 귀하의 환경에 이미 존재해야 합니다. 폴더와 라벨을 만드는 방법은 여기에서 배울 수 있습니다. 이 필터를 입력한 후, 저장 버튼을 누르세요. 이제 수신되는 모든 이메일에 대해 필터가 작동합니다.

물론, 여러 보낸 사람의 이메일을 동일한 폴더에 넣고 싶을 수도 있습니다. 이 경우, 주소 명령에 문자열 목록을 전달할 수 있습니다(문자열(새 창)은 일련의 문자들을 의미하며, 여기서는 이메일 주소입니다):

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";
}

테스트 조건에 문자열을 전달할 수 있는 경우에는 보통 목록을 전달하는 것도 가능함에 유의하세요. 이 경우 목록에 있는 문자열 중 일치하는 항목을 찾으려고 시도하게 됩니다. 이는 fileinto, addflag 등과 같은 명령에는 적용되지 않습니다.

하지만 Sieve는 단순히 메일함을 재배열하는 것보다 더 강력한 기능을 제공합니다. 응답 메시지와 함께 이메일을 거절할 수도 있습니다:

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

테스트 사용

Sieve에서 테스트 결합하기

시작하기 섹션에서 보여드렸듯이, 수신 메시지에 if 명령을 사용하여 테스트를 수행함으로써 이메일이 require 명령의 영향을 받아야 하는지 여부를 결정할 수 있습니다.

if 명령 외에도 스크립트를 간단한 방식으로 구성할 수 있게 해주는 다른 테스트 명령들이 있습니다.

Else

else 명령을 사용하면 if 명령이 해당 동작을 실행하지 않았을 때 무언가를 수행하도록 할 수 있습니다. 이에 대한 예시는 다음과 같습니다:

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";
}

여기서 제목이 정확히 mmph mmph인 경우 이메일은 Kenny 폴더로 이동합니다. 그 외의 경우(즉, 제목이 정확히 mmph mmph가 아닌 경우) 이메일은 Understandable 폴더로 이동합니다.

Elsif

elsifelse if의 축약형입니다. else 명령과 마찬가지로 if 조건이 거짓일 때 실행되지만, elsif 조건이 참일 때만 실행됩니다. 만약 elsif 조건이 참이 아니라면, 다음 elsif 또는 else 블록이 실행됩니다.

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";
}

단 한 번의 실행 과정에서는 if, elsif, else 블록 중 단 하나만 실행됨에 유의하세요.

Anyof

때로는 여러 테스트 중 하나가 성공할 때 귀하가 명령을 실행해야 할 수도 있습니다. 이를 위해 anyof 명령을 사용할 수 있습니다. 이는 anyof를 쓰고 이어서 여는 괄호 ‘(’, 귀하가 테스트하려는 문장들을 쉼표로 구분하여 입력한 후 닫는 괄호 ‘)’를 작성하면 완료됩니다.

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";
}

이 스크립트는 보낸 사람이 kenny@northpark.example.com이거나 제목에 mmph mmph가 포함된 메시지를 Kenny. 폴더에 넣습니다.

Allof

anyof에 대응하는 allof도 있습니다. 이를 통해 귀하는 주어진 모든 조건이 일치할 때만 명령을 실행할 수 있습니다:

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";
}


이 스크립트는 보낸 사람이 kenny@northpark.example.com이고 제목에 mmph mmph가 포함된 메시지를 Kenny 폴더에 넣습니다.

Not

마지막으로, 때로는 일치하지 않는 항목에 대해 귀하가 명령을 적용해야 할 수도 있습니다. 명령문 앞에 not을 추가하면 그렇게 처리되도록 할 수 있습니다:

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";
}

이는 다음과 같습니다:

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";
}

이는 제목에 ‘real guitar’가 포함되지 않은 모든 이메일을 Young people 폴더에 넣습니다.

물론 이 모든 테스트를 함께 결합하는 것도 가능합니다. 예를 들어, 보낸 사람이 Kenny가 아니고 제목에 mmph mmph가 포함되어 있지 않은 이메일에 귀하가 별표를 표시하고 싶을 수 있습니다:

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

헤더에서 테스트 수행하기

address 명령을 사용하면 귀하는 from, tosender 헤더와 같은 주소 헤더에 대해 테스트를 수행할 수 있습니다. 다음 플래그 중 하나를 사용하여 귀하는 이메일 주소의 다른 부분을 추출할 수 있습니다:

  • :localpart — 골뱅이 기호(@) 앞부분
  • :domain — 골뱅이 기호(@) 뒷부분
  • :all — 주소 전체

다음 스니펫은 이 명령의 사용법을 설명합니다:

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";
}

요약하자면, 이 스크립트는 northpark.example.com 도메인에서 보낸 모든 항목은 PaperPeople 폴더에, springfield.example.com 도메인에서 보낸 모든 항목은 YellowPeople 폴더에 넣습니다.

또한 이메일이 어떤 도메인에서 전송되었는지에 관계없이 @ 앞부분이 chef(예: chef@example.com)와 일치하면 메시지에 플래그가 지정됩니다. 또 다른 흥미로운 사용법은 특정 주소로 발송된 모든 항목을 자동으로 하나의 폴더에 저장하는 것입니다:

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

고급

envelope 명령을 사용하면 귀하는 더 많은 테스트를 수행할 수 있습니다. 일반적으로 address 테스트는 헤더에서 값만 가져옵니다. 하지만 SMTP 세션에서는 헤더에 있는 주소와 다른 from 주소를 지정할 수 있습니다.

Proton Mail 헤더 인터페이스에서 envelope-from은 return-path 헤더와 같고, envelope-to는 x-original-to 헤더와 같습니다.

envelope 명령을 사용하면 귀하는 엔벨로프에서 실제 to:from: 주소를 가져올 수 있습니다. 이 두 가지 필드 외에는 다른 필드가 존재하지 않으므로, 이 명령에서는 sender가 존재하지 않는다는 점에 유의하시기 바랍니다. 아울러 envelope는 확장 기능에 포함되어 있으므로 귀하가 이 확장 기능을 먼저 require해야 합니다.

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";
}

두 값을 평가하기 위해 비교기 사용하기

테스트가 두 값을 평가할 때, 비교기(comparators)라고 불리는 다양한 플래그를 사용하여 이 비교가 어떻게 수행되는지 지정할 수 있습니다. 앞서 우리는 주어진 문자열이 특정 값과 정확히 일치하는지 확인하는 :is와, 특정 값에 주어진 문자열이 포함되어 있는지 확인하는 :contains라는 두 가지 비교기를 이미 사용한 바 있으며, 이는 다음 테스트와 같습니다.

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";
}

더 구체적인 형식을 정의하기 위해 :matches 비교기를 사용할 수도 있습니다. 이는 :is 비교기와 마찬가지로 처음부터 끝까지 두 값을 비교합니다. 그러나 :matches의 경우, 귀하가 정의한 값에 ?* 값이 포함될 수 있습니다. 물음표는 한 문자만 일치하고, 별표(와일드카드라고 함)는 0개 이상의 문자와 일치합니다.

이 형식을 사용하여 귀하는 다음과 같은 테스트를 생성할 수 있습니다:

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

이 예시에서 메시지의 제목이 mmph로 시작하고 그 뒤에 다른 문자나 단어가 포함되어 있으면 테스트가 성공합니다. 즉, 제목이 ‘mmph’로 시작하면 이메일에 플래그가 지정됩니다. ‘mmph mmph’ 및 ‘mmph mmph Hello’는 모두 일치하지만, ‘Hello mmph’ 및 ‘Springfield sales’는 일치하지 않습니다.

별표는 다음과 같이 값의 중간에 여러 번 사용될 수도 있습니다:

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

이 테스트는 제목이 ‘mmph ’(공백 포함)로 시작하고 다른 ‘mmph ’(공백 포함)를 포함하며 ‘mmph’(공백 없음)로 끝나는 경우에 일치합니다. 일치하는 제목은 ‘mmph mmph mmph’, ‘mmph mmph mmphmmph’ 또는 ‘mmph is mmph and mmph’입니다.

:matches 비교기는 주소 비교에 매우 유용할 수 있습니다. 귀하도 알고 계시겠지만, Proton Mail에는 protonmail.comproton.me와 같은 여러 도메인이 있습니다. 메시지가 Proton Mail 사용자로부터 온 것인지 확인하려면 다음 스크립트를 사용할 수 있습니다:

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

어떤 이유로 문자 * 또는 ?를 정확히 일치시켜야 하는 경우, 앞에 \\를 추가하여 따옴표 처리(quote)할 수 있습니다. \\* 는 별표와 일치하고 \\? 는 물음표와 일치하게 됩니다.

정규표현식(regex) 확장 기능도 지원하며, 이 역시 :regex 비교기를 정의한다는 점에 유의하세요. 이 비교기는 :matches보다 더 정밀한 버전이지만 매우 복잡합니다. 더 자세한 정보는 공식 문서(새 창)를 읽어보시기 바랍니다.

일부 경우(이 기사의 다음 부분에서 확인하실 수 있듯이) 귀하가 숫자 값을 비교하고자 할 수 있습니다. relational 패키지가 이러한 용도로 개발되었습니다. 이 패키지는 비교 유형이 뒤따르는 :value 비교기를 정의합니다.

이를 통해 귀하는 값이 주어진 값보다 큰지(비교 유형 “gt”), 크거나 같은지(“ge”), 같은지(“eq”), 작거나 같은지(“le”) 또는 작은지(“lt”)를 확인할 수 있습니다.

숫자 값을 비교할 때 comparator-i;ascii-numeric 패키지도 매우 유용합니다. 이는 스크립트 해석기에 문자열의 내용이 일반 문자열이 아니라 숫자임을 알려줍니다. 테스트에 :comparator “i;ascii-numeric”을 추가하여 사용할 수 있습니다.

이 모든 정보를 바탕으로 우리는 다음과 같은 스크립트를 빌드할 수 있습니다:

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

이 테스트는 제목이 2보다 크거나 같으면 메시지를 Dummy example 폴더로 이동합니다. 제목이 숫자가 아닌 텍스트인 경우 테스트는 실패합니다. 따라서 이 예시는 매우 엉성해 보이지만, 이 글의 후반부에서 정의할 date와 같은 다른 확장 기능과 결합하여 사용하도록 의도된 것입니다.

Sieve에서 컨텍스트를 사용한 비교

귀하는 또한 확장 기능을 사용하여 귀하의 계정 및 전반적인 Proton Mail 컨텍스트와 관련된 정보에 액세스할 수 있습니다. 예를 들어, 보낸 사람 주소가 귀하의 연락처 목록에 있는지 확인할 수 있습니다.

귀하의 연락처 목록에 액세스하기

귀하는 extlists 확장 기능을 사용하여 귀하의 연락처 목록에 액세스할 수 있습니다. 헤더 테스트와 결합하여, 연락처가 귀하의 연락처 목록에 있는지 확인할 수 있습니다.

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

이 테스트는 보낸 사람이 :addrbook:personal?label=Family 목록에 포함되어 있는 경우 메시지에 Known 라벨로 플래그를 지정합니다. 이 목록은 두 부분으로 나눌 수 있습니다. 첫째, :addrbook:personal은 주소가 귀하의 개인 주소록에 있음을 의미합니다. 둘째, label=Family는 목록을 더욱 좁혀서, 주소록에 있을 뿐만 아니라 해당 연락처가 Family 연락처 그룹에도 속해야 함을 지정합니다. 필요한 경우 이 라벨을 다른 연락처 그룹으로 변경할 수 있습니다. 원하는 경우 :addrbook:personal?label=Work를 사용할 수 있으며, 이 경우 보낸 사람이 귀하의 주소록에 있고 Work 연락처 그룹에 속해 있는 경우에만 테스트가 성공합니다.

보다 일반적으로 목록은 태그 URI 스킴(Tag URI Scheme)(새 창)을 따르며, 귀하는 필터를 좁히기 위해 추가 매개변수를 추가할 수 있습니다. 그런 다음 다음과 같이 이 목록을 사용할 수 있습니다:

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

저희는 네 가지의 서로 다른 목록을 제공합니다:

  • :addrbook:personal¹은 주소가 귀하의 연락처 목록에 있는지 확인합니다. 이 목록은 label 매개변수를 수용하며, 이는 특정 연락처 그룹과 일치합니다. 이 매개변수는 네 가지 하위 버전으로 분류될 수 있습니다:
    • :addrbook:personal?label=something“something” 연락처 그룹에 있는 연락처와 일치합니다;
    • :addrbook:personal?label.starts-with=something“something”으로 시작하는 그룹이 최소 하나 이상에 속한 연락처와 일치합니다;
    • :addrbook:personal?label.ends-with=something“something”으로 끝나는 그룹이 최소 하나 이상에 속한 연락처와 일치합니다;
    • :addrbook:personal?label.contains=something“something”을 포함하는 그룹이 최소 하나 이상에 속한 연락처와 일치합니다.

귀하는 또한 일치하는 이메일에 대한 암호화 정보에 액세스할 수 있습니다:

  • :addrbook:personal?keypinning=true신뢰하는 키를 가진 연락처와 일치합니다. true를 false로 변경하면 신뢰하는 키가 없는 연락처와 일치합니다;
  • :addrbook:personal?encryption=true는 암호화가 활성화된 연락처와 일치합니다. true를 false로 변경하면 암호화가 설정되지 않았거나 비활성화된 연락처와 일치합니다;
  • :addrbook:personal?signing=true는 서명이 활성화된 연락처와 일치합니다. true를 false로 변경하면 서명이 비활성화된 연락처와 일치하게 됩니다.
  • :addrbook:myself¹은 귀하가 소유한 모든 주소와 일치합니다.
  • :addrbook:organization은 귀하가 구성원으로 속한 조직의 다른 사람이 소유한 모든 주소와 일치합니다.
  • :incomingdefaults:inbox는 주소가 귀하의 허용 목록에 있는지 확인합니다.
  • :incomingdefaults:spam은 주소가 귀하의 차단 목록에 있는지 확인합니다.

변수 확장(다음 단락에 설명됨)과 결합하면 일치하는 변수가 변경됩니다. 일치하는 변수 ${0}에는 항상 지정된 목록에 포함된 마지막 이메일 주소가 포함됩니다. 목록이 주석 1로 표시되어 있으면 일치하는 변수 ${1}에 표시되는 이름이 포함됩니다.

예를 들어, 아래 목록을 사용하여 가족이나 귀하의 인증 허용 목록에 있는 사람 외의 다른 사람으로부터 받은 모든 이메일을 삭제하는 필터를 만들 수 있습니다.

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
}

해당 조건이 충족되면 discard(버리기) 동작이 실행됩니다. 이 동작은 이메일을 즉시 영구적으로 삭제합니다. 버리기 동작 대신 fileinto 동작을 사용하여 간단히 휴지통 폴더로 이동할 수도 있습니다: fileinto “trash”;.

변수 생성

콘텍스트를 관리할 때 유용한 또 다른 도구는 variable(변수) 정의입니다. 변수는 텍스트를 저장하고 이름을 태그할 수 있는 임시 저장공간입니다. 나중에 이 이름을 호출하여 해당 콘텐츠를 재사용할 수 있습니다. 예를 들어 다음과 같은 스크립트를 작성할 수 있습니다.

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}";

이 스크립트의 목적은 맞춤화된 메시지로 이메일을 거절하는 것입니다. 원본 이메일의 보낸 사람이 kenny이고 제목이 ‘mmph mmph’인 경우, mmph mmph가 포함된 ‘message’ 변수가 생성됩니다. 그렇지 않은 경우 메시지는 ‘Sorry, I don’t want emails today!’로 채워집니다. 그런 다음 마지막 단계에서 이 변수를 거절(reject) 명령에 재사용합니다.

Sieve는 기본적으로 변수를 정의하지 않으므로, 스크립트의 시작 부분에서 호출해야 하는 variables 확장에 정의됩니다. 변수를 정의하는 방법에는 두 가지가 있습니다.

  • 명시적인 변수 생성:

변수를 생성하기 위해 set 동작이 제공됩니다.

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

첫 번째 문자열은 변수의 이름이고 두 번째는 변수의 값입니다. 따라서 이전 예는 Work를 포함하는 labelname이라는 변수를 생성합니다.

변수가 정의되면 문자열에 ${name}(여기서 name은 변수 이름) 형식을 추가하여 호출할 수 있습니다. 실행 시 변수 값으로 대체됩니다. (변수를 정의하지 않은 경우 빈 문자열로 대체됩니다.) 따라서 다음 스크립트에서는:

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}";

귀하의 이메일에는 /Work 라벨이 지정됩니다. 이미 labelname 변수를 정의했으므로 Work로 대체됩니다. 그러나 foldername은 정의되지 않았으므로 단순히 제거됩니다.

  • 암시적인 변수 할당:

변수의 가장 흥미로운 사용 사례는 :matches 테스트를 사용할 때입니다. 이메일 보낸 사람이 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}";
}

variables 확장과 함께 사용하면 match 연산의 결과가 변수에 저장됩니다. 여러 변수가 숫자 이름으로 설정됩니다. 먼저 변수 0에는 전체 일치 항목(이 예제에서는 전체 주소인 test@proton.me)이 포함됩니다. 그런 다음 첫 번째 일치 그룹이 변수 1(이 예제에서는 test)에 할당되고, 두 번째 일치 그룹이 두 번째 변수(proton.me)에 할당되는 방식으로 마지막 일치 그룹까지 계속됩니다.

이 예제에서는 fileinto 명령이 실행됩니다. 위치는 변수로 인식되는 ${1}로 정의되므로 위에서 계산된 값인 test로 대체됩니다.

정규식 일치 그룹을 사용하여 :regex 테스트에서도 변수를 할당할 수 있습니다.

변수 변환

한 가지 좋은 가능성은 변수를 변환하는 것입니다. 이를 위해 set 키워드를 변수에 할당하기 전에 값을 변경하는 데 사용할 수 있는 플래그 조합과 함께 사용할 수 있습니다.

  • :lower는 변수 값을 소문자로 변경합니다.
  • :upper는 변수 값을 대문자로 변경합니다.
  • :lowerfirst는 변수 값의 첫 글자를 소문자로 변경합니다.
  • :upperfirst는 변수 값의 첫 글자를 대문자로 변경합니다.
  • :quotewildcard는 문자열에 포함된 모든 와일드카드를 인용 처리하여 일치 문에서 리터럴로 사용할 수 있도록 합니다.
  • :length는 값의 길이를 반환합니다.

정의된 변수를 다른 set 동작에서 재사용할 수도 있습니다. 이전 예를 개선해 보겠습니다:

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}";

단계별로 필터는 세 개의 변수를 생성합니다. 첫 번째 명령인 setlabelname 변수를 생성합니다. 변수의 내용은 Work입니다. 실제로 원래 값인 WORK는 :lower:upperfirst 플래그를 모두 사용하여 변환되어 work로 바뀐 다음 Work로 바뀝니다.

두 번째 set 명령은 Geneva 문자열을 포함하는 foldername이라는 두 번째 변수를 생성합니다. 실제로 :lower:upperfirst 플래그가 사용되었습니다.

마지막으로 변수 location이 생성됩니다. 값 “${foldername}/${labelname}“에는 foldernamelabelname이라는 두 개의 변수가 포함되어 있습니다. 따라서 sieve 인터프리터는 이러한 변수를 해당 값인 Work 및 Geneva로 대체합니다.

마지막으로 location 변수가 fileinto 명령의 인수로 사용됩니다. 따라서 이메일은 location 변수의 값인 Work/Geneva라는 이름의 폴더로 이동됩니다.

비교 연산자를 일치하는 변수에도 적용할 수 있습니다:

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

여기서 이메일 보낸 사람이 test@proton.me인 경우 Test 라벨이 지정됩니다.

변수 값을 변경하는 또 다른 방법은 vnd.proton.eval 확장을 사용하는 것입니다. 이 확장은 몇 가지 간단한 계산을 수행할 수 있게 해주는 새로운 플래그 :eval을 정의합니다.

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}";
}

이 예에서 이메일이 여전히 test@proton.me에서 수신된다고 가정하면 이메일은 478 값으로 지정됩니다. 실제로 첫 번째 일치하는 변수의 길이는 19이고, 19 * 25 – 1 / 8 + 3의 결과는 올림하여 478이 됩니다.

처음에는 이것이 쓸모없어 보일 수 있지만, 이 확장은 다른 작업과 결합할 때 더 유용합니다.

Sieve의 다른 필드와의 비교

특정 헤더를 기반으로 일치시키는 것도 가능합니다. 예를 들어, 목록으로 전송된 모든 메시지(대부분 마케팅 메시지 또는 뉴스레터)를 정렬하려면 다음과 같이 할 수 있습니다.

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

소셜 미디어 이메일을 전용 폴더로 분류하려면 다음과 같이 작성할 수 있습니다.

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";
}

다음과 같이 사용한다는 점에 유의하세요.

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

다음 대신:

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

후자는 x-facebookx-linkedin-id가 모두 설정되었는지 확인하기 때문입니다.

헤더에 실제로 어떤 값이 포함되어 있는지 확인하려면 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";
}

정확히 일치하는 항목을 찾는 :is 연산 외에도 header 명령은 와일드카드를 사용하여 일치시키는 :matches(예: “*@*.com“은 .com으로 끝나는 모든 이메일 주소와 일치함) 및 헤더에 지정된 문자열이 포함되어 있는지 확인하는 :contains 명령도 지원합니다.

Sieve 필터를 설계하려면 이메일의 헤더를 가져오는 것이 유용할 수 있습니다. Proton Mail 웹 인터페이스에서 이 작업을 수행하려면 더 보기() → 헤더 보기로 이동하세요. 이메일의 모든 헤더가 포함된 새 창이 열립니다.

Sieve에서 메시지 크기를 이용한 필터링

크기가 큰 이메일을 작은 이메일과 다르게 처리할 수 있습니다. 예를 들어, 메일함 공간을 절약하기 위해 크기가 큰 이메일을 삭제할 수 있도록 플래그를 지정하고 싶을 수 있습니다. 이는 다음과 같은 방법으로 수행할 수 있습니다:

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";
}

보시다시피, 큰 크기를 지정하려는 경우 숫자 바로 뒤에 원하는 단위에 해당하는 문자를 추가하여 단위를 사용할 수 있습니다. 사용할 수 있는 단위는 세 가지입니다: K기비옥텟(또는 1024바이트), M메비옥텟(또는 1 048 576바이트), 그리고 G기비옥텟 (또는 1 073 741 824바이트)입니다.

이 경우 “over”는 ~보다 큼(초과)을 의미하고, “under”는 ~보다 작음(미만)을 의미합니다. 즉, 메시지 크기가 정확히 1000바이트인 경우 어느 쪽도

size :under 1000

size :over 1000

일치하지 않습니다.

Sieve 필터는 실제 콘텐츠에 접근할 수 없으며 암호화된 크기만 볼 수 있습니다.

메시지에 대한 고급 동작 수행

Sieve에서 메시지에 대해 다양한 동작을 실행할 수 있습니다. 이전 섹션에서 이미 fileinto, addflag, discard, reject 동작을 설명해 드렸습니다. 여기서는 더욱 고급 동작을 소개해 드리겠습니다.

부재중 메시지 및 날짜 테스트

Sieve의 자동 응답 기능은 vacation 명령어를 사용하여 구현할 수 있습니다. 사실 설정에 있는 자동 응답 기능은 작동을 위해 Sieve에 의존합니다. 하지만 스크립트 내에서 vacation 옵션을 사용하면 자동 응답을 맞춤 설정할 수 있는 더 많은 가능성이 열립니다. 예를 들어, 조건에 따라 특정 메시지를 맞춤 정의할 수 있습니다. 참고: 설정의 자동 응답 기능과 마찬가지로 vacation 동작은 유료 플랜에서만 사용할 수 있습니다.

vacation 명령어는 귀하에게 연락을 시도하는 모든 사람에게 부재중 응답을 보냅니다. 특정 기간 동안 응답을 전송하기 위해 종종 currentdate 또는 date 테스트와 함께 사용됩니다.

콜로라도 시간 기준으로 2017년 7월 14일부터 2017년 8월 14일까지 휴가를 간다고 가정해 보겠습니다. 다음 Sieve 코드를 사용하여 자동 응답기를 설정할 수 있습니다:

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.";
}

vacation 명령어의 선택적 인수 중에는 :handle:days 인수가 있습니다. 기본적으로 Sieve는 타임아웃이라고 불리는 특정 일수 내에 동일한 보낸 사람에게 여러 번 회신하지 않습니다. 이를 통해 귀하가 실수로 수많은 자동 이메일을 전송하는 것을 방지할 수 있습니다.

타임아웃을 제어하려면 :days 매개변수를 사용할 수 있습니다. :days 인수는 주소를 보관하고 응답하지 않는 기간을 지정하는 데 사용되며, 항상 일 단위로 지정됩니다. 때로는 Sieve 스크립트에 여러 개의 vacation 명령어가 있을 수 있으며, (규칙이 일치하는 경우) 각 명령어마다 최소 한 번은 회신을 보내도록 해야 할 수도 있습니다. 이 경우 :handle 옵션을 사용할 수 있습니다. :handle에 전달되는 인수는 전송되는 응답 유형을 식별하는 문자열입니다.

이것이 어떻게 작동하는지 알아보기 위해, 귀하가 교사라고 가정해 보겠습니다. 교사는 종종 이메일로 과제물을 제출받습니다. 이러한 과제물을 전용 폴더로 분류하는 것이 유용합니다. 또한, 마감 기한이 지나서 제출된 과제물은 거부할 수 있습니다.

이런 상황에서는 필요할 때 회신이 전송되도록 handle을 사용하고 싶을 수 있습니다:

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.";
    }
}

부재중 응답에 허용되는 모든 인수는 인수를 전달해야 하는 순서대로 다음과 같이 나열됩니다:

  • :days는 자동 응답기가 부재중 메시지를 보낸 후 동일한 보낸 사람에게 응답 전송을 보류해야 하는 일수입니다
  • :subject는 자동 응답기가 보낸 사람에게 회신할 때 사용해야 하는 접두어(기본값은 auto)입니다. 예를 들어, “Homework Assignment 2”는 “late: Homework Assignment 2”라는 회신을 받게 됩니다, 만약 :subject “late”가 전달된다면.
  • :mime은 응답의 첫 번째 줄이 특정 형식을 사용함을 나타냅니다. 이를 통해 HTML 메시지로 응답을 보낼 수 있습니다. 예를 들어, HTML 응답을 작성하려면 :mime 인수를 전달하고 응답의 첫 번째 줄에 Content-Type : text/html을 작성하십시오.
  • :handle은 전송되는 응답 유형을 식별하는 문자열입니다.

:zone 매개변수(currentdate에 지정)는 선택 사항이며, 설정하지 않으면 서버의 현지 시간(Proton Mail의 경우 스위스 제네바)이 사용된다는 점에 유의하십시오.

zone 매개변수는 UTC+1을 의미하는 “+0100” 형식의 문자열인 시간대 오프셋과 ICANN 데이터베이스의 실제 시간대를 허용합니다( https://en.wikipedia.org/wiki/List_of_tz_database_time_zones(새 창) 참고). 마지막 옵션은 (비표준 Sieve 방식이지만) 각 시간대의 일광 절약 시간도 포함하므로 종종 더 유용합니다.

일반적인 :is/ :contains/ :matches 매개변수를 사용하여 날짜를 비교할 수 있습니다. 예를 들어, 다음 Sieve 명령어는 2017년 7월의 모든 날짜와 일치합니다:

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

하지만 대부분의 경우 :value 매개변수가 훨씬 더 유용합니다.

마지막으로 전달해야 할 매개변수는 형식입니다. 형식은 날짜의 어느 부분을 비교할지도 지정합니다. 제공된 예시에서는 date 형식을 사용했습니다. 지원되는 모든 형식은 다음과 같습니다:

  • year, “0000”부터 “9999” 형식으로 표시되는 연도
  • month, “01”부터 “12”로 표시되는 월
  • day, “01”부터 “31”로 표시되는 일
  • date, yyyy-mm-dd 형식으로 표시됨
  • hour, “00”부터 “23”으로 표시되는 시간
  • minute, “00”부터 “59”로 표시되는 분
  • second, “00”부터 “60”으로 표시되는 초(60은 윤초(새 창)이며, 과학자들이 필요하다고 판단할 때만 23:59:60에 발생함)
  • time, hh:mm:ss 형식의 시간
  • iso8601, ISO8601 표준에 따른 날짜 및 시간(예: 2005-08-15T15:52:01+00:00)
  • std11, RFC2822 표준에 따른 날짜 및 시간(예: Mon, 15 Aug 2005 15:52:01 +0000)
  • zone, +/-zzzz 형식의 시간대 오프셋(예: +0000 또는 -1200)
  • julian, 1858년 11월 17일 UTC 이후 경과된 일수
  • weekday, 일요일을 0으로 시작하여 토요일을 6으로 지정한 요일

마지막으로, currentdate를 사용하는 대신 헤더에서 날짜를 가져오는 것도 가능합니다. 이 date 명령어는 형식 문자열 앞에 헤더 이름이라는 추가 문자열이 필요하다는 점을 제외하면 currentdate와 동일하게 작동합니다. 예를 들면 다음과 같습니다:

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

헤더가 반드시 정확한 것은 아닙니다. 보낸 사람이 마음대로 변경할 수 있으므로 신뢰할 수 없다는 점에 유의하시기 바랍니다.

고려 사항:

  1. 자동 응답기는 메일링 리스트, 다른 자동 응답기가 전송한 이메일, 또는 noreply 주소로 전송된 메시지와 같이 자동으로 생성된 메시지에는 응답하지 않습니다.
  2. 자동 응답기는 vacation 명령어에 다른 :handle이 있는 경우를 제외하고, 동일한 이메일 주소로 메시지를 여러 번 전송하지 않습니다.

유효기간 관리

Proton Mail의 한 가지 독특한 기능은 발송된 메시지에 유효기간을 설정할 수 있다는 점입니다. 유효기간이 만료되면 해당 메시지는 수신인의 메일함에서 삭제됩니다.

수신 메시지에 유효기간을 추가하여 이 기능을 수신 메시지 관리에 활용할 수도 있습니다:

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

위의 스크립트는 수신한 모든 이메일을 10일 후에 삭제합니다. 이는 모든 이메일에 적용되므로 다소 극단적일 수 있습니다. 대신, 조건을 설정하여 특정 이메일 집합에만 스크립트를 적용하는 것이 좋습니다. 예를 들어, 연락처에 없는 사람으로부터 받은 메시지를 만료시킬 수 있습니다:

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";
}

참고: 지정된 유효기간이 730일을 초과하면 자동으로 최대 730일로 제한됩니다.

Sieve의 제한 사항

귀하가 유의하셔야 할 몇 가지 Sieve 제한 사항이 있습니다.

  • 보낸 메시지는 수동으로 또는 필터에 의해 받은 편지함/임시 보관함으로 이동할 수 없습니다. 해당 메시지는 항상 보낸 편지함 폴더 및 사용자 또는 필터가 적용한 폴더/라벨에 유지됩니다.
  • 받은 메시지는 수동으로 또는 필터에 의해 임시 보관함/보낸 편지함으로 이동할 수 없습니다.
  • 임시 보관함의 메시지는 수동으로 또는 필터에 의해 받은 편지함/보낸 편지함으로 이동할 수 없습니다.
  • 스팸에 있는 메시지(또는 처리 중에 스팸으로 분류된 메시지)에 대해서는 자동 응답/부재중 메시지를 보내지 않습니다. 귀하께서 이러한 기능이 필요하신 경우, 사용자 정의 폴더(예: mySpam)를 추가하고 이에 대한 알림을 비활성화하는 것을 고려해 보십시오.
  • 자동 응답/부재중 메시지 제한 사항

정규식 지원에 관한 참고 사항

Proton의 Sieve 구현은 최소한의 정규식 지원만 포함하는 Sieve 이메일 필터링 표준을 따릅니다. \b (단어 경계), \w (단어 문자), \W (비단어 문자) 및 \d (숫자)와 같은 일부 일반적인 정규식 축약 구문은 Sieve에서 지원되지 않습니다. 따라서 필터에 이러한 축약 문자를 사용하면 아무런 오류 표시 없이 실패할 수 있습니다. 이러한 제한은 플랫폼 전반의 단순성과 호환성을 우선시하는 Sieve 표준 자체로 인한 것입니다. 자세한 내용은 Sieve 정규식 초안 RFC를 참고하십시오.

지원되는 동작 및 테스트 목록

패키지

Sieve는 다음 확장을 지원합니다. 귀하께서는 공식 문서를 참조하여 더 자세한 정보를 확인하실 수 있습니다.

날짜

  • 사용법: date
  • 설명: (새 창)날짜 정보를 확인하는 방법을 제공합니다.
  • 문서: https://tools.ietf.org/html/rfc5260(새 창)
  • 구현: 기본 비교기는 i;ascii-casemap이 아니라 i;ascii-numeric입니다. 실제로 date는 casemap 비교기와 함께 사용하기에 유용하지 않습니다.
  • 참고: 부재중 메시지 및 날짜 테스트

엔벨로프

FileInto

  • 사용법: fileinto
  • 설명: 메시지에 라벨을 적용하거나 폴더로 이동합니다.
  • 문서: https://tools.ietf.org/html/rfc5228#section-4.1(새 창)
  • 구현: 슬래시는 폴더의 전체 경로를 나타내며, 라벨 이름에 슬래시가 포함된 경우 이스케이프 처리를 해야 합니다. 다음 옵션이 지원됩니다:
    • Work“: 이는 ‘Work’라고 하는 라벨 또는 폴더입니다.
    • Work/Project1“: 이는 ‘Work’ 폴더 안에 있는 하위 폴더 ‘Project1’입니다.
    • Work/Project1/Docs“: 이는 ‘Work’ 폴더의 하위 폴더 ‘Project1’ 안에 있는 하위 폴더 ‘Docs’입니다.
    • Work/Misc\\/Others“: 이는 ‘Work’ 폴더 안에 있는 하위 폴더 ‘Misc/Others’입니다.
  • 참고: 시작하기

Imap4flags

Reject

Vacation

Variables

관계형

  • 사용법: relational
  • 설명: 관계형 일치 연산자를 제공합니다.
  • 문서: https://tools.ietf.org/html/rfc5231

정규식

  • 사용법: regex
  • 설명: 정규식 일치 연산자를 제공합니다.
  • 문서: https://tools.ietf.org/id/draft-ietf-sieve-regex-01.html

ASCII 숫자 비교기

외부에 저장된 목록

  • 사용법: extlists
  • 설명: 연락처 목록에 대한 접근을 제공합니다.
  • 문서: https://tools.ietf.org/html/rfc6134(새 창)
  • 구현: 다음 목록이 지원됩니다
    • addrbook:personal : 개인 연락처 목록입니다. 다음 쿼리가 지원됩니다:
      • label[.starts-with / .ends-with / .contains]=<group: string>: 연락처 그룹에 대한 작업;
      • keypinning=<value: true / false> 연락처의 공개 키 정의;
      • encryption=<value: true / false> 연락처의 기본 암호화 설정;
      • signing=<value: true / false>  연락처의 기본 서명.
    • :addrbook:myself 현재 사용자의 주소;
    • :addrbook:organization 현재 조직 구성원의 주소;
    • :incomingdefaults:inbox 허용 목록
    • :incomingdefaults:spam 차단 목록
  • 참고: 귀하의 연락처 목록에 액세스하기

Eval

  • 사용법: vnd.proton.eval
  • 설명: 문자열로 제공되는 간단한 산술 함수를 평가합니다.
  • 문서: 변수 변환

Include

유효기간

  • 사용법: vnd.proton.expire
  • 설명: 메시지 유효기간을 관리합니다.
  • 문서: 유효기간 관리

테스트

현재 날짜

  • 사용법:
currentdate [":zone" <time-zone: string>] [COMPARATOR] [MATCH-TYPE] <date-part: string> <key-list: string-list>

날짜

  • 사용법:
date [":zone" <time-zone: string> / ":originalzone"] [MATCH-TYPE] <header-name: string> <date-part: string> <key-list: string-list

HasFlag

  • 사용법:
hasflag [MATCH-TYPE] [COMPARATOR] <list-of-flags: string-list>
  • 설명: 특정 메시지에 특정 플래그가 있는지 테스트합니다.
  • 패키지: imap4flags
  • 참조: 시작하기

엔벨로프

  • 사용법:
envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <envelope-part: string-list> <key-list: string-list>

주소·

  • 사용법:
address [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <header-list: string-list> <key-list: string-list>
  • 설명: 주소로 구문 분석된 지정된 헤더가 지정된 키와 일치하는지 테스트합니다.
  • 패키지: <기본>
  • 참조: Sieve에서의 주소 비교

헤더

  • 사용법:
header [COMPARATOR] [MATCH-TYPE] <header-names: string-list> <key-list: string-list>

HasExpiration

  • 사용법:
hasexpiration
  • 설명: 메시지에 유효기간이 설정되어 있는지 테스트합니다.
  • 패키지: vnd.proton.expire

Exists

  • 사용법:
exists <header-names: string-list>

유효기간

  • 사용법:
expiration :comparator "i;ascii-numeric" [MATCH-TYPE] <unit: "day" / "minute" / "second"> <key-list: string-list>
  • 설명: 메시지 유효기간을 주어진 키와 비교합니다. 유효기간이 설정되지 않은 메시지에 대해 실행하면 테스트가 실패합니다.
  • 패키지: vnd.proton.expire

Size

  • 사용법:
size <":over" / ":under"> <limit: number>

String

  • 사용법:
string [MATCH-TYPE] [COMPARATOR] <source: string-list> <key-list: string-list>
  • 설명: 소스 문자열 중 하나라도 일치하는 키가 있는지 평가합니다.
  • 패키지: variables

Anyof

  • 사용법:
anyof <tests: test-list>
  • 설명: 제공된 테스트에 대해 논리합(OR) 연산을 수행합니다.
  • 패키지: <기본>
  • 참고: 시작하기

Allof

  • 사용법:
allof <tests: test-list>
  • 설명: 제공된 테스트에 대해 논리곱(AND) 연산을 수행합니다.
  • 패키지: <기본>
  • 참조: 시작하기

Not

  • 사용법:
not <test: test>
  • 설명: 주어진 테스트의 결과를 반전시킵니다.
  • 패키지: <기본>
  • 참조: 시작하기

True

  • 사용법:
true
  • 설명: 항상 일치합니다.
  • 패키지: <기본>

False

  • 사용법:
false
  • 설명: 절대 일치하지 않습니다.
  • 패키지: <기본>

동작

Require

  • 사용법:
require <packages: string-list>
  • 설명: 지정된 확장의 메서드나 수정 사항을 사용할 수 있도록 불러옵니다.
  • 패키지: <기본>
  • 참고: 시작하기

FileInto

  • 사용법:
fileinto <folder: string>
  • 설명: 처리 중인 메시지를 특정 폴더로 이동합니다.
  • 패키지: fileinto
  • 참조: 시작하기

Addflag

  • 사용법:
addflag <list-of-flags: string-list>
  • 설명: 처리 중인 메시지에 지정된 플래그를 추가합니다.
  • 패키지: imap4flags
  • 참조: 시작하기

Removeflag

  • 사용법:
removeflag <list-of-flags: string-list>
  • 설명: 처리 중인 메시지에서 지정된 플래그를 삭제합니다.
  • 패키지: imap4flags

Setflag

  • 사용법:
setflag <list-of-flags: string-list>
  • 설명: 처리 중인 메시지에서 모든 플래그를 삭제하고 지정된 플래그를 설정합니다.
  • 패키지: imap4flags

Stop

  • 사용법:
stop
  • 설명: 모든 Sieve 필터의 처리를 중단합니다. 후속 Sieve 필터는 실행되지 않습니다.
  • 패키지: <기본>

Return

  • 사용법:
return
  • 설명: 현재 Sieve 필터의 처리를 중단합니다. 후속 Sieve 필터는 계속 실행됩니다.
  • 패키지: include

Set

  • 사용법:
set [MODIFIER] <name: string> <value: string>
  • 설명: 주어진 이름과 주어진 값을 연관시키는 새로운 변수를 생성합니다.
  • 패키지: variables
  • 참고: 변수 생성

Discard

  • 사용법:
discard
  • 설명: 이 Sieve 필터의 끝에서 메시지를 버립니다. 버린 후에는 다른 Sieve 필터가 실행되지 않습니다.
  • 패키지: <기본>

Keep

  • 사용법:
keep
  • 설명: 마지막 discard 명령을 되돌립니다. 동일한 Sieve 필터 내에 있는 경우에만 적용됩니다. 실행된 discard 명령이 없는 경우 아무 작업도 수행하지 않습니다.
  • 패키지: <기본>

Reject

  • 사용법:
reject <reason: string>

Expire

  • 사용법:
expire <unit: "day" / "minute" / "second"> <value: string>
  • 설명: 지정된 시간이 지나면 메시지를 만료시킵니다.
  • 패키지: vnd.proton.expire
  • 참조: 유효기간 관리

Unexpire

  • 사용법:
unexpire
  • 설명: 메시지의 유효기간을 삭제합니다.
  • 패키지: vnd.proton.expire

Vacation

  • 사용법:
vacation [":days" number] [":subject" string] [":mime"] [":handle" string] <reason: string>
  • 설명: 지정된 이유를 본문으로 하여 보낸 사람의 SMTP 주소로 자동 회신을 보냅니다.
  • 패키지: vacation (유료 계정 필요)
  • 참조: 부재중 메시지 및 날짜 테스트

Valid External List

  • 사용법:
valid_ext_list <ext-list-names: string-list>
  • 설명: 제시된 모든 외부 목록이 지원되고 유효한지 테스트합니다.
  • 패키지: extlists