หน้าแรก 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 สามารถดูบทแนะนำอื่นๆ อีกมากมายบนออนไลน์ที่ช่วยได้ และหากมีคำถามเกี่ยวกับ Sieve ใน Proton Mail ที่ไม่มีคำตอบในหน้านี้ สามารถติดต่อฝ่ายสนับสนุนได้ ที่นี่

เริ่มต้นใช้งาน

เพื่อเริ่มต้นสร้างตัวกรอง Sieve ให้เข้าสู่ระบบที่ mail.proton.me(หน้าต่างใหม่) แล้วไปที่ การตั้งค่า → การตั้งค่าทั้งหมด → Proton Mail → ตัวกรอง → เพิ่มตัวกรอง Sieve

สคริปต์ Sieve ประกอบไปด้วยรายการคำสั่งต่างๆ โดยสคริปต์ส่วนใหญ่จะเริ่มต้นด้วยคำสั่ง require ซึ่งคำสั่ง require จะโหลดส่วนขยายที่เปิดใช้ฟังก์ชันการทำงานบางอย่าง ตัวอย่างเช่น หากต้องการกำหนดป้ายกำกับหรือย้ายข้อความไปยังโฟลเดอร์ จะต้องใช้คำสั่ง fileinto

ในการโหลดคำสั่งนี้ ให้เขียนดังนี้:

require "fileinto";

ในการโหลดส่วนขยายหลายรายการ สามารถใช้รายการคำสั่งได้ดังนี้:

require ["fileinto", "imap4flags"];

ในกรณีนี้ imap4flags จะโหลดส่วนขยายที่อนุญาตให้ตั้งค่าสถานะอีเมลว่าอ่านแล้ว หลังจากคำสั่ง require มักจะทำการทดสอบกับข้อความขาเข้า ซึ่งทำได้โดยการรวม if เข้ากับคำสั่งอื่น เช่น address หรือ 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 ) จะต้องมีอยู่แล้วในระบบ โดยสามารถเรียนรู้วิธีสร้างโฟลเดอร์และป้ายกำกับได้ที่นี่ หลังจากป้อนตัวกรองนี้แล้ว ให้คลิกปุ่มบันทึก ตัวกรองจะทำงานกับทุกอีเมลขาเข้า

แน่นอนว่า อาจต้องการย้ายอีเมลจากผู้ส่งหลายรายไปยังโฟลเดอร์เดียวกัน ในกรณีนี้ สามารถส่งรายการของสตริงไปยังคำสั่ง address ได้ (โดย สตริง(หน้าต่างใหม่) คือชุดอักขระ ซึ่งในกรณีนี้คือที่อยู่อีเมล):

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

ในที่นี้ อีเมลจะถูกย้ายไปยังโฟลเดอร์ Kenny หากหัวเรื่องตรงกับ mmph mmph พอดี ในกรณีอื่น (นั่นคือเมื่อหัวเรื่องไม่ตรงกับ mmph mmph พอดี) อีเมลจะถูกย้ายไปยังโฟลเดอร์ Understandable

Elsif

คำสั่ง elsif คือคำย่อของ else 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, to และ sender และสามารถดึงข้อมูลส่วนต่างๆ ของที่อยู่อีเมลได้โดยใช้แฟล็กข้อใดข้อหนึ่งต่อไปนี้:

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

การใช้ตัวเปรียบเทียบเพื่อประเมินค่าสองค่า

เมื่อการทดสอบประเมินค่าสองค่า จะสามารถระบุวิธีการเปรียบเทียบนี้ได้โดยใช้แฟล็กต่างๆ ที่เรียกว่า ตัวเปรียบเทียบ ก่อนหน้านี้ เราได้ใช้ตัวเปรียบเทียบสองตัวแล้ว คือ :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 ค่าที่กำหนดสามารถระบุค่า ? และ * ได้ โดยเครื่องหมายคำถามจะตรงกับอักขระหนึ่งตัว และเครื่องหมายดอกจัน (เรียกว่าไวด์การ์ด) จะตรงกับอักขระศูนย์ตัวขึ้นไป

ด้วยรูปแบบนี้ จะสามารถสร้างการทดสอบนี้ได้:

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.com และ proton.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";
}

