SMTP

**SMTP** (tiếng Anh: ***Simple Mail Transfer Protocol*** - *giao thức truyền tải thư tín đơn giản*) là một chuẩn truyền tải thư điện tử qua mạng Internet. SMTP được định nghĩa trong bản RFC 821 (STD 10) và được chỉnh lý bằng bản RFC 1123 (STD 3), chương 5. Giao thức hiện dùng được là ESMTP (*extended SMTP - SMTP mở rộng*), được định nghĩa trong bản RFC 2821.

Mặc dù máy chủ thư điện tử và các mail transfer agents (MTA:dịch vụ chuyển thư) khác sử dụng SMTP để gửi và nhận thư, các ứng dụng thư điện tử thường sử dụng SMTP chỉ để gửi thư đến một máy chủ thư điện tử để được chuyển tiếp. Để truy xuất emails, chúng sử dụng IMAP hoặc POP3.

## Lịch sử
Giao thức trước đó của SMTP trong Arpanet là Mail Box Protocol (RFC 278) có từ tháng 7 năm 1971 và sau đó là FTP Mail (RFC 458) từ tháng 2 năm 1973. Với sự xuất hiện của Internet từ ARPANET vào khoảng năm 1980, Jon Postel đề nghị tách riêng nó ra khỏi sự phụ thuộc của việc vận chuyển thư điện tử từ dịch vụ FTP (RFC 772) và SMTP được công bố theo RFC 821 vào năm 1982. Vào đầu những năm 1980, nó đã trở thành một bổ sung cho UUCP, được sử dụng chủ yếu cho các máy tính kết nối định kỳ dùng cho việc lưu hành e-mail. SMTP đã trở thành tiêu chuẩn cho các máy tính nối liên tục với mạng.

SMTP là một giao thức dùng nền văn bản (ASCII) và tương đối đơn giản. Trước khi một thông điệp được gửi, người ta có thể định vị một hoặc nhiều địa chỉ nhận thông điệp - những địa chỉ này thường được kiểm tra về sự tồn tại trung thực của chúng). Việc kiểm thử một trình chủ SMTP là một việc tương đối dễ dàng, dùng chương trình ứng dụng "telnet" (xem dưới đây).

SMTP dùng cổng 25 của giao thức TCP. Để xác định trình chủ SMTP của một tên miền nào đấy (*domain name*), người ta dùng một mẫu tin MX (*Mail eXchange - Trao đổi thư*) của DNS (*Domain Name System - Hệ thống tên miền*).

SMTP định nghĩa tất cả những gì đã làm với email. Nó xác định cấu trúc của các địa chỉ, yêu cầu tên miền và bất cứ điều gì liên quan đến email.
SMTP cũng xác định các yêu cầu cho Post Office Protocol (POP) và truy cập Internet Message Protocol (IMAP) máy chủ, do đó email được gửi đúng cách.

SMTP bắt đầu được sử dụng rộng rãi vào những năm đầu thập niên kỷ 1980. Tại thời điểm đó, SMTP chỉ là một phần mềm bổ sung của bộ trình ứng dụng đồng giao thức UUCP (*Unix to Unix CoPy - Sao chép từ máy Unix sang máy Unix*) nhưng tiện lợi hơn trong việc truyền tải thư điện tử giữa các máy vi tính - những máy này thỉnh thoảng mới lại được kết nối với nhau một lần, để truyền thông dữ liệu. Thực ra, SMTP sẽ làm việc tốt hơn nếu các máy gửi và máy nhận được kết nối liên tục.

Trong bài viết về "người gửi viết lại địa chỉ", những tin tức căn bản về kỹ thuật của SMTP trong lịch sử trước đây, và kỹ thuật định tuyến trở về nguồn, trước khi RFC 1123 ra đời (năm 1989, bị thay thế bởi RFC 2821) đã được đề cập đến.

Sendmail là một trong những phần mềm đặc vụ truyền tải thư tín (*mail transfer agent*) đầu tiên (nếu không phải là cái trước tiên nhất) thực thi giao thức SMTP. Tính đến năm 2001, người ta đã thấy có ít nhất là 50 chương trình ứng dụng thực thi giao thức SMTP, bao gồm cả chương trình client (phần mềm dùng để gửi thông điệp) và chương trình server (phần mềm dùng để nhận thông điệp). Một số trình chủ SMTP nổi tiếng có thể liệt kê bao gồm: exim, Postfix, qmail, và Microsoft Exchange Server.

