Abstract

               บริการไปรษณีย์อิเล็กทรอนิก (Electronic mail) เป็นบริการที่มีใช้กันอย่างแพร่หลายในการท่องไปบน internet ในโลกปัจจุบัน โดยจะใช้โปรแกรม agent ต่างๆ ในการสร้างจดหมายขึ้นมา และทำการจ่าหน้าซอง หรือใส่ header ตาม มาตรฐาน RFC 822 แต่เนื่องด้วย RFC 822 มีข้อจำกัดในการส่งข้อมูล จึงมีการใช้มาตรฐาน MIME เข้ามาช่วยลดข้อจำกัด ในการส่งไปรษณีย์อิเล็กทรอนิกนั้นลงไป ส่วนตัวจดหมายก็สามารถส่งข้อมูลได้หลายชนิดด้วยกันรวมทั้งการเข้ารหัสต่างๆ เมื่อได้จดหมายที่จะส่งแล้วก็จะส่งต่อไปยัง SMTP Sender เพื่อทำการติดต่อด้วยคำสั่งต่างๆ แล้วก็ทำการส่งจดหมาย โดยผ่านทาง SMTP Protocol ซึ่งทำงานบนการเชื่อมต่อ TCP/IP ไปยังเครื่องปลายทาง โดยมี SMTP Receiver คอยรับจดหมายอยู่เพื่อนำจดหมายที่ได้รับมานั้น จัดเก็บใน mailbox ที่ถูกต้องต่อไป

Keyterm

        SMTP - Simple Mail Transfer Protocol

เป็นมาตรฐานในการส่งจดหมายระหว่างเครื่อง host ต่างๆ บน TCP/IP protocol

        MIME - Multipurpose Internet Mail Extensions

เป็นมาตรฐานใหม่ที่ออกมาเพื่อแก้ไขปัญหาที่ SMTP ไม่สามารถทำได้

 

Introduction

        การส่งจดหมาย electronic เริ่มต้นโดยการเขียนจดหมายด้วยโปรแกรม user agent โดยในแต่ละจดหมาย จะประกอบด้วย header ซึ่งระบุผู้รับและข้อมูลอื่นๆ ส่วนตัว body จะมีข้อความที่ต้องการส่ง หลังจากนั้นจดหมาย จะเข้าคิวของโปรแกรม SMTP Sender ซึ่งจะเป็นโปรแกรม ที่ทำงานบนเครื่อง Server
         ถึงแม้ว่าการส่งจดหมายจะขึ้นกับ operating system ของเครื่อง host แต่หลักการจะมี เหมือนๆกัน 2 อย่างคือ

    1. ตัวจดหมาย จะประกอบด้วย

               SMTP protocol ใช้ในการส่งจดหมาย จาก SMTP sender ไปยัง SMTP receiver บนการเชื่อมต่อ TCP โดยไม่สามารถรับประกันได้ว่าจะแก้ไขปัญหาจดหมายหายไป, ไม่มีการส่งตอบรับเมื่อผู้รับได้รับจดหมายเรียบร้อยแล้ว และไม่มีเครื่องรับประกันว่าจะมีการรายงานความผิดพลาดกลับมา แต่อย่างไรก็ตามการส่ง จดหมายโดยใช้ SMTP ก็ถือว่ามีความ reliable

                 SMTP receiver จะทำการรับจดหมายและทำการจัดเก็บให้กับ mailbox ของ user แต่ละคน หรือไม่ก็ทำการ copy เก็บไว้ในกรณีที่มีการ forward จดหมายไปที่อื่น โดย receiver จะต้องมีความสามารถในการตรวจสอบว่าผู้รับอยู่ในระบบหรือไม่ รวมทั้งจัดการกับปัญหาในการติดต่อ และปัญหาเรื่องเนื้อที่ในการจัดเก็ºไม่พอ

      Architecture and Services

                           ในระบบการจัดการจดหมาย electronic นั้นจะมีระบบย่อย 2 ส่วนด้วยกัน คือ user agents เพื่อให้ผู้ใช้สามารถทำการอ่านและส่งจดหมายได้ และ message transfer agent จะทำการเคลื่อนย้ายจดหมายจากต้นทางไปยังปลายทาง โดย user agent จะเป็นโปรแกรม local มีทั้งที่เป็น command-based, menu-based หรือ graphical เพื่อการโต้ตอบกับ email system ส่วน message transfer agent จะเป็นโปรแกรม system daemon ที่ทำงานอยู่เป็น background เพื่อส่งจดหมายในระบบ

      โดยทั่วไประบบจดหมาย (email system) จะมีความสามารถทำงานพื้นฐานด้วยกัน 5 อย่าง ดังนี้

    1. Composition คือกระบวนการสร้างจดหมาย และตอบจดหมาย
    2. Transfer การเคลื่อนย้ายจดหมายจากผู้ส่งไปยังผู้รับ
    3. Reporting รายงานผลไปยังผู้ส่งว่าจดหมายที่ส่งไปได้รับหรือไม่, ถูกปฏิเสธ หรือว่าสูญหายไป หรือเปล่า
    4. Displaying สามารถแสดงผลได้ถูกต้องกับข้อมูลที่ส่งมา เช่น PostScript หรือเสียง และจะต้องมีความสามารถในการแปลงรูปแบบของชนิดข้อมูลได้ด้วย
    5. Disposition สามารถทำการลบจดหมาย บันทึกจดหมาย, อ่านจดหมายที่บันทึกไว้ หรือส่งต่อไปยังคนอื่นได้

             ระบบส่วนใหญ่ จะอนุญาตให้ผู้ใช้สามารถสร้าง mailbox เพื่อจัดเก็บจดหมายที่ได้รับมา โดยมีคำสั่งในการสร้าง, ลบ, เพิ่มหรือลดจดหมายจาก mailbox นั้นได้

              ในการจัดการส่งจดหมาย เพื่อความสะดวกก็จะมี mailing list ซึ่งเป็นรายการของ email address โดยเมื่อส่งไปตาม mailing list ทุกคนที่อยู่ใน mailing list จะได้รับเหมือนกัน

               ในปัจจุบันการส่งจดหมายมีความสับสนในเรื่องของ envelope และ content โดย envelope จะทำการบรรจุ message เช่น ปลายทาง ความสำคัญ และระดับความปลอดภัยของจดหมาย โดย message transport agents จะใช้ envelope ในการหาเส้นทางในการส่งจดหมาย

                ส่วน message ใน envelope จะมีด้วยกัน 2 ส่วน คือ header และ body โดย header จะประกอบด้วยข้อมูลสำหรับ user agents ส่วน body จะเป็นข้อมูลที่ให้คนอ่าน โดยแยกให้เห็นดังนี้

