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-
SMTP đưa ra lệnh yêu cầu, nó phải đợi thông tin phản hồi từ Receiver-SMTP rồi mới đưa ra lệnh tiếp theo.
Trong các mã thông tin phản hồi, mã phản hồi quan trọng nhất là 220. Nó đặc trưng cho việc thực hiện thành công yêu cầu.
1.6.1. Giới thiệu
Giao thức POP3 cho phép một máy trạm có thể truy nhập để lấy thư trên máy
chủ. Nó định nghĩa cách thức giao tiếp với POP3 Server bởi các lệnh chuẩn được quy định trong RFC 1081 để lấy thư về.
1.6.2. Mô hình hoạt động phiên giao dịch
Vào thời điểm bắt đầu, tiến trình phía Server bắt đầu dịch vụ POP3 bằng cách
”lắng nghe” trên cổng TCP 110. Thuật ngữ ”lắng nghe” ở đây được hiểu theo nghĩa là tiến trình phía Server luôn luôn tiếp nhận các thông tin đến ở cổng dịch vụ mà nó cung cấp - trong trường hợp này là cổng dịch vụ 110 - xử lý và gửi kết quả về cho tiến trình yêu cầu dịch vụ phía Client.
Khi một tiến trình phía Client muốn sử dụng dịch vụ, nó thiết lập một kết nối
TCP tới máy chủ phía Server. Khi kết nối được thiết lập, POP3 Server gửi một thông
báo chấp nhận và sau đó tiến trình phía Client và POP3 Server có thể trao đổi các lệnh
cũng như các thông tin phản hồi cho đến khi kết nối bị hủy bỏ hoặc phiên giao dịch kết
thúc.
Các lệnh trong POP3 bao gồm từ khóa, có thể theo sau là một hoặc nhiều tham
số. Tất cả các lệnh đều được kết thúc bởi cặp ký tự CRLF. Từ khóa và các tham số là các kí tự in được trong bảng mãkí tự ASCII, giữa chúng được phân cách bởi một kí tự
dấu cách trống. Từ khóa có thể dài ba hoặc bốn kí tự, còn các tham số có thể dài tới
bốn mươi kí tự.
Thông tin phản hồi của POP3 bao gồm một thông báo trạng thái và một từ khóa có thể theo sau một số thông tin thêm. Tất cả các thông tin phản hồi đều được kết thúc
bởi cặp ký tự CRLF.
Có hai thông báo trạng thái là: Xác định (”+OK”) để xác nhận thành công và phủ định (”-ERR”) để xác nhận trong trường hợp có lỗi.
Các thông tin phản hồi cho các lệnh thực tế là nhiều dòng. Trong những trường
hợp này, sau khi gửi dòng đầu tiên của thông tin phản hồi và một cặp CRLF, bất cứ
một dòng thêm vào nào được gửi thì đều phải kết thúc bằng cặp CRLF. Khi tất cả các
thông tin phản hồi đều đã được gửi, một dòng cuối cùng được gửi, bao gồm mã kết
thúc (mã thập phân 046, ”.”) và một cặp CRLF.
Nếu có một dòng nào trong thông tin phản hồi đa dòng bắt đầu với một mã ký tự
kết thúc (dấu chấm ”.”), thì dòng đó coi như chưa được xử lí xong đối với thông tin phản hồi . Vì vậy, một thông tin phản hồi đa dòng được kết thúc bởi bộ năm octets là ”CRLF. CRLF”.
Một phiên giao dịch POP3 phải trải qua một số các trạng thái trong suốt thời gian
tồn tại của phiên làm việc. Mỗi lần kết nối TCP được mở và POP3 Server gửi thông
báo chấp nhận, phiên làm việc chuyển sang trang thái AUTHORIZATION. ở trạng
thái này, Client phải tự định danh của mình cho POP3 Server.
Mỗi khi Client thực hiện xong việc định danh, Server nhận được tài nguyên
tương ứng với hộp thư của Client, nó sẽ chuyển sang trạng thái TRANSACTION.
Trong trạng thái này, các yêu cầu của Client được chuyển sang và được thực hiện bên phía POP3 Server. Khi Client đưa ra lệnh QUIT, phiên làm việc chuyển sang
trạng thái UPDATE. Trong trạng thái này, POP3 Server giải phóng mọi tài nguyên thu
được trong suốt trạng thái TRANSACTION và kết thúc. Đồng thời, kết nối TCP kết
thúc.
Một POP3 Server có thể có một bộ xác định thời gian. Nếu sau một khoảng thời gian xác định trước mà phía Client không có tác động gì thì POP3 Server có thể tự động kết thúc phiên làm việc. Khoảng thời gian này ít nhất là khoảng 10 phút.
Nếu trong khoảng thời gian này có bất kì một lệnh nào từ phía Client, bộ xác định thời gian sẽ được khởi tạo lại. Khi hết thời gian hiệu lực, phiên làm việc không