Do thiết kế của giao thức dùng dạng thức văn bản thường của bộ mã ASCII, khi bản thiết kế được khởi công, chức năng của SMTP giải quyết tập tin có dạng thức nhi phân rất kém. Những tiêu chuẩn như MIME đã được xây dựng để mã hóa những tập tin nhị phân, cho phép chúng được truyền tải dùng giao thức SMTP. Hiện nay, phần lớn các trình chủ SMTP hỗ trở phần mở rộng 8BITMIME của SMTP, cho phép các tập tin ở dạng thức nhị phân được truyền thông qua đường dây, dễ như việc truyền tải văn bản thường vậy.

SMTP là một giao thức "đẩy" thông điệp và không cho phép ai "rút" thông điệp từ máy chủ ở xa, theo yêu cầu của mình, một cách tùy tiện. Để lấy được thông điệp, một trình khách thư điện tử phải dùng POP3 (*Post Office Protocol - Giao thức bưu điện tử*) hoặc IMAP (*Internet Message Access Protocol - Giao thức truy cập thông điệp Internet*). Chúng ta còn có thể dùng phần mềm ETRN (*Extended Turn*) để khởi động một trình chủ SMTP phân phát thông điệp mà nó đang lưu trữ.

### Những lập trình viên

Rất nhiều người đã từng sửa đổi hoặc cống hiến vào những phần chủ chốt trong đặc tả của SMTP, trong số đó có: Jon Postel, Eric Allman, Dave Crocker, Ned Freed, Randall Gellens, John Klensin, và Keith Moore.

## Ví dụ về truyền thông của SMTP
Sau khi kết nối giữa người gửi (trình khách) và người nhận (trình chủ) đã được thiết lập, những việc làm sau đây là những việc hoàn toàn hợp lệ, đối với một phiên giao dịch dùng giao thức SMTP. Trong cuộc hội thoại dưới đây, những gì trình khách gửi được đánh dấu bằng chữ **C:** đứng trước, còn những gì trình chủ gửi được đánh dấu bằng **S:**. Các hệ thống máy tính đều có thể thiết lập một kết nối, bằng cách dùng những dòng lệnh của phần mềm telnet, trên một máy khách. Chẳng hạn:

:`telnet www.example.com 25`

khởi động một kết nối SMTP từ máy gửi thông điệp đến máy chủ www.example.com.

 S: 220 www.example.com ESMTP Postfix
 C: HELO mydomain.com
 S: 250 Hello mydomain.com
 C: MAIL FROM:
 S: 250 Ok
 C: RCPT TO:
 S: 250 Ok
 C: DATA
 S: 354 End data with .
 C: Subject: test message
 C: From: sender@mydomain.com
 C: To: friend@example.com
 C:
 C: Hello,
 C: This is a test.
 C: Goodbye.
 C:.
 S: 250 Ok: queued as 12345
 C: QUIT
 S: 221 Bye

Tuy không bắt buộc và không được liệt kê trên đây, hầu hết các trình khách sẽ hỏi trình chủ xem tính năng mở rộng SMTP nào là tính năng trình chủ hỗ trợ, bằng cách gửi thông điệp chào hỏi "HELLO" cho trình chủ, và khởi động tính năng ESMTP (*Extended SMTP - SMTP mở rộng*) của trình chủ.

Những trình khách hiện đại thường dùng câu lệnh "SIZE" (cỡ) - một trong những từ chìa khóa (*keyword*) - trong SMTP mở rộng để điều tra cỡ lớn tối đa của thông điệp mà trình chủ có thể chấp nhận. Những trình khách và trình chủ cũ trước đây thường cho truyền tải ào ạt một lượng thông điệp thật lớn qua cho nhau, để rồi chúng lại bị từ chối sau khi đã đến đích, phung phí tài nguyên của mạng lưới một cách vô ý thức. Đấy là chưa kể thời gian kết nối tốn kém vào các ISP (*Internet Service Provider - Nhà cung cấp dịch vụ Internet*) quay số, mà người dùng phải trả giá từng phút đồng hồ một.

Khi có dự định hiệu chỉnh những tập tin khổng lồ, hoặc dự định gửi tập tin bằng những trình khách cũ, người dùng có thể xác định được độ lớn tối đa của thông điệp mà trình chủ ESMTP cho phép và chấp nhận, trước khi gửi thông điệp. Người dùng có thể sử dụng phần mềm "telnet" như đã nói ở trên, thay thế dòng lệnh "HELLO mydomain.com" với dòng lệnh "HELLO mydomain.com", như được liệt kê dưới đây:

 S: 220-serverdomain.com ESMTP {postfix version and date}
 S: 220-NO UCE. {etc., terms of service}
 C: EHLO mydomain.com
 S: 250-serverdomain.com Hello mydomain.com [127.0.0.1]
 S: 250-SIZE 14680064
 S: 250-PIPELINING
 S: 250 HELP

