a. Trường RETURN-PATH
Trường thông tin này được hệ thống truyền tải thư tín cuối cùng (là hệ thống cuối cùng phát thư cho người nhận của nó) thêm vào phần header của thư. Nó được dùng
để chứa đựng những thông tin về địa chỉ trả về (return-address) của người gửi ban đầu.
b. Trường RECEIVED
<Received> = “Received-From” “:” domain
Một bản sao của trường thông tin này sẽ được thêm vào bởi mỗi một hệ thống
truyền tải thông điệp mà thư được chuyển qua. Thông tin ở trường này rất hữu ích
trong trường hợp xảy ra lỗi trong truyền thông.
Trường thông tin này dùng để xác định tên của máy chủ gửi (sending host), máy
chủ nhận và thời gian nhận được.
c. Trường FORWARD
<Forward> = “Forward-Path” “:” route-addr
Trường thông tin này được hệ thống truyền tải thư tín cuối cùng (là hệ thống cuối cùng phát thư cho người nhận của nó) thêm vào phần header của thư. Nó được dùng
để chứa đựng những thông tin về địa chỉ của người nhận thư.
d. Trường FROM
<From> = “From” “:” mailbox
Trường thông tin này chứa đựng thông tin về người gửi thư (sender). Quá trình gửi thư cần ngầm định trường này là đơn. Nó xác minh địa chỉ máy tính, xác nhận bên gửi là một người, hệ thống hay một tiến trình. Nếu công việc này không được thực
hiện thì phải thay thế bằng trường Sender
e. Trường DATE
f. Trường TO
<To> = “To” “:” mailbox
Trường này chứa đựng thông tin về người nhận thư (recipient) chính thức.
g. Trường CC
<cc> = “cc” “:” address
Trường này chứa đựng thông tin về người nhận thư thứ hai, có nghĩa đồng gửi
(carbon copy-cc).
h. Trường BCC
<bcc> = “bcc” “:” address
Trường này chứa đựng thông tin thêm về người nhận thư (blind carbon copy- bcc). Nội dung của trường này không chứa đựng trong bản sao thư gửi cho người nhận
thứ đầu tiên và người nhận thư hai.
i. Trường MESSAGE-ID
<Message-ID> = “Message-ID” “:” msg-id
Trường này chứa đựng thông tin định danh duy nhất về bức thư được gửi đi. Tính
duy nhất của trường này được bảo đảm bởi hệ thống sinh ra nó. Trường này được dùng
để dành riêng cho máy tính và không cần thiết đối với người sử dụng.
j. Trường SUBJECT
<Subject> = “Subject” “:” text
Date: 26 Aug 76 1430 EDT
From: George Jones <Group@Host> Sender: Secy@SHOST
To: ”Al Neuman”@Mad-Host,
Sam.Irving@Other-Host Message-ID: <some.string@SHOST>
Subject: Test ...
1.5. PHÂN TÍCH GIAO THỨC SMTP (RFC 821)
1.5.1. Giới thiệu chung
Mục đích của giao thức SMTP (Simple Mail Transfer Protocol) là để truyền thư đáng tin cậy và có hiệu quả.
SMTP đọc lập về hệ thống con truyền thông đặc biệt và các yêu cầu chỉ tin cậy
theo kênh luồng dữ liệu tuần tự.
Đặc tính quan trọng của SMTP là khả năng chuyển tiếp thư tín qua các môi trường dịch vụ truyền thông (transport service). Dịch vụ truyền thông cung cấp một môi trường truyền thông liên quá trình (interprocess communication environment - IPCE). IPCE có thể là một mạng, nhiều mạng hay một tập hợp con của một mạng. Điều quan trọng để nhận thấy rằng các hệ thống truyền thông (IPCEs) không phải là việc truyền thông tương ứng một tới một (one-to-one) với các mạng. Một tiến trình có thể truyền thông qua lại trực tiếp với một tiến trình khác thông qua bất kỳ một IPCE đã
chuyển tiếp qua một tiến tiến trình được kết nối tới hai hay nhiều IPCEs. Đặc biệt hơn
nữa, thư tín có thể được chuyển tiếp giữa các máy chủ (hosts) trên các hệ thống truyền
thông khác nhau bởi một máy chủ trên cả hai hệ thống truyền thông.
Giao thức SMTP định nghĩa cách để chuyển giao thư tín trực tiếp giữa các máy
tính trên mạng. Nó có hai vai trò là gửi (sender-SMTP) và nhận (receiver-SMTP) thư. Thông thường, bên gửi thiết lập một liên kết TCP với bên nhận, và bên nhận sử dụng
cổng truyền thông số 25 để cung cấp dịch vụ thư tín điện tử.
Trong một phiên giao dịch thư tín, bên gửi và bên nhận trao đổi tuần tự các lệnh
và các thông tin phản hồi.
1.5.2. Mô hình hoạt động phiên giao dịch
SMTP được thiết kế dựa trên mô hình truyền thông sau: khi người sử dụng
(user) gửi một yêu cầu dịch vụ thư tín, trước tiên Sender-SMTP thành lập một kênh truyền thông hai chiều tới Receiver-SMTP. Receiver-SMTP có thể là đích cuối cùng hoặc là một trạm trung gian. Sau đó, các lệnh của SMTP được sinh ra từ phía Sender- SMTP và gửi tới Receiver-SMTP. Receiver-SMTP sẽ thao tác trên các lệnh đó và gửi
trả kết quả về phía Sender-SMTP.
SMTP cung cấp cơ chế chuyển thư trực tiếp từ máy chủ của người gửi đến máy
chủ của người nhận khi hai máy chủ được kết nối trên cùng một dịch vụ truyền thông hoặc qua một hoặc nhiều Server-SMTP chuyển tiếp khi các máy chủ nguồn và máy chủ đích không cùng được kết nối tới cùng một dịch vụ truyền thông.
File System SMTP Commands / Replies Sender SMTP Receiver SMTP and Mail File System User
Để thực hiện được khả năng chuyển tiếp thư tín trên mạng, cần phải cung cấp tên của máy chủ cũng như tên của hộp thư (mailbox) cuối cùng cần gửi tới cho SMTP
Server.
SMTP cung cấp một tập các lệnh cho phép các máy tính trên mạng có thể trao đổi thực tiếp các thông tin theo một chuẩn qui định. Nhờ vào tập lệnh này, các hệ
thống thư tín khác nhau có thể trao đổi dữ liệu thư được với nhau. Mỗi lệnh đều có
cùng chiều dài bốn kí tự, hầu hết đều có tham số kèm theo.
Các lệnh sử dụng trong việc gửi/nhận thư tín tuân theo một cú pháp khắt khe. Đó
là các thông tin phản hồi luôn ở dạng mã số kèm theo là các mô tả về kết quả thực hiện
lệnh. Các lệnh và mã phản hồi không phân biệt chữ hoa và chữ thường. Điều này có nghĩa là một lệnh hoặc một thông báo phản hồi có thể ở dạng in hoa, in thường hoặc
trong bất kì một kiểu kết hợp nào giữa in hoa và in thường.
Lưu ý rằng điều này là không đúng với tên của ”user mailbox”. Với một số máy
chủ, user name là phân biệt chữ hoa, thường và việc thực hiện các lệnh SMTP cần phải quan tâm để đảm bảo sự thực hiện đúng đắn trong trường hợp này. Tên của máy chủ
cũng không phân biệt chữ hoa, thường.
Các lệnh và thông tin phản hồi được xây dựng bởi các kí tự từ bộ mã ASCII. Khi dịch vụ giao vận cung cấp kênh truyền thông 8 bit, mỗi kí tự truyền đi sẽ chỉ sử dụng
Mỗi phiên giao dịch SMTP phải trải qua một số giai đoạn. Các giai đoạn đó được
thực hiện thông qua các thủ tục SMTP, kèm theo đó là các thông tin phản hồi:
Thủ tục MAIL. Thủ tục FORWARDING. Các thủ tục MAILING và SENDING. Các thủ tục OPENING và CLOSING. Các mã trả lời của lệnh SMTP. 1.5.3. Thủ tục Mail
Để bắt đầu một phiên giao dịch thư tín thì cần phải thực hiện thủ tục MAIL. Nó
bao gồm 3 bước:
Lệnh MAIL được gửi đi kèm theo là tham số về địa chỉ người gửi thư.
Lệnh RCPT được gửi đi kèm theo là tham số về địa chỉ người nhận thư. Có thể
thực hiện nhiều lần lệnh này trong trường hợp muốn gửi thư cho nhiều người.
Lệnh DATA được gửi đi để xác nhận bắt đầu gửi dữ liệu của thư. Dưới đây là phần chi tiết về 3 lệnh trên.
a. Lệnh MAIL FROM <reverse-path>
Tham số: là một xâu ký tự định danh mailbox của người gửi thư.
Hạn chế: Chỉ có thể thực hiện khi chưa thực hiện chính lệnh này.
Chi tiết: Lệnh này dùng để xác nhận người gửi thư đồng thời thiết lập một
phiên giao dịch SMTP với Receiver-SMTP (Server). Nó đưa ra đường dẫn
<reverse-path> để sử dụng trong trường hợp phiên giao dịch không thực hiện thành công. Ngược lại, thông tin về người gửi sẽ được lưu lại.
250 OK
Trường hợp còn lại bị lỗi.
Ví dụ:
S: MAIL FROM: <Smith@Alpha.edu> R: 250 OK
b. Lệnh RCPT TO <forward-path>
Tham số: là một xâu ký tự định danh mailbox của người nhận thư.
Hạn chế: Chỉ có thể thực hiện khi đã định danh người gửi thư bằng lệnh
MAIL.
Chi tiết: Lệnh này dùng để xác nhận người nhận thư được chỉ định trong tham
số <forward-path>. Nếu Receiver-SMTP chấp nhận thì thông tin về người gửi
sẽ được lưu lại. Lệnh này có thể thực hiện nhiều lần để xác nhận nhiều người
nhận thư.
Thông tin phản hồi:
250 OK
Trường hợp còn lại bị lỗi.
Ví dụ
S: RCPT TO: <Jones@Beta.gov> R: 250 OK
S: rcpt to: <Green@Beta.gov> R: 550 No such user here
c. Lệnh DATA
Tham số: không.
Chi tiết: Lệnh này dùng để xác nhận bắt đầu việc gửi nội dung thư. Nếu SMTP
Receiver chấp nhận, nó sẽ tiến hành nhận và lưu trữ tất cả các dòng văn bản được gửi đến. Để kết thúc việc gửi dữ liệu, SMTP Sender cần gửi một dòng chỉ chứa một dấu chấm ”.”. Lưu ý rằng phần dữ liệu sau lệnh DATA bao gồm
toàn bộ phần header của thư (như các trường Date, Subject, CC, From, ...) cũng như nội dung thư.
Thông tin phản hồi:
250 OK
Ví dụ:
S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF> S:. . . Sends body of mail message . . .
S: <CR><LF>.<CR><LF> R: 250 OK
S: QUIT
S: 221 Beta.gov Service Closing Transmission Channel
Sau đây là một ví dụ minh hoạ cho một phiên giao dịch thư tín SMTP. Phần thông tin phía Server được bắt đầu bằng R: và mã số, tiếp sau là thông tin. Phần phía
Client là các lệnh thực thi của SMTP bắt đầu bằng S:. Ta sẽ sử dụng dịch vụ Telnet để
kích hoạt dịch vụ thư tín trên cổng 25 (SMTP).
d. Ví dụ về một phiên giao dịch SMTP
R: 220 BERKELEY.ARPA Simple Mail Transfer Service Ready S: HELO USC-ISIF.ARPA
R: 250 BERKELEY.ARPA
S: RCPT TO: <fabry@BERKELEY.ARPA> R: 250 OK
S: RCPT TO: <eric@BERKELEY.ARPA>
R: 552 Recipient storage full, try again in another transaction S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF> S: Blah blah blah...
S: ...etc. etc. etc. S: .
R: 250 OK
S: MAIL FROM: <Postel@USC-ISIF.ARPA> R: 250 OK
S: RCPT TO: <eric@BERKELEY.ARPA> R: 250 OK
S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF> S: Blah blah blah...
S: ...etc. etc. etc. S: .
R: 250 OK S: QUIT
R: 221 BERKELEY.ARPA Service closing transmission channel
Trong một số trường hợp địa chỉ trong tham số <forward-path> bị sai, nhưng
SMTP Receiver lại biết chính xác địa chỉ đích thì các thông tin phản hồi có thể được
sử dụng để cho phép người gửi xác nhận lại địa chỉ đúng.
251 User not local; will forward to <forward-path>
Thông tin phản hồi này chỉ ra rằng mailbox của người nhận thuộc một máy chủ
(host) khác. Như vậy, SMTP Receiver sẽ chỉ ra <forward-path> chính xác để sử dụng
và nó sẽ chịu trách nhiệm gửi thư này.
551 User not local; please try <forward-path>
Thông tin phản hồi này chỉ ra rằng, SMTP Receiver biết được mailbox của người nhận thuộc một máy chủ khác. Nó sẽ đưa ra địa chỉ chính xác để sử dụng nhưng trong trường hợp này nó không thực hiện việc gửi thư đi. Chính vì vậy, người gửi cần
phải xác nhận lại các thông tin cho chính xác theo thông tin phản hồi của SMTP
Receiver hoặc trả lại thông báo lỗi cho người gửi ban đầu. Sau đây là ví dụ về cách sử dụng thủ tục này:
S: RCPT TO:<Postel@USC-ISI.ARPA> R: 251 User not local;
will forward to <Postel@USC-ISIF.ARPA> or
S: RCPT TO:<Paul@USC-ISIB.ARPA> R: 551 User not local;
please try <Mockapetris@USC-ISIF.ARPA>
SMTP chủ yếu cung cấp các chức năng phát thư đến mailbox của người sử dụng.
Tuy nhiên, nó cũng có một số các chức năng thực hiện việc chuyển thư đến terminal
của người sử dụng.
Việc phát thư đến mailbox của người sử dụng được gọi là ”mailing”, còn việc phát thư đến terminal được gọi là ”sending”. Dịch vụ sending là phần mở rộng của một
hệ thống thư tín điện tử.
Có ba dạng câu lệnh được định nghĩa để hỗ trợ cho các tùy chọn sending. Các
câu lệnh này được dùng trong các phiên giao dịch SMTP thay thế cho câu lệnh MAIL
và báo cho Receiver-SMTP biết ý nghĩa đặc biệt của phiên giao dịch này.
a. Lệnh SEND FROM <reverse-path>
Tham số: địa chỉ terminal của người nhận.
Chi tiết: Lệnh này yêu cầu dữ liệu của thư được phân phát tới terminal của
người sử dụng. Nếu người sử dụng chưa kích hoạt (hoặc không chấp nhận
kiểu giao dịch này) thì Receiver-SMTP sẽ gửi trả mã 450. Phiên giao dịch là thành công nếu thư được chuyển đến terminal của người sử dụng.
Thông tin phản hồi:
450 OK
b. Lệnh SOML FROM <reverse-path>
Tham số: địa chỉ terminal của người nhận.
Chi tiết: Lệnh này (viết tắt của chữ Send Or MaiL) yêu cầu dữ liệu của thư
được phân phát tới terminal của người sử dụng trong trường hợp người sử
dụng kích hoạt (và chấp nhận kiểu giao dịch này). Trong trường hợp ngược
lại, nghĩa là người sử dụng chưa kích hoạt thì dữ liệu của thư sẽ được chuyển đến mailbox của người nhận. Phiên giao dịch thành công nếu thư được chuyển đến terminal của người sử dụng.
Chi tiết: Lệnh này (viết tắt của chữ Send And MaiL) yêu cầu dữ liệu của thư được phân phát tới terminal của người sử dụng trong trường hợp người sử
dụng kích hoạt (và chấp nhận kiểu giao dịch này). Trong bất cứ trường hợp
nào thì dữ liệu của thư cũng sẽ được chuyển đến mailbox của người nhận.
Phiên giao dịch thành công nếu thư được chuyển đến mailbox của người sử
dụng.
1.5.6. Các thủ tục Opening và Closing
Khi một phiên giao dịch thư tín được mở, cần phải có sự trao đổi thông tin giữa
các máy chủ (host) để đảm bảo sự chính xác trong giao dịch. Có hai lệnh để thực hiện
việc đóng/mở một phiên giao dịch.
a. HELO <domain>
Tham số: tên domain của máy chủ thực hiện việc gửi thư (có thể không có).
Chi tiết: Lệnh này dùng để xác nhận domain máy chủ SMTP Sender.
Thông tin phản hồi:
250 <domain>
Ví dụ:
R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready S: HELO USC-ISIF.ARPA
R: 250 BBN-UNIX.ARPA
b. QUIT
Tham số: không.
250 CRLF
Ví dụ:
S: QUIT
R: 221 BBN-UNIX.ARPA Service closing transmission channel
1.5.7. Mã trả lời của các câu lệnh SMTP
Trong một phiên giao dịch SMTP, phía SMTP Sender gửi các lệnh yêu cầu còn phía SMTP Receiver sẽ gửi trả các thông tin phản hồi và các mã phản hồi.
Để đảm bảo tính thống nhất truyền thông trong quá trình truyền thư, đồng thời để đảm bảo phía SMTP Sender luôn biết được chính xác trạng thái của SMTP Receiver,
mọi câu lệnh yêu cầu đều phải được trả lời bằng các mã thông tin phản hồi chính xác.
Bảng Mã thông tin phản hồi của SMTP
Mã thông tin phản hồi Thông tin kèm theo
500 Syntax error or Command unregconized
501 Syntax error in parameters or arguments
503 Bad sequence of command
504 Command parameter not implement
211 System status or System help reply
214 Help message
221 Service closing transmission channel
421 Service not available, closing transmission channel
250 OK
251 User not local; will forward to <forward-path>
450 Mailbox unavailable (not found or no access)
551 User not local; please try <forward-path>
452 Insufficent system storage
552 Request mail action aborted
553 Mailbox name not allow (mailbox syntax incorrect)
354 Start mail input, end with <CRLF>.<CRLF>
554 Transaction failed
Một mã thông tin phản hồi là một số có 3 chữ số và tiếp theo là một chuỗi văn
bản mô tả về mã đó. Bảng trên đây sẽ trình bày chi tiết các thông tin phản hồi:
Truyền thông giữa Sender-SMTP và Receiver-SMTP được coi như một cuộc hội
thoại, được điều khiển bởi Sender-SMTP. Như vậy, Sender-SMTP đưa ra một lệnh
yêu cầu và Receiver- SMTP sẽ trả lại một mã thông tin phản hồi. Sau khi Sender-