Các giao thức gửi nhận mail

Một phần của tài liệu Xây dựng webmail client bằng công nghệ java (Trang 25)

9.1. SMTP (Simple Mail Transfer Protocol) 9.1.1. Giới thiệu chung 9.1.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 đã được biết. Thư tín là một

ứng dụng hay là việc sử dụng truyền thông liên tiến trình. Thư tín có thểđược truyền qua giữa các tiến trình theo các IPCEs khác nhau bắng cách 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.

9.1.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.

Để 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 7, bit cao nhất sẽđược xoá về 0.

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. File System SMTP Commands / Replies Sender SMTP Sender - SMTP

Mô hình tổng quát sử dụng giao thức SMTP

Receiver SMTP Receiver - SMTP and Mail File System User

ƒ 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.

9.1.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: (adsbygoogle = window.adsbygoogle || []).push({});

ƒ 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.

9.1.3.1. 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.

Thông tin phản hồ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

9.1.3.2. 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

9.1.3.3. Lệnh DATA

Tham số: không.

Hạn chế: Chỉ có thể thực hiện khi đã thực hiện thành công việc xác nhận người gửi và người nhận thư.

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 (adsbygoogle = window.adsbygoogle || []).push({});

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).

9.1.3.4. 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: MAIL FROM: <Postel@USC-ISIF.ARPA> R: 250 OK

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

9.1.4. Thủ tục Forwarding

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 (adsbygoogle = window.adsbygoogle || []).push({});

S: RCPT TO:<Paul@USC-ISIB.ARPA> R: 551 User not local;

please try <Mockapetris@USC-ISIF.ARPA>

9.1.5. Các thủ tục Mailing và Sending

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.

9.1.5.1. 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

9.1.5.2. 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.

9.1.5.3. Lệnh SAML 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 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.

9.2. POP3 (Post Office Protocol) 9.2.1. Giới thiệu 9.2.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ề.

9.2.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. (adsbygoogle = window.adsbygoogle || []).push({});

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 chuyển sang trạng thái UPDATE. Server sẽ đóng kết nối TCP mà không chuyển bất kì một thư

nào cũng như các thông tin phản hồi nào về phía Client.

Như vậy, ta thấy một phiên làm việc của POP3 phải trải qua ba trạng thái: trạng thái AUTHORIZATION, trạng thái TRANSACTION và trạng thái UPDATE.

Phần tiếp theo sẽ trình bày chi tiết về sự hoạt động của POP3 Server trong từng trạng thái của phiên giao dịch và các lệnh có thể thực hiện trong mỗi trạng thái đó.

Một phần của tài liệu Xây dựng webmail client bằng công nghệ java (Trang 25)