การทดสอบนี้จะย้ายข้อความไปยังโฟลเดอร์ Dummy example หากหัวเรื่องมีค่ามากกว่าหรือเท่ากับ 2 หากหัวเรื่องไม่ใช่ตัวเลขแต่เป็นข้อความ การทดสอบจะล้มเหลว ด้วยเหตุนี้ ตัวอย่างนี้จึงดูไม่ค่อยมีประโยชน์นัก แต่ตั้งใจให้ใช้ร่วมกับส่วนขยายอื่นๆ เช่น 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"; 
}

การทดสอบนี้จะทำเครื่องหมายข้อความด้วยป้ายกำกับ Known หากผู้ส่งอยู่ในรายการ :addrbook:personal?label=Family รายการนี้สามารถแบ่งออกเป็นสองส่วน ส่วนแรกคือ :addrbook:personal ซึ่งหมายความว่าที่อยู่นั้นอยู่ในสมุดที่อยู่ส่วนตัว ส่วนที่สองคือ label=Family ซึ่งจะช่วยจำกัดรายการให้แคบลง โดยระบุว่านอกเหนือจากการอยู่ในสมุดที่อยู่แล้ว ผู้ติดต่อจะต้องอยู่ในกลุ่มผู้ติดต่อ Family ด้วย หากต้องการ สามารถเปลี่ยนป้ายกำกับนี้เป็นกลุ่มผู้ติดต่ออื่นได้ และสามารถใช้ :addrbook:personal?label=Work ได้หากต้องการ ซึ่งในกรณีนี้การทดสอบจะเสร็จสมบูรณ์ก็ต่อเมื่อผู้ส่งอยู่ในสมุดที่อยู่และอยู่ในกลุ่มผู้ติดต่อ Work เท่านั้น

โดยทั่วไปแล้ว รายการจะเป็นไปตามรูปแบบ 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‘ ตัวแปร ‘message‘ จะถูกสร้างขึ้นโดยมีข้อความ mmph mmph ส่วนในกรณีอื่น ข้อความจะถูกกรอกด้วย ‘Sorry, I don’t want emails today!‘ จากนั้นในขั้นตอนสุดท้าย จะนำตัวแปรนี้กลับมาใช้ใหม่ในคำสั่งปฏิเสธ

Sieve ไม่ได้กำหนดตัวแปรมาในตัว ดังนั้นตัวแปรจึงถูกกำหนดในส่วนขยาย variables ซึ่งจำเป็นต้องระบุไว้ที่ตอนต้นของสคริปต์ มีสองวิธีในการกำหนดตัวแปร

  • การสร้างตัวแปรอย่างชัดแจ้ง:

มีการจัดเตรียมการดำเนินการ set ไว้เพื่อสร้างตัวแปร

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

สตริงแรกคือชื่อของตัวแปร และสตริงที่สองคือค่าของตัวแปร ดังนั้นตัวอย่างก่อนหน้านี้จะสร้างตัวแปรที่ชื่อว่า labelname ซึ่งมีค่า Work

เมื่อกำหนดตัวแปรแล้ว จะสามารถเรียกใช้ได้โดยการเพิ่มรูปแบบต่อไปนี้ในสตริง: ${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}";
}

เมื่อใช้ร่วมกับส่วนขยายตัวแปร ผลลัพธ์ของการดำเนินการ 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}";

เมื่อดำเนินตามขั้นตอน ตัวกรองจะสร้างตัวแปรขึ้นมาสามตัว โดยคำสั่งแรก set จะสร้างตัวแปร labelname ซึ่งเนื้อหาของตัวแปรคือ Work โดยที่ค่าเดิม WORK จะถูกแปลงโดยใช้ทั้งฟลัก :lower และ :upperfirst เพื่อเปลี่ยนเป็นอักษรตัวพิมพ์เล็ก work แล้วจึงเปลี่ยนเป็น Work

คำสั่ง set ที่สองจะสร้างตัวแปรตัวที่สองขึ้นมาในชื่อ foldername และมีสตริง Geneva เนื่องจากมีการใช้ฟลัก :lower และ :upperfirst