Name:Mr.Daniel Dumkopf
Street:18 Willow Lane
State:NY
Zip Code:10604
Priority Urgent
Encryption:None

Envelope

From:United Gizmo
Address:180 Main St.
Location:Boston,MA 02120
Date:Sept 1,1996
Subject:Invoice 1081

Message

Dear Mr.Dumkopf,
Our computer record show that you still have not paid the above invoice of $0.00. Please send us a check for $0.00 promptly.

Yours truly
United Gizmo

 

RFC 822

         E-mail ประกอบไปด้วยการจ่าหน้าซองจดหมาย ซึ่งประกอบด้วยเขตข้อมูลต่างๆ แล้วตามด้วยบรรทัดว่าง 1 บรรทัด ต่อด้วยตัวข้อความในจดหมาย โดยแต่ละเขตข้อมูลจะอยู่ในรูปของบรรทัดตัวอักษร ASCII ซึ่งขึ้นต้นด้วยชื่อเขตข้อมูล, เครื่องหมาย colon และตามด้วยค่าต่างๆ

Header

ความหมาย

To:

Email address ของผู้รับหลัก

Cc:

Email address ของผู้รับรอง

Bcc:

Email address ของผู้รับอื่นๆ

From:

คนที่ทำการเขียนจดหมายนี้

Sender:

ผู้ที่ส่งจดหมายฉบับนี้ (ในกรณีคนอื่นส่งให้)

Received:

transfer agent ใช้ในการส่งจดหมาย

Return-Path:

ระบุที่จะส่งจดหมายกลับถ้าส่งไม่ได้


To:
ใส่ DNS address ของผู้รับจดหมายคนแรก ถ้ามีผู้รับหลายคนก็สามารถทำได้ โดยใช้

Cc: ใส่ address ของผู้รับจดหมายคนที่ 2 โดยในการส่งจดหมายด้วย Email นี้ไม่มีความแตกต่างในเรื่องข้อมูล ระหว่าง ผู้รับคนแรกกับผู้รับคนที่ 2 แต่จะมีผลในเรื่องของการให้ความสำคัญในตัวบุคคลทั้ง 2 นั้นต่างกัน (Cc ย่อมาจาก Carbon Copy)

Bcc: (Blind carbon copy) มีการทำงานเหมือน Cc แต่จะไม่ปรากฏอยู่ในการส่งของผู้รับหลักและรองเลย

From: และ Sender: บอกว่าใครเป็นผู้ส่งจดหมาย โดยปกติจะเป็นคนเดียวกัน แต่ก็สามารถเป็นคนละคนกันได้ เช่น ผู้บริหารเขียนจดหมายไว้ แล้วให้เลขาฯ ช่วยส่งจดหมายให้ ซึ่งในตัวอย่างนี้ผู้บริหารจะอยู่ใน From: ส่วนเลขาฯจะอยู่ในเขตข้อมูล Sender: การที่มี Sender ก็เพื่อในกรณีที่ไม่สามารถทำการส่งได้จะได้ส่งกลับมาให้ เลขาฯ ไม่ต้องส่งกลับไปให้ผู้บริหารอีก

Received: transfer agent จะเพิ่มเติมข้อมูลลงในเขตข้อมูลนี้ในระหว่างทางในการส่งจดหมาย โดยจะมี agent's identity และวันที่ เวลา ในการรับจดหมายเพื่อใช้ในการหาข้อผิดพลา´ในการหาเส้นทางในการส่งจดหมาย

Return-Path: เป็นเขตข้อมูลที่เพิ่มเมื่อสิ้นสุดในการส่งจดหมายแล้ว โดยมีจุดประสงค์ในการบอกว่าจะส่งกลับไปยังผู้ส่งได้อย่างไร โดยทฤษฎีแล้วข้อมูลส่วนนี้สามารถหาได้จากเขตข้อมูล Received: ซึ่งไม่มีชื่อของผู้ส่ง ดังนั้นจึงมี เขตข้อมูลเพื่อระบุผู้ส่งด้วย

Header

ความหมาย

Date:

วันที่และเวลาที่ส่ง email

Reply-To:

Email address เมื่อผู้รับต้องการตอบ

Message-Id:

เลขประจำตัวของจดหมายเพื่อนำมาอ้างอิงในภายหลัง

In-Reply-To:

Message-Id ที่ได้ทำการตอบกลับมานี้