Trình chủ tại serverdomain.com trên đây báo cáo với người dùng rằng nó sẽ nhận một thông điệp với cỡ tối đa là 14.680.064 byte (một byte bằng 8-bit). Tuy báo vậy, song thực tế còn tùy thuộc vào thực trạng và tình hình sử dụng tài nguyên ở máy chủ lúc đó, trình chủ có thể không có khả năng chấp nhận được thông điệp có độ lớn như đã báo.

Có trường hợp trình chủ ESMTP chỉ thông báo cỡ SIZE tối đa, khi trình khách dùng HELLO trong khi tương giao với trình chủ, mà thôi. Khi dùng, nếu chúng ta phát hiện thấy không có con số nào hiện ra sau câu lệnh "SIZE", trong khi giới hạn về độ lớn của thông điệp nhất định phải được xác định một cách chính xác, thì người dùng có thể tương giao tiếp tục với trình chủ bằng cách giả vờ tạo một mẫu tin đầu ESMTP trong một thông điệp, trong đó đã gắn một con số ước chừng nào đấy về cỡ lớn của thông điệp và gửi thông điệp này cho trình chủ. Xin xem thêm phần liên kết ngoài, dòng kết nối cho RFC 1870 dưới đây để biết thêm chi tiết.

## Bảo an trong SMTP và thư nhũng lạm

Một trong những giới hạn của bản thiết kế SMTP gốc là việc nó không cung cấp một phương tiện nào để chứng thực (*authentication*) người gửi khi chúng ta cần. Chính vì thế mà phần mở rộng SMTP-AUTH đã được thiết kế và bổ sung.

Mặc dầu đã có phần chứng thực người gửi bổ sung, nhũng lạm thư điện tử vẫn còn là một vấn đề lớn, khó giải quyết. Việc sửa đổi giao thức SMTP một cách triệt để, hoặc thay thế giao thức toàn bằng một cái khác, là một việc không dễ gì thực hiện được, vì sự thay đổi sẽ gây ảnh hưởng đến mạng lưới truyền thông của những máy chủ SMTP khổng lồ, đã và đang được dùng. Internet Mail 2000 là một trong những bản dự thảo đề cập đến vấn đề này.

Vì lý do trên, một số đề nghị về việc dùng các giao thức bên lề để hỗ trợ hoạt động của SMTP đã được công bố. Nhóm nghiên cứu chống thư nhũng lạm (*Anti-Spam Research Group*) của Lực lượng chuyên trách nghiên cứu liên mạng (*Internet Research Task Force - viết tắt là IRTF*) hiện đang làm việc trên một số dự thảo về chứng thực thư điện tử (*E-mail authentication*) và một số những dự thảo khác liên quan đến việc cung cấp một cơ chế chứng thực nguồn gửi với tính năng: tuy đơn giản song linh hoạt, tuy ở mức độ hạng nhẹ song có khả năng khuếch trương. Những hoạt động gần đây của Lực lượng chuyên trách nghiên cứu liên mạng (*Internet Engineering Task Force - viết tắt là IETF*), bao gồm MARID (2004) (*cộng với sự tiến tới hai cuộc thử nghiệm được IETF chấp thuận trong năm 2005 sau đó*), và DKIM (*DomainKeys - tạm dịch là "Chìa khóa tại vùng"*) trong năm 2006.

## Những bản RFC liên quan

## Xem thêm

* Những thông điệp bị trả lại (*Bounce messages*) (Những thông báo về các SMTP không được phân phát)
* Chứng thực thư điện tử (*E-mail authentication*)
* SMTP-AUTH (ESMTPA)
* SMTP mở rộng (*Extended SMTP - viết tắt là ESMTP*)

## Tham khảo

## Liên kết ngoài
* RFC2821 trong dạng thức HTML
* 2821bis - bản thảo (2005)
* Bảo an 2821 - bản thảo (2005)
* Kiến trúc thư tín trên Internet - bản thảo (2005)
* Sự truy cập và trách nhiệm trong việc gửi thư - bản thảo (2005)

### Kết nối tới cr.yp.to
* Quy ước dùng ký hiệu "#" trong mã hiệu thông báo tình trạng của hệ thống thư tín (''Mail System Status Codes - viết tắt là HCMSSC'')
* Cơ sở hạ tầng của thư tín trên Internet
* SMTP - Hướng dẫn sử dụng và tham chiếu
* Những công cụ trong cuộc chiến tranh chống sự sản sinh thư tín liên hoàn
* Những tuyến hồi âm phong bì đa dạng - (VERP)

### Liên kết khác
 
* Lược đồ trình tự SMTP  (PDF)
* Lược đồ diễn trình sự luân chuyển của thư điện tử  (PDF, PNG )
* Đề nghị về mã hiệu hồi âm báo nhũng lạm trong SMTP