Tìm hiểu về các giao thức SMTP, POP, IMAP

Tìm hiểu về các giao thức SMTP, POP, IMAP

Chuẩn Internet cho e-mail là Simple Mail Transport Protocol (SMTP). SMTP là nghi thức cấp ứng dụng (application-level) dùng để điều khiển các dịch vụ thông điệp thông qua các mạng TCP/IP. SMTP được nói rõ trong RFC 321 và 822. SMTP sử dụng cổng TCP 25.

Bên cạnh SMTP, hai nghi thức khác dùng để phân phát mail đến client là POP3 và IMAP4.

MIME và SMTP
MIME (Multipurpose Internet Mail Extensions) bổ sung thêm cho SMTP để cho phép gắn kèm các thông điệp đa phương tiện (không phải là văn bản) bên trong thông điệp SMTP chuẩn. MIME sử dụng mã hóa Base64 để chuyển các file phức tạp sang ASCII. MIME được mô tả trong các RFC 2045-2049.

Các lệnh SMTP thường sử dụng:

HELO - Sử dụng để định danh máy gửi với máy nhận. Lệnh này phải kèm với tên máy tính của máy gửi. Trong nghi thức mở rộng (ESMTP), lệnh EHLO thay cho lệnh này.
MAIL - Khởi tạo một phiên gửi mail. Đối số bao gồm trường “FROM” và địa chỉ email của người gửi.
RCPT - Định danh người nhận thông điệp. Đi kèm với “TO” và địa chỉ email người nhận.
DATA - Thông báo bắt đầu gửi dữ liệu thực sự của mail (phần thân của message). Dữ liệu kết thúc bằng một dòng trống và một dấu chấm (.).
RSET - Hủy (reset) phiên gửi mail hiện hành.
VRFY - Sử dụng để xác nhận một người nhận mail.
NOOP - Viết tắt của “no operation”, lệnh này không làm gì cả.
QUIT - Đóng kết nối
SEND - Báo cho host nhận biết là message phải được gửi đến một terminal khác.
HELP - Yêu cầu thông tin trợ giúp từ host nhận.

Ví dụ một phiên giao dịch SMTP:

220 ntbooks-pro Microsoft ESMTP MAIL Service, Version: 6.0.2505.1 ready at Mon, 8 Jul 2002 17:44:12 -0700
HELO
250 ntbooks-pro Hello [192.168.0.1]
MAIL FROM : user1@mydomain.com
250 2.1.0 user1@mydomain.com....Sender OK
RCPT TO : user2@mydomain.com
250 2.1.5 user2@mydomain.com
DATA
354 Start mail input; end with .
mail test
ha ha ha

.
250 2.6.0 Queued mail for delivery
QUIT
221 2.0.0 ntbooks-pro Service closing transmission channel

Nội dung mail nhận được có dạng như sau:

Received: from ([192.168.0.1]) by ntbooks-pro with Microsoft SMTPSVC(6.0.2505.1); Mon, 8 Jul 2002 17:46:21 -0700
From: user1@mydomain.com
Bcc:
Return-Path: user1@mydomain.com
Message-ID:
X-OriginalArrivalTime: 09 Jul 2002 00:46:50.0836 (UTC) FILETIME=[1CDAC940:01C226E2]
Date: 8 Jul 2002 17:46:50 -0700

mail test

ha ha ha


Các mã trạng thái SMTP
Khi một sending host gửi một lệnh SMTP đến receiving host, host nhận trả về một mã trạng thái cho máy gửi biết là điều gì đã xảy ra. Danh sách bên dưới là code được nhóm theo số đầu tiên (5xx là lỗi, 4xx lỗi tạm thời, 1xx-3xx thành công):

211 Trả lời trợ giúp, trạng thái hệ thống
214 Help message
220 Dịch vụ sẳn sàng (Service ready)
221 Đóng kết nối
250 Hành động yêu cầu được chấp nhận
251 Người sử dụng không ở mạng cục bộ, chuyển đến
354 Bắt đầu nhập mail
421 Dịch vụ không sẳn sàng
450 Hành động không chấp nhận, mailbox bận
451 Hành động bị hũy, lỗi cục bộ
452 Hành động không chấp nhận, thiếu không gian lưu trữ
500 Không hiểu lệnh hoặc lỗi cú pháp
501 Lỗi cú pháp ở tham số
502 Lệnh không được hổ trợ
503 Sai thứ tự các lệnh
504 Tham số của lệnh không được hổ trợ
550 Hành động không chấp nhận, mailbox không có.
551 Không phải là người sử dụng cục bộ
552 Hũy lệnh do vượt quá không gian lưu trữ
553 Hành động không chấp nhận, tên mailbox không cho phép
554 Phiên dao dịch bị lỗi