References:

Message-Id อื่นๆที่ได้อ้างถึง

Keywords:

ผู้ใช้เลือก keywords

Subject:

สรุปจดหมาย เพื่อการแสดงผลในบรรทัดเดียว


Reply-To: เขตข้อมูลที่ใช้ในบางครั้งเท่านั้น ยกตัวอย่างเช่น ผู้จัดการฝ่ายการตลาดต้องการส่ง email ไปยังลูกค้าในเรื่องสินค้าใหม่ แล้วจดหมายนี้จะถูกส่งโดยเลขาฯ แต่ Reply-To จะไปที่ฝ่ายขายของบริษัทเพื่อตอบจดหมายนั้น

        RFC 822 สามารถให้ผู้ใช้สามารถ ทำการตั้งเขตข้อมูล ขึ้นเองได้ โดยจะขั้นต้นด้วย X- เพื่อไม่ให้ซ้ำกับเขตข้อมูลอื่นๆ ดังนั้นบางครั้งอาจจะพบกับ X-Fruit-of-the-Day หรือ X-Disease-of-the week ก็สามารถเกิดขึ้นได้หลังจาก Header ก็จะตามมาด้วยตัวจดหมาย โดยผู้ใช้สามารถทำการใส่อะไรก็ได้

 

MIME Overview

             MIME เป็นส่วนขยายมาจาก RFC 822 โดยจะแสดงข้อจำกัดในการใช้งาน SMTP และ RFC 822 สำหรับการส่ง Email ซึ่งมีดังนี้

  1. SMTP ไม่สามารถทำการส่ง executable files หรือ file ที่เป็น binary อื่นๆได้ โดยส่วนมากจะทำการแปลง binary ให้ออกมาอยู่ในรูปของ text โดยใช้ได้กับระบบจดหมายรวมถึง UNIX UUencode/UUdecode ซึ่งเป็นวิธีที่นิยมทำกัน แต่ไม่มีมาตรฐานในเรื่องนี้
  2. SMTP ไม่สามารถส่ง text file ที่มีภาษาอื่นๆได้ ดังการใช้รหัส 8-bit ในการเก็บค่าเพียง 128 ค่า โดย SMTP จำกัดให้ใช้ 7-bit ASCII
  3. SMTP server จะทำการปฏิเสธ จดหมายที่มีขนาดของจดหมายใหญ่เกินไป
  4. SMTP gateway ทำการแปลระหว่างตัวอักษร ASCII และ EBCDIC โดยไม่มีชุดของการจับคู่
  5. SMTP gateway ไปยังระบบจดหมาย X.400 ไม่สามารถจัดการกับข้อความธรรมดาได้
  6. การสร้าง SMTP ด้วยมาตรฐาน RFC 821 จะไม่สามารถทำงานบ้างอย่าง ดังนี้

           MIME สามารถแก้ไขปัญหาเหล่านี้ได้ โดยสามารถเข้ากันได้กับมาตรฐานเดิม RFC 822 ซึ่งรายละเอียดจะอยู่ใน RFC 1521 และ RFC 1522


รายละเอียดของ MIME

  1. มีเขตข้อมูลที่หัวจดหมายใหม่ 5 เขตข้อมูลด้วยกัน ซึ่งสามารถใส่ไว้ในหัวจดหมายในแบบ RFC 822 ได้
  2. รู้จักประเภทของข้อมูลเป็นจำนวนมากขึ้น เช่น สามารถส่งจดหมายที่เป็น multimedia ได้
  3. การเข้ารหัสข้อมูลมีความสามารถมากขึ้น โดยสามารถทำการแปลงข้อมูลจากชนิดหนึ่งเป็นอีกชนิดหนึ่ง ได้ จากเดิมที่ส่งได้แต่ text ธรรมดาเท่านั้น

                     เขตข้อมูลเหล่านี้สามารถปรากฎอยู่ในหัวจดหมายแบบ RFC 822 ได้ โดยถ้าทางฝ่ายผู้รับไม่รองรับ MIME เขตข้อมูลเหล่านี้จะเป็นเพียง optional เท่านั้น

 

MIME Content Types

          ชนิดของข้อมูลที่อยู่ในตัวจดหมาย ซึ่งมีอยู่ 7 ชนิด ตาม RFC 1521 โดยสามารถแบ่งย่อยออกไปเป็น subtype ต่างๆ โดยทำการขั้นด้วย slash "/" ดังตัวอย่างนี้ Content-Type: video/mpeg

Type

Subtype

คำอธิบาย

Text

Plain

ข้อความธรรมดา

Richtext

ข้อความที่มีคำสั่งในการจัดรูปแบบอยู่ด้วย

Image

Gif

รูปภาพ GIF

Jpeg

รูปภาพ JPEG

Audio

Basic

เสียงที่ฟังได้

Video

Mpeg

ภาพยนตร์ MPEG

Application

Octet-stream

ข้อมูล binary ซึ่งประกอบด้วย 8-bit

Postscript

เอกสารที่พิมพ์ได้ในรูป PostScript

Message

Rfc822

บรรจุจดหมายที่เป็น RFC 822 อยู่

Partial

จดหมายที่ถูกแยกออกเป็นหลายฉบับ

External-body

ข้อความที่ต้องไปดึงมาจากที่อื่น

Multipart

Mixed

จดหมายที่มีหลายส่วนที่ส่งมาพร้อมกัน

Alternative

ข้อความเดียวกันแต่ส่งมาหลายรูปแบบ

Parallel