ในที่สุด ตัวแปร location จะถูกสร้างขึ้น โดยค่า “${foldername}/${labelname}” จะประกอบด้วยตัวแปรสองตัว ได้แก่ foldername และ labelname ดังนั้น ตัวตีความ 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-facebook และ x-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” จะตรงกับที่อยู่อีเมลใดๆ ที่ลงท้ายด้วย dot 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 สำหรับ kibioctet (หรือ 1024 ไบต์) M สำหรับ mebioctet (หรือ 1 048 576 ไบต์) และ G สำหรับ gibioctet (หรือ 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 เพื่อส่งการตอบกลับในช่วงเวลาเฉพาะ

สมมติว่าจะไปพักร้อนตั้งแต่วันที่ 14 กรกฎาคม 2017 ถึงวันที่ 14 สิงหาคม 2017 ตามเวลาโคโลราโด สามารถใช้รหัส 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 ใช้เพื่อระบุช่วงเวลาที่จะเก็บที่อยู่ไว้และไม่มีการตอบกลับ และจะระบุเป็นวันเสมอ ในบางครั้ง อาจมีคำสั่ง vacation หลายคำสั่งในสคริปต์ Sieve และต้องตรวจสอบให้แน่ใจว่าแต่ละคำสั่งจะส่งการตอบกลับอย่างน้อยหนึ่งครั้ง (หากตรงตามกฎ) ในกรณีนั้น สามารถใช้ตัวเลือก :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 ยอมรับออฟเซ็ตเขตเวลา ซึ่งเป็นสตริงในรูปแบบ “+0100” ที่หมายถึง UTC+1 และเขตเวลาจริงในฐานข้อมูล ICANN (ดู https://en.wikipedia.org/wiki/List_of_tz_database_time_zones(หน้าต่างใหม่)) ตัวเลือกสุดท้ายมักมีประโยชน์มากกว่า (แม้ว่าจะไม่ใช่ Sieve มาตรฐาน) เนื่องจากยังเข้ารหัสเวลาออมแสงของแต่ละเขตเวลาด้วย

สามารถเปรียบเทียบวันที่ได้โดยใช้พารามิเตอร์ :is/ :contains/ :matches ตามปกติ ตัวอย่างเช่น คำสั่ง Sieve ต่อไปนี้จะตรงกับวันที่ใดก็ได้ในเดือนกรกฎาคม 2017:

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 จำนวนวันตั้งแต่วันที่ 17 พฤศจิกายน 1858 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 — และปิดใช้งานการแจ้งเตือนสำหรับโฟลเดอร์นั้น
  • ข้อจำกัดของข้อความตอบกลับอัตโนมัติ/ข้อความเมื่อไม่อยู่

หมายเหตุเกี่ยวกับการรองรับนิพจน์ทั่วไป (Regular Expression)

การนำ Sieve มาใช้ของ Proton เป็นไปตามมาตรฐานการกรองอีเมลของ Sieve ซึ่งรวมถึงการรองรับนิพจน์ทั่วไปเพียงเล็กน้อยเท่านั้น ไวยากรณ์ย่อของนิพจน์ทั่วไปทั่วไปบางตัว เช่น \b (ขอบเขตคำ), \w (ตัวอักษรคำ), \W (ตัวอักษรที่ไม่ใช่คำ) และ \d (ตัวเลข) ไม่ได้รับการรองรับใน Sieve ด้วยเหตุนี้ การใช้ตัวอักษรย่อเหล่านี้ในตัวกรองอาจทำให้ตัวกรองล้มเหลวโดยไม่มีการแจ้งเตือน ข้อจำกัดนี้เกิดจากตัวมาตรฐาน Sieve เอง ซึ่งเน้นความเรียบง่ายและความเข้ากันได้ระหว่างแพลตฟอร์มต่าง ๆ ดูรายละเอียดทั้งหมดได้ที่ฉบับร่าง RFC ของนิพจน์ทั่วไปของ Sieve

รายการการดำเนินการและการทดสอบที่รองรับ

แพ็กเกจ

Sieve รองรับส่วนขยายดังต่อไปนี้ สามารถดูข้อมูลเพิ่มเติมได้ที่เอกสารคู่มืออย่างเป็นทางการ

วันที่

  • การใช้งาน: date
  • รายละเอียด: (หน้าต่างใหม่)ช่วยให้สามารถตรวจสอบข้อมูลวันที่ได้
  • เอกสารคู่มือ: https://tools.ietf.org/html/rfc5260(หน้าต่างใหม่)
  • การปรับใช้: ตัวเปรียบเทียบเริ่มต้นคือ i;ascii-numeric ไม่ใช่ i;ascii-casemap เนื่องจากวันที่ไม่มีประโยชน์เมื่อใช้กับตัวเปรียบเทียบ casemap
  • ดูเพิ่มเติม: ข้อความเมื่อไม่อยู่และการทดสอบวันที่

Envelope

FileInto

  • การใช้งาน: fileinto
  • รายละเอียด: นำป้ายกำกับไปใช้กับข้อความหรือย้ายข้อความไปยังโฟลเดอร์
  • เอกสารคู่มือ: https://tools.ietf.org/html/rfc5228#section-4.1(หน้าต่างใหม่)
  • การปรับใช้: เครื่องหมายทับระบุเส้นทางแบบเต็มของโฟลเดอร์ และต้องมีการใส่เครื่องหมายหลีก (escape) หากชื่อป้ายกำกับมีเครื่องหมายทับ โดยรองรับตัวเลือกต่อไปนี้:
    • Work“: นี่คือป้ายกำกับหรือโฟลเดอร์ที่ชื่อว่า ‘Work’
    • Work/Project1“: นี่คือโฟลเดอร์ย่อย ‘Project1’ ที่อยู่ในโฟลเดอร์ ‘Work’
    • Work/Project1/Docs“: นี่คือโฟลเดอร์ย่อย ‘Docs’ ที่อยู่ในโฟลเดอร์ย่อย ‘Project1’ ซึ่งอยู่ในโฟลเดอร์ ‘Work’
    • Work/Misc\\/Others“: นี่คือโฟลเดอร์ย่อย ‘Misc/Others’ ที่อยู่ในโฟลเดอร์ ‘Work’
  • ดูเพิ่มเติม: เริ่มต้นใช้งาน

Imap4flags

Reject

Vacation

Variables

เชิงสัมพันธ์

  • การใช้งาน: relational
  • รายละเอียด: มีตัวดำเนินการเปรียบเทียบเชิงสัมพันธ์ให้ใช้งาน
  • เอกสารประกอบ: https://tools.ietf.org/html/rfc5231

Regex

  • การใช้งาน: regex
  • รายละเอียด: มีตัวดำเนินการจับคู่ 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

  • การใช้งาน: include
  • รายละเอียด: จัดการเวิร์กโฟลว์ของ Sieve
  • เอกสารประกอบ: https://tools.ietf.org/html/rfc6609(หน้าต่างใหม่)
  • การปรับใช้งาน: รองรับเฉพาะโหนด return เท่านั้น

การหมดอายุ

การทดสอบ

วันที่ปัจจุบัน

  • การใช้งาน:
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

  • การใช้งาน:
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>

ส่วนหัว

  • การใช้งาน:
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>
  • รายละเอียด: ตรวจสอบว่าขนาดรวมของข้อความ (รวมถึงไฟล์แนบ) สูงกว่าหรือต่ำกว่าขีดจำกัดที่กำหนดไว้หรือไม่
  • แพ็กเกจ: <ค่าเริ่มต้น>
  • ดูเพิ่มเติม: การกรองด้วยขนาดข้อความใน Sieve

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
  • รายละเอียด: ยกเลิกคำสั่งละทิ้งล่าสุด โดยจะมีผลเฉพาะในกรณีที่อยู่ในตัวกรอง Sieve เดียวกันเท่านั้น และหากยังไม่มีการดำเนินการคำสั่งละทิ้ง คำสั่งนี้จะไม่มีผลใดๆ
  • แพ็กเกจ: <ค่าเริ่มต้น>

Reject

  • การใช้งาน:
reject <reason: string>

Expire

  • การใช้งาน:
expire <unit: "day" / "minute" / "second"> <value: string>

Unexpire

  • การใช้งาน:
unexpire
  • รายละเอียด: เอาเวลาหมดอายุของข้อความออก
  • แพ็กเกจ: vnd.proton.expire

Vacation

  • การใช้งาน:
vacation [":days" number] [":subject" string] [":mime"] [":handle" string] <reason: string>

Valid External List

  • การใช้งาน:
valid_ext_list <ext-list-names: string-list>
  • รายละเอียด: ทดสอบว่ารายการภายนอกทั้งหมดที่ระบุนั้นได้รับการสนับสนุนและถูกต้องหรือไม่
  • แพ็กเกจ: extlists

ไม่พบสิ่งที่คุณกำลังค้นหาใช่หรือไม่?

ติดต่อทั่วไปcontact@proton.me
ติดต่อสื่อมวลชนmedia@proton.me
ติดต่อฝ่ายกฎหมายlegal@proton.me
ติดต่อฝ่ายพันธมิตรpartners@proton.me