Post Office Protocol (POP)

POP cho phép các mail client (UA – User Agent) ở máy cục bộ kết nối vào pop server (MTA – Message Transfer Agent) và lấy mail về máy tính cục bộ nơi mà người sử dụng có thể đọc và trả lời các message. POP được định nghĩa đầu tiên vào năm 1984, được nâng cấp trong POP2 vào năm 1988. Chuẩn hiện hành là POP3.
POP3 UA kết nối với TCP/IP đến server (cổng chuẩn 110). UA nhập vào một tên đăng nhập (username) và mật mã (password). Sau khi đăng nhập, UA sử dụng các lệnh POP3 để lấy và xóa mail.
POP3 là nghi thức chỉ để nhận mail. POP3 UA sử dụng SMTP để gửi mail đến server.
POP3 được mô tả trong RFC 1939.

Các lệnh của POP3

USER Chỉ rõ username
PASS Chỉ rõ password
STAT Yêu cầu trạn thái của mailbox (số lượng message, kích thước của các message)
LIST Liệt kê các message
RETR Lấy một message cụ thể
DELE Xóa một message cụ thể
NOOP Không làm gì cả
RSET Hủy hành động của các lệnh DELE (rollback)
QUIT Chấp nhận các thay đổi và cắt kết nối.

Internet Mail Access Protocol (IMAP)

POP3 là một nghi thức đơn giản. IMAP4 là một chuẩn mail khác có hổ trợ nhiều tính năng hơn.
IMAP4 được mô tả trong RFC 2060. IMAP4 sử dụng cổng TCP 143.

Các lệnh IMAP4

CAPABILITY Yêu cầu một danh sách các chức năng có hỗ trợ.
AUTHENTICATE Chỉ rõ cơ chế đăng nhập
LOGIN Cung cấp username và password
SELECT Chỉ rõ mailbox
EXAMINE Chỉ định mailbox ở chế độ chỉ đọc.
CREATE Tạo một mailbox
DELETE Xóa một mailbox
RENAME Đổi tên một mailbox
SUBSCRIBE Thêm một mailbox vào danh sách cho phép.
UNSUBSCRIBE Loại mailbox ra khỏi danh sách cho phép.
LIST Liệt kê các mailbox
LSUB Liệt kê các mailbox cho phép.
STATUS Yêu cầu trạng thái của mailbox
APPEND Thêm một message vào mailbox
CHECK Yêu cầu một mailbox checkpoint
CLOSE Chấp nhận các thao tác xóa và đóng mailbox
EXPUNGE Chấp nhận các thao tác xóa
SEARCH Tìm trong mailbox các message thỏa điều kiện cụ thể
FETCH Lấy một phần của một message cụ thể
STORE Thay đổi dữ liệu của message cụ thể
COPY Chép message sang một mailbox khác
NOOP Không làm gì cả
LOGOUT Đóng kết nối

Các lệnh RFC thực sự không phải là các lệnh ngôn ngữ lập trình, nó là các chuỗi dùng để gửi đến Server qua Socket được tạo với cổng tương ứng.Ví dụ, nếu muốn gửi mail, tạo một socket TCP cổng 25 với Server (ví dụ, Post Office) sau đó lần lượt gửi các lệnh RFC (kết thúc lệnh là ký tự ENTER) và nhận các trả lời từ server để gửi mail.
Cách nhanh nhất để thử các lệnh RFC là dùng chương trình Telnet. Ví dụ để gửi một mail, làm như sau:

Windows 2000: ở Command Prompt gõ lệnh:
Telnet mail.myserver.com 25
Sau đó gõ các lệnh như trong ví dụ đã nêu phần trước.
Nếu viết một Windows Application thì có thể dùng MAPI control của Windows, nếu viết (asp) Webmail có thể dùng CDO, các control này giúp cho người lập trình không cần biết RFC nhưng vẫn có thể viết được các ứng dụng mail bằng cách sử dụng các phương thức và các thuộc tính của chúng. Nhưng các control trên đều dùng các lệnh RFC để làm việc gửi và nhận mail thực sự.
Việc viết một ứng dụng bằng cách sử dụng trực tiếp RFC đòi hỏi người lập trình phải code nhiều (hầu như là mọi thứ), phải tìm hiểu nhiều chuẩn khác (MIME), các kiểu mã hóa (Base64, uuencode ,...), nếu viết Webmail phải tìm hiểu thêm upload file (để attach), cách tổ chức trên Webserver để quản lý mail đọc rồi và chưa đọc, hoặc tạo thêm các thư mục...

Từ Internet