ส่วนต่างๆของจดหมาย สามารถดูได้พร้อมกัน

Digest

subtype default ของแต่ละส่วนจดหมาย


Text Type
เป็นข้อความธรรมดา โดยแบ่งเป็น

             Image Type ใช้ในการส่งข้อมูลรูปภาพ ถึงแม้ว่าจะมีชนิดของรูปภาพเป็น จำนวนมาก ทั้งที่มีการบีบอัดรูป และทั้งแบบไม่บีบอัด ก็จะใช้รูปแบบภาพเป็นชนิด GIF และ JPEG เป็นหลัก

             Audio Type และ Video Type ใช้สำหรับ เสียงและภาพเคลื่อนไหว โดย video จะมีแต่รูปโดยไม่มีเสียง โดยถ้าต้องการส่งให้มีทั้งรูปและเสียง จะต้องทำการส่งข้อมูลของทั้ง 2 แยกกัน โดยขึ้นอยู่กับการ เข้ารหัสข้อมูล โดย video จะใช้ Moving Picture Experts Group (MPEG)

             Application Type เป็นชนิดข้อมูลที่จะต้องทำการ ประมวลผลก่อน

                * application/octet-stream เป็นข้อมูล binary ที่เรียงต่อกันมา โดยรูปแบบนั้น จะขึ้นกับผู้ใช้เป็นหลัก

                * application/postscript จะหมายถึง ภาษา PostScript ที่ผลิตโดย บริษัท Adobe Systems โดยมีการใช้กันอย่างแพร่หลาย ในการพิมพ์งาน แต่ต้องระวัง เพราะว่า มีความสามารถที่จะ เขียน C compiler หรือ database management system ลงใน PostScript ได้

             Message Type มีความสามารถในการทำงานหลายอย่าง ใน MIME โดย

                * message/rfc822 จะบอกว่าในตัวจดหมาย มีจดหมายอื่นอยู่ โดยมีทั้ง header และ ตัวจดหมาย

                * message/partial subtype สามารถที่จะแยกจดหมายที่ มีขนาดใหญ่ให้เป็น หลายๆส่วนได้ โดยจะทำการประกอบกัน ทางฝ่ายผู้รับ โดยจำมี parameter ที่จำเป็นในการแบ่ง ดังนี้

             * Id เป็นตัวเลขของจดหมาย โดยทุกส่วนที่ถูกแยกจะมี Id เหมือนกัน เพื่อทางฝ่ายรับ จะสามารถทำการรวมจดหมายได้ถูกต้อง

             * Number เป็นเลขบอกตำแหน่งของการแยกส่วน ของจดหมายจากจดหมายต้นฉบับ โดยส่วนแรกจะเป็น ตัวเลข 1 และตัวเลขต่อไปตามลำดับ

             * Total เป็นตัวเลขบอกจำนวนการแบ่งทั้งหมด โดยส่วนสุดท้ายของจดหมาย จะมีเลข number กับ total เท่ากัน

 

กฎการแบ่งจดหมายออกเป็นส่วนๆ มีดังนี้

    1. แบ่งตัวจดหมายต้นฉบับออกเป็น N ส่วน
    2. ส่วนแรก จะเริ่มต้นด้วย header ที่ไม่มีเขตข้อมูล Content-Transfer-Encoding โดยมีค่าเริ่มต้นเป็น 7-bit ASCII แต่มีเขตข้อมูล Content-Type เป็น message/partial ตามด้วย หมายเลข id, number = 1 และ total เป็น N ส่วนเขตข้อมูลที่เหลือก็ให้ คัดลอกมาจากจดหมายต้นฉบับ
    3. ตัวจดหมายส่วนแรก ถ้าบรรจุจดหมาย MIME โดยมี Content-Type และ Content Transfer-Encoding ของจดหมายต้นฉบับอยู่ จะต้องมี Message-ID ที่ต่างกัน
    4. จดหมายส่วนที่เหลือ จะมีเขตข้อมูล header Message-ID ที่เฉพาะตัว ส่วนเขตข้อมูล Content-Type จะมีหมายเลข id และ total เหมือนกันกับจดหมายส่วนแรก แล้วตามด้วย number ที่เรียงลำดับให้ถูกต้อง ส่วนเขตข้อมูล Content-Transfer-Encoding ไม่ต้องมี

กฎการประกอบจดหมายแยกส่วน มีดังนี้

    1. เขตข้อมูล header จะนำมาจากจดหมายส่วนแรก ส่วน Content-Type, Content Transfer-Encoding และ Message-ID จะนำมาจากจดหมายที่บรรจุอยู่ ในจดหมายฉบับแรก
    2. จะไม่สนใจเขตข้อมูล header ของจดหมายส่วนอื่นๆ เลย
    3. ตัวจดหมายจะทำการรวม ตามลำดับ ให้เหมือนจดหมายต้นฉบับ

     

ตัวอย่างการส่งจดหมายแบบแยกส่วน

จดหมายส่วนแรก

From:Bill@host.com
To:joe@otherhost.com
Subject:Audio mail
Message-ID:<id1@host.com>
MIME-Version:1.0
Content-type:message/partial;
id="ABC@host.com";number=1;total=2
Message-ID:<anotherid@foo.com>
MIME=Version:1.0
Content-type:audio/basic
Content-transfer-encoding:base64
...first half of encoded audio data

จดหมายส่วนที่ 2

From:Bill@host.com
To:joe@otherhost.com
Subject:Audio mail
MIME-Version:1.0
Message-ID:<id2@host.com>
Content-type:message/partial;
id="ABC@host.com";number=2;total=2
...second half of encoded audio data

 


จดหมายหลังรวม

From:Bill@host.com
To:joe@otherhost.com
Subject:Audio mail
Message-ID:<anotherid@foo.com>
MIME-Version:1.0
Content-type:audio/basic
Content-transfer-encoding:base64
...first half of encoded audio data
...second half of encoded audio data

         Multipart Type เป็นชนิดที่สามารถให้จดหมาย มีได้หลาย part โดยสามารถทำการประกาศ จุดเริ่มต้น และ จุดสิ้นสุดได้ โดยเส้นแบ่ง part จะเป็นบรรทัดใหม่ ที่ขึ้นต้นด้วย 2 hyphen แล้วตามด้วยค่า boundary แล้วแบ่ง part สุดท้าย จะมี hyphen อีก 2 ตัวปิดท้าย

From:Nathaniel Borenstein<nsb@bellcore.com>
To:Ned Freed<ned@innosoft.com>
Subject:Sample message
MIME-Version:1.0
Content-Type:multipart/mixed; boundary="simple boundary"

This is preamble. It is to be ignored,thoung it is a handy place for mail composers to include an explanatory note to non-MIME-conformant readers.
--simple boundary

This is implicitly-typed plain ASCII text. It does NOT end with a linebreak.
--simple boundary
Content-type:text/plain;charset=us-ascii

This is explicitly-typed plain ASCII text. It DOES end with a line break.

--simple boundary--
This is the epilogue. It is also to be ignored.

From:Nathaniel Borenstein<nsb@bellcore.com>
To:Ned Freed<ned@innosoft.com>
Subject:Formatted text mail
MIME-Version:1.0
Content-Type:multipart/alternative; boundary="boundary42"

--boundary42

Content-Type:text/plain;charset=us-ascii

...plain text version of message
–boundary42
Content-Type:text/richtext

...RFC 1341 richtext version of same message
–boundary42--

 

MIME Transfer Encodings

                มาตรฐาน MIME ได้กำหนดวิธี encode ข้อมูลไว้ โดยใช้เขตข้อมูล Content-Transfer Encoding ซึ่งจะมีค่าได้ด้วยกัน 6 แบบ ซึ่ง แบบ 7bit, 8bit และ binary จะไม่มีการ encode ข้อมูล แต่โดยปกติ SMTP จะใช้แบบ 7bit เป็นหลัก นอกจากนั้นจะมีการ encode ด้วยวิธีอื่นที่นิยามเองได้โดย จะใช้ x-token ในการแบ่งประเภทการเข้ารหัส ส่วน quoted-printable เป็นการ encode ที่ให้คนสามารถอ่านได้ และ base64 เป็นวิธี encode เพื่อเป็นความปลอดภัย กับข้อมูลทุกชนิดไว้สามารถส่งได้ถูกต้องและมีขนาดเล็ก

7bit

บรรทัดสั้นของตัวอักษร ASCII

8bit

บรรทัดสั้นของตัวอักษร non-ASCII

Binary

ข้อมูล binary

Quoted-printable

รูปแบบการเข้ารหัสของ ASCII โดยยังสามารถ อ่านได้

base64

เข้ารหัส จาก 6-bit ไปยัง 8-bit ของตัวอักษร ที่พิมพ์ได้

x-token

user กำหนดได้เอง

 

     

quoted-printable จะเป็นประโยชน์กับข้อมูลที่ ASCII โดยเฉพาะตัวอักษรที่ไม่สามารถมองเห็นได้เป็นตัวอักษรควบคุมต่างๆ โดยมีกฎในการเข้ารหัสดังนี้

    1. ตัวอักษรธรรมดาที่ไม่อยู่ในกฎข้ออื่น ให้ทำการเข้ารหัสโดย เริ่มต้นด้วยเครื่องหมายเท่ากับ "=" แล้วตามด้วยเลขฐานสิบหก 2 หลักของค่า ASCII นั้น ยกตัวอย่างเช่น form-feed มีรหัส ASCII เป็น 12 จะแทนด้วย "=0C"
    2. ตัวอักษรตั้งแต่รหัส 33 ("!") ถึง 126 ("~") จะแทนด้วยตัวอักษรปกติเลย ยกเว้นตัวอักษร 61 ("=")
    3. ตัวอักษรพวก white space คือ 9 tab และ 32 space ยกเว้น end of line โดยจะใช้กฎข้อที่ 1 ในการเข้ารหัส และถ้าอยู่ท้ายของบรรทัดจะถูกตัดออก
    4. Line break จะใช้ตัวอักษร carriage-return และ line-feed 2 ตัวติดกัน ตามมาตราฐาน RFC 822
    5. Soft line break จะใช้เมื่อ ตัวอักษรยาวกว่า 76 ตัวอักษร ไม่รวม <CRLF> จะถูกแทรกด้วยตัวอักษรนี้ ก่อนตัวอักษรที่ 75 โดยจะประกอบไปด้วยตัวเลขฐานสิบหก ดังนี้ 3D0D0A ซึ่งก็คือเครื่องหมาย เท่ากับ แล้วตามด้วย return และ line-feed นั้นเอง

American Standard Code for Information Interchange (ASCII)

b7

0

0

0

0

1

1

1

1

b6

0

0

1

1

0

0

1

1

b5

0

1

0

1

0

1

0

1

b4

b3

b2

b1

               

0

0

0

0

NUL

DLE

SP

0

@

P

`

p

0

0

0

1

SOH

DC1

!

1

A

Q

a

q

0

0

1

0

STX

DC2

"

2

B

R

b

r

0

0

1

1

ETX

DC3

#

3

C

S

c

s

0

1

0

0

EOT

DC4

$

4

D

T

d

t

0

1

0

1

ENQ

NAK

%

5

E

U

e

u

0

1

1

0

ACK

SYN

&

6

F

V

f

v

0

1

1

1

DEL

ETB

'

7

G

W

g

w

1

0

0

0

BS

CAN

(

8

H

X

h

x

1

0

0

1

HT

EM

)

9

I

Y

i

y

1

0

1

0

LF

SUB

*

:

J

Z

j

z

1

0

1

1

VT

ESC

+

;

K

[

k

{

1

1

0

0

FF

FS

,

<

L

\

l

|

1

1

0

1

CR

GS

-

=

M

]

m

}

1

1

1

0

SO

RS

.

>

N

^

n

~

1

1

1

1

SI

US

/

?

O

_

o

DEL

 

                base64 หรืออีกชื่อหนึ่งว่า radix-64 เป็นวิธีเข้ารหัสที่นิยมกันในการส่งจดหมายทั้งแบบ PGP (Pretty Good Pricacy) และ PEM (Privacy Enhanced Mail) โดยมีลักษณะการเข้ารหัสดังนี้

    1. range ของ function ในการทำ base4 คืออักษรทั้งหมด ไม่ว่าจะเป็น ASCII หรือ EBCDIC
    2. ตัวอักษรประกอบด้วย 65 ที่สามารถพิมพ์ได้ โดยรวมตัวอักษร padding อีกหนึ่งตัว ดังนั้นทุกตัวสามารถแทนได้ด้วย 6-bit
    3. ไม่มีตัวอักษรควบคุม
    4. ตัวอักษร hyphen ("-") ไม่มี เพราะว่ามีการใช้ใน RFC 822 จึงไม่ให้มีตัวอักษรนี้

Radix-64 encoding

6-bit value

Character encoding

6-bit value

character encoding

0

A

32

g

1

B

33

h

2

C

34

i

3

D

35

j

4

E

36

k

5

F

37

l

6

G

38

m

7

H

39

n

8

I

40

o

9

J

41

p

10

K

42

q

11

L

43

r

12

M

44

s

13

N

45

t

14

O

46

u

15

P

47

v

16

Q

48

w

17

R

49

x

18

S

50

y

19

T

51

z

20

U

52

0

21

V

53

1

22

W

54

2

23

X

55

3

24

Y

56

4

25

Z

57

5

26

a

58

6

27

b

59

7

28

c

60

8

29

d

61

9

30

e

62

+

31

f

63

/

   

(pad)

=

 

             ตัวอย่างวิธีการเข้ารหัส โดยมี input เป็นข้อมูล binary 24-bit ซึ่งแต่ละ 6 bit จะแปลงเป็นตัวอักษร 8-bit รวมเป็น 32 bit โดย 6 bit ด้านหลังไม่ว่าจะเป็น ASCII หรือ EBCDIC ก็จะแทนตัวอักษรที่เหมือนกัน เช่น "E" มี 7-bit ASCII เป็น 0100 0101 ส่วน EBCDIC จะเป็น 8-bit 1100 0101 ดังนั้นการแปลงกลับก็สามารถทำได้สะดวก โดยดูเพียง 6 bit หลังก็พอ เช่น "H52Q" แปลงเป็น ASCII คือ

1001000 0110101 0110010 1010001

แยกเป็น 6 bit ได้ดังนี้

001000 110101 110010 010001

แปลงเป็น 24 bit คือ 235CA1

 

SMTP Commands

          การทำงานของ SMTP จะประกอบไปด้วยชุดของคำสั่ง และการตอบรับที่ส่งกันระหว่าง SMTP sender และ SMTP receiver โดยเริ่มต้นด้วยการที่ SMTP sender จะทำการติดต่อไปยัง SMTP receiver แล้วทำการส่งคำสั่งต่างๆ ไปยัง receiver โดยทุกคำสั่งที่ส่งไปจะ มีการตอบรับจาก receiver เสมอ

          SMTP commands โดยที่แต่ละคำสั่งจะเป็นข้อความหนึ่งบรรทัดซึ่งเริ่มต้นด้วยรหัสคำสั่งเป็นตัวอักษรที่มีความยาว 4 ตัวและตามด้วย argument ต่างๆ และการตอบรับจะเป็นข้อความหนึ่งบรรทัดเช่นเดียวกัน

ตารางคำสั่ง (SMTP commands)

ชื่อคำสั่ง

รูปแบบคำสั่ง

คำอธิบาย

HELO

HELO<SP><domain><CRLF>

คำสั่งติดต่อ

MAIL

MAIL<SP>FROM:<reverse-path><CRLF>

ระบุผู้ส่ง

RCPT

RCPT<SP>TO:<forward-path><CRLF>

ระบุผู้รับ

DATA

DATA<CRLF>

ส่งข้อความ

RSET

RSET<CRLF>

ยกเลิก

NOOP

NOOP<CRLF>

ไม่ทำอะไร (No Operation)

QUIT

QUIT<CRLF>

ปิดการเชื่อมต่อ TCP

SEND

SEND<SP>FROM:<reverse-path><CRLF>

ส่งจดหมายไปยังหน้าจอ

SOML

SOML<SP>FROM:<reverse-path><CRLF>

ส่งจดหมายไปยังหน้าจอ หรือไม่ก็ mailbox

SAML

SAML<SP>FROM:<reverse-path><CRLF>

ส่งจดหมายไปยังหน้าจอ และ mailbox

VRFY

VRFY<SP><string><CRLF>

ยืนยัน user name

EXPN

EXPN<SP><string><CRLF>

ส่งกลับรายการผู้ที่อยู่ใน mailing list

HELP

HELP[<SP><string>]<CRLF>

ส่ง symtem-specific documentation

TURN

TURN<CRLF>

สลับกันระหว่าง sender และ receiver

หมายเหตุ
<CRLF> หมายถึง Carriage Return และ Line Feed
<SP> หมายถึง Space
เครื่องหมายก้ามปู '[ ]' และ ตัวอักษรตัวบาง หมายถึง ตัวเลือกซึ่งจะมีหรือไม่มีก็ได้

       SMTP replies การตอบรับจะเริ่มด้วย ตัวเลขรหัส 3 ตัว และอาจตามด้วยข้อมูลเพิ่มเติม โดยการกำหนดรหัสจะใช้ตัวเลขในการแยกประเภทของการตอบรับ ดังนี้

ตารางตอบรับ (SMTP replies)

รหัส

คำอธิบาย

Positive Completion Reply

211

System status,or system help reply
ตอบสถานะของระบบ หรือ ตอบความช่วยเหลือของระบบ

214

Help message
ข้อความช่วยเหลือ (วิธีที่จะใช้ receiver หรือความหมายของคำส่งพิเศษต่างๆ โดยจะมีประโยชน์ กับคน ในการทำงาน กับ SMTP command)

220

<domain> Service ready
<domain> พร้อมให้บริการ

221

<domain> Service closing transmission channel
<domain> ปิดบริการ

250

Requested mail action okay,completed
ส่งจดหมายเรียบร้อยแล้ว

251

User not local;will forward to <forward-path>
user ไม่ได้อยู่ภายใน แต่จะส่งต่อไปให้ที่ <forward-path>

Positive Intermediate Reply

354

Start mail input;end with <CRLF>.<CRLF>
ให้เริ่มส่งจดหมาย และจบด้วย <CRLF>.<CRLF>

Transient Negative Completion Reply

421

<domain> Service not available,losing transmission
<domain> ไม่เปิดให้บริการ หรือ ขาดการติดต่อ (โดยจะตอบในลักษณะนี้ กับทุกคำส่ง ถ้าการให้บริการรู้ว่าจะต้องถูกปิดลง)

450

Requested mail action not taken: mailbox unavailable
ไม่สามารถทำตามที่ขอมาได้ เนื่องจาก mailbox ไม่สามารถให้บริการได้

451

Requested action aborted: local error in processing
ไม่สามารถทำตามที่ขอมาได้ เนื่องจาก มีปัญหาในการประมวลผลภายใน

452

Requested action not taken: insufficient system storage
ยกเลิกที่ส่งมา เนื่องจาก ไม่มีเนื้อที่ในระบบมากพอ

Permanent Negative Completion Reply

500

Syntax error,command unrecognized
Syntax error หรือ ไม่รู้จักคำส่ง (โดยรวมทั้งที่คำสั่งยาวเกินไปด้วย)

501

Syntax error in parameter or arguments
Syntax error เนื่องมาจาก parameter หรือ argument

502

Command not implemented
ไม่มีคำสั่งนี้

503

Bad sequence of commands
ลำดับคำสั่งผิด

504

Command parameter not implemented
parameter ของคำสั่งไม่มี

550

Requested action not taken: mailbox unavailable
ไม่สามารถทำตามที่ขอมาได้ เนื่องจาก ไม่สามารถเข้าถึง mailbox ได้ เช่น หา mailbox ไม่เจอ

551

User not local;please try <forward-path>
user ไม่ได้อยู่ภายใน ให้ทำการลองส่งไปที่ <forward-path> เอง

552

Requested mail action aborted: exceeded storage allocation
ยกเลิกที่ส่งมา เนื่องจาก มีการใช้เนื้อที่เกิน quota

553

Requested action not taken: mailbox name not allowed
ไม่สามารถทำตามที่ขอมาได้ เนื่องจาก ไม่ได้รับอนุญาตใช้ mailbox

554

Transaction failed
เกิดความล้มเลวในการติดต่อสื่อสาร

 

              พื้นฐานการทำงานบน SMTP มีอยู่ด้วยกัน 3 ขั้นตอน ด้วยกัน โดยเริ่มต้นด้วย การเชื่อมต่อ (connection setup) , การส่งรับคำสั่งและการตอบรับของ sender และ receiver (mail transfer) และตามด้วยการปิดการเชื่อมต่อ (connection closing)

 

Connection Setup

          SMTP sender จะเป็นผู้ที่ทำการเปิดการเชื่อมต่อ TCP กับ host ปลายทาง เมื่อมีความต้องการ จะส่งจดหมายไปยัง host นั้น โดยมีลำดับการทำงานดังนี้

    1. sender เปิดการเชื่อมต่อด้วย TCP กับ receiver
    2. เมื่อทำการเชื่อมต่อเรียบร้อยแล้ว receiver จะตอบรับมาในรู้แบบ "220 Service Ready"
    3. sender รายงานตัวเองด้วยคำส่ง HELO
    4. receiver ตอบรับ sender ด้วย "250 OK"

          ถ้าการบริการบนเครื่องปลายทางไม่สามารถทำงานได้จะมีการตอบรับ "421 Service Not Available" ในขั้นตอนลำดับที่ 2 แล้วจบการทำงาน

 

Mail Transfer
            เมื่อทำการเชื่อมต่อในขั้นตอนแรกแล้ว SMTP sender จะส่งจดหมายไปยัง SMTP receiver โดยมีลำดับการทำงานดังนี้

    1. ส่งคำสั่ง MAIL เพื่อระบุผู้ส่ง
    2. ส่งคำสั่ง RCPT หนึ่งครั้งหรือมากกว่า เพราะว่าจดหมาย 1 ฉบับ สามารถส่งได้พร้อมกัน ไปยัง ผู้รับหลายคน
    3. ส่งคำสั่ง DATA และ ส่งข้อมูลในจดหมายไปให้

            MAIL command ให้ reverse-path เพื่อใช้ในการรายงานความผิดพลาดต่างๆ โดยถ้า receiver พร้อมที่จะรับข้อความแล้ว จะส่ง "250 OK" มาให้ หรือไม่ก็จะรายงาน ความล้มเหลว ในการทำงาน กับคำสั่งมาให้ ได้แก่ รหัส 451,452,552 หรือความผิดพลาดของคำสั่ง ด้วยรหัส 421,500,501

            RCRT command ใช้เพื่อระบุผู้รับจดหมาย โดยถ้าต้องการส่งให้กับหลายคน ก็สามารถทำได้ ด้วยการใช้คำสั่งนี้ กับผู้รับแต่ละคน และ receiver จะตอบรับทุกครั้ง โดยมีความเป็นได้ดังนี้

             ประโยชน์ในการใช้คำส่ง RCPT แยกกัน ก็คือ sender ไม่ต้องส่งข้อความจนกว่าจะมั่นใจว่า receiver พร้อมที่จะรับข้อความไปยังผู้รับอย่างน้อยหนึ่งคน เพื่อลดการเสียเวลาในการส่ง ข้อความภายในจดหมายทั้งหมด โดยไม่มีผู้รับเลย

             DATA command เป็นการเริ่มต้นในการส่งข้อความ โดยถ้า receiver ยังคงพร้อม ที่จะรับข้อความ จะส่ง 354 กลับมา หรือไม่ก็ รายงานความล้มเหลวในการทำงานตามคำสั่ง (451,554) หรือรายงาน ความผิดพลาดของคำสั่ง (421,500,501,503) ถ้ามีตอบรับ 354 SMTP sender จะดำเนินกระบวนการส่งข้อมูล ในรูปของลำดับตัวอักษร ASCII ผ่านทางการเชื่อมต่อ TCP โดยจะสิ้นสุดการส่ง ด้วยบรรทัดที่มีแต่ตัวอักษร จุด เพียงอย่างเดียว หลังจากนั้น SMTP receiver จะทำการส่ง "250 OK" กลับมารายงานถ้า ข้อความที่ส่งไป ได้รับเรียบร้อยแล้ว หรือไม่ก็รายงานความผิดพลาดด้วยรหัส (451,452,552,554)

ตัวอย่างการส่งคำส่งและการตอบรับระหว่าง sender และ receiver ตาม RFC 821

Sender:

MAIL FROM:<loy@i.am>

Receiver:

250 OK

   

Sender:

RCRT TO:<billgate@microsoft.com>

Receiver:

250 OK

   

Sender:

RCRT TO:<surasit@microsoft.com>

Receiver:

550 No such user here

   

Sender:

RCRT TO:<steve@microsoft.com>

Receiver:

250 OK

   

Sender:

DATA

Receiver:

354 Start mail input; end with <CRLF>.<CRLF>

Sender:

Blah Blah Blash...

Sender:

...etc. etc. etc.

Sender:

<CRLF>.<CRLF>

Receiver:

250 OK

 

        SMTP sender จะทำการส่งจดหมาย จาก loy@i.am โดยจดหมายนี้จะส่งไปยัง 3 user ในเครื่องของ microsoft.com คือ billgate,surasit และ steve และ SMTP receiver ทำการตรวจสอบแล้ว ว่ามีตู้จดหมาย (mailbox) ของ billgate และ steve แต่ไม่มีตู้จดหมาย ของ user surasit เนื่องจากมีผู้รับจดหมายนี้ได้ ดังนั้น sender ก็ดำเนินการ ส่งข้อความไปยัง receiver

 

Connection Closing
SMTP sender จะปิดการเชื่อมต่อได้ 2 ขั้นตอนด้วยกัน

    1. sender ส่งคำสั่ง QUIT และรอการตอบรับจาก receiver
    2. ทำการเริ่มปิดการเชื่อต่อ TCP โดยจะทำหลังจาก receiver ส่งคำตอบรับจากคำสั่ง QUIT ตามข้อ 1 แล้ว

 

Summary

           ถึงแม้ว่า SMTP จะเป็น protocol ที่ไม่สามารถรับประกันได้ว่าจดหมายที่ส่งออกไป จะไม่หาย แต่เราก็ยอมรับว่า ระบบ มีความ reliable มากพอที่จะทำงานได้ ส่วนในเรื่อง security นั้น ก็สามารถส่ง ในรูปแบบของ PGP หรือ PEM เพื่อทำการเข้ารหัสข้อมูล ป้องกัน ข้อมูลของเราได้ ดังนั้นจึงเป็นระบบที่ใช้งานอยู่ในปัจจุบัน และในอนาคตก็คงเป็นเช่นนี้ ถึงจะมีการเปลี่ยนแปลง ก็คงเป็นเรื่อง ชนิดของข้อมูล และการเข้ารหัสข้อมูลต่างๆ

 

MENU