IV. ĐẶC TẢ SMTP
1. Ngữ nghĩa lệnh:
Những lệnh SMTP định nghĩa sự truyền mail hay chức năng của hệ thống mail được yêu cầu bởi user. Những lệnh SMTP là những chuỗi ký tự kết thúc bằng <CRLF>. Bản thân mã lệnh là những ký tự chữ kết thúc bởi chuỗi <SP> nếu có những tham số theo sau và <CRLF> khác. Cú pháp của những mailbox phải tuân theo những thoả hiệp phía người nhận. Những reply SMTP được bàn đến trong phần B.
Một sự giao dịch mail bao gồm vài đối tượng dữ liệu được giao tiếp khi những đối số cho các lệnh khác nhau. Reverse-path là đối số của lệnh MAIL. Forward-path là đối số của lệnh RCPT. Và mail data là đối số của lệnh DATA. Ba đối số và những đối tượng dữ liệu được duy trì cho đến khi xác nhận truyền xong bởi sự chỉ định kết thúc của mail data thì thật sự kết thúc giao dịch. Mô hình cho nó là những buffer riêng biệt được cung cấp để giữ kiểu của đối tượng dữ liệu. Một số lệnh đặc trưng sinh ra thông tin được gắn vào một buffer đặc trưng, hay làm cho một hay nhiều buffer bị xoá.
HELLO (HELO) : Lệnh này dùng định danh Sender-SMTP đến Receiver-SMTP.
Trường đối số chứa host name của Sender-SMTP. Receiver-SMTP định danh nó đến Sender-SMTP trong trả lời bắt tay cho việc kết nối, và trong câu trả lời cho lệnh này.Lệnh này và một reply OK để xác nhận cả hai Sender-SMTP và Receiver-SMTP đang trong tình trạng khởi động, điều đó là: Không có một giao dịch mail nào đang tiến hành và tất cả các bảng trạng thái và buffer đã được xoá.
MAIL : Lệnh này được dùng khởi tạo một giao dịch mail trong đó mail data
được phân phối đến một hay nhiều mailbox. Feild đối số chứa một reverse-path. Reverse-path bao gồm một danh sách các host tuỳ ý và mailbox của user. Khi danh sách các host hoàn tất nó là một lộ trình nguồn “trở về” và chỉ định mail đó được chia ca thông qua mỗi host trên danh sách đó (host đầu tiên trong list là host chia ca gần nhất). List này được dùng như một lộ trình nguồn để trả về người gửi những thông báo không thể phân phát. Tại mỗi host chia ca nó thêm phần định danh của bản thân vào chổ bắt đầu của list đó và phải dùng tên của nó được biết trong IPCE nơi nó sẽ chia ca mail đến đó, đúng hơn là ICPE có mail đến từ đó (nếu chúng khác nhau). Trong một số loại message thông báo lỗi (ví dụ thông báo mail không thể phân phát) reverse-path có thể là null.
RECIPIENT (RCPT) : Lệnh này dùng định danh một người nhận mail riêng lẻ, nhiều recipient được đặc tả bằng nhiều lệnh này. Forward-path bao gồm một danh sách các host tuỳ ý và một mailbox đích được yêu cầu. Khi danh sách host đó hoàn tất. Nó là một lộ trình nguồn và chỉ định mail phải được chia ca đến host kế tiếp trên list đó. Nếu Receiver-SMTP không thực thi chức năng chia ca nó có thể dùng được reply này và sẽ cho một unknown local user (550). Khi mail được chia ca, host chia ca phải chuyển phần định danh nó từ chổ bắt đầu forward-path và đặt vào chổ bắt đầu của reverse-path. Khi mail trải ra tới đích cuối cùng (forward-path chỉ chứa một mailbox đích) receiver-SMTP chèn nó vào trong mailbox đích trong sự đồng ý với thoả hiệp host mail của nó.
Ví dụ mail được nhận tại host chia ca A với những đối số: FROM:<USERX@HOSTY.ARPA>
TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA> Sẽ được chia ca đến host B với đối số
FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA> TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.
Lệnh này sinh ra đối số forward-path của nó được gắn vào forward-path buffer. DATA(DATA) : Receiver-SMTP xử lý những dòng theo sau lệnh này khi mail từ
Sender-SMTP đến. Nó làm cho mail data từ lệnh này được ghi vào data buffer. Mail data này có thể chứa những ký tự của 128 mã ACSII. Data mail được kết thúc bằng một dòng chỉ chứa một dấu chấm. Đó là một dãy ký tự "<CRLF>. <CRLF>" (xem phần 4.D.2). Và đó là chỉ định kết thúc của mail data.
Sự chỉ định kết thúc một chuổi đòi hỏi người nhận phải xử lý việc lưu trữ những thông tin giao dịch mail ngay lập tức. Quá trình xử lý này dùng thông tin trong
reverse-path buffer, forward-path buffer, mail data buffer, và khi hoàn tất lệnh này
những buffer đó sẽ bị xóa, những message được chia ca sẽ có nhiều dòng đánh dấu thời gian.
Khi một Receiver-SMTP tạo ra “final delivery” của một message nó chèn vào chổ bắt đầu của mail data một dòng return-path. Dòng return-path đó bảo quản thông tin trong “reverse-path” từ lệnh mail. Ơ đây deliver final có nghĩa là message đó rời khỏi thế giới SMTP. Thông thường có nghĩa là nó đã được chuyển đến user đích, nhưng trong một số trường hợp nó có thể được xử lý nữa và và được giao chuyển bởi hệ thống mail khác.
Có thể cho mailbox trong return-path là khác biệt với mailbox thật sự của Sender-SMTP, ví dụ như nếu những trả lời error được dùng phân phát một lỗi đặc biệt điều khiển mailbox.
Hai đoạn trước ý nói mail data cuối cùng sẽ bắt đầu với một dòng return-path theo sau là một hay nhiều dòng đánh dấu thời gian , sau những dòng này sẽ là phần header và body của mail data [2].
Sự đề cập đặc biệt cần thiết cho sự trả lời (response) và sự hành động tiếp nữa
được yêu cầu khi quá trình xữ lý theo sau sự chỉ định kết thúc mail data là sự thành công cục bộ. Điều này có thể phát sinh nếu sau khi chấp nhận một vài người nhận và data mail của receiver-SMTP thấy mail data đó có thể được phân phát đến một số người thành công nhưng lại không thể đến những người khác (ví dụ như xảy ra vấn đề về việc chỉ định vị trí của mailbox). Trong tình trạng như vậy câu trả lời cho lệnh
DATA phải là một reply OK. Nhưng receiver-SMTP phải soạn và gửi về nơi xuất xứ của message đó một message thông báo “undelivered mail”. Một thông báo đơn liệt kê tất cả các recipient không nhận được message, hay những message thông báo riêng lẽ phải được gửi cho từng recipient một , tất cả những thông báo mail không thể phân phát được gửi dùng lệnh MAIL (ngay cả nếu kết quả đó từ quá trình xử lý một lệnh SEND, SOML, hay SAML ).
Ví dụ cho đường dẫn trả về và nhận đánh dấu thời gian nhận:
Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA> Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST
Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST Date: 27 Oct 81 15:01:01 PST
From: JOE@ABC.ARPA
Subject: Improved Mailing System Installed
To: SAM@JKL.ARPA This is to inform you that ...
SEND (SEND) : Lệnh này dùng khởi tạo một giao dịch mail trong đó mail data được phân phát đến một hay nhiều terminal. Trường đối số chứa một reverse- path. Lệnh này thành công nếu message được phân phát đến một terminal. Reverse-path bao gồm một list các host và mailbox người gửi tuỳ ý khi list đó hoàn tất, nó là một lộ trình nguồn “trở về” và chỉ định mail đã được chia ca thông qua các host trong list đó (host đầu tiên trong list là host chia ca gần nhất) danh sách này được dùng như một lộ trình nguồn để trả về cho người gửi những thông báo về việc không phân phát được. Khi mỗi host chia ca thêm phần định danh vào trong vị trí bắt đầu của list , nó phải dùng tên mà nó được biết đến trong IPCE nơi nó sẽ chia ca mail tới đó , đúng hơn là IPCE có mail tới từ đó.
Lệnh này xoá reverse-path buffer, forward-path buffer và mail data buffer và chèn thông tin reverse-path từ lệnh này vào trong reverse-path buffer.
END OR MAIL (SOML) : Lệnh này dùng khởi tạo một giao dịch mail trong đó
mail data được phân phát đến một hay nhiều terminal hay mailbox. Cho từng recipient, data mail được phân phát đến terminal của người nhận nếu người nhận đó đang hoạt động trên host đó (và chấp nhận những terminal message ), mặt khác là đến mailbox của những người nhận đó. Trường đối số chứa một reverse-
path . Lệnh này thành công khi message được phân phát đến một terminal hay
mailbox.
Reverse-path bao gồm một danh sách các host tuỳ ý và mailbox của người gửi. Khi danh sách các host đó hoàn tất, nó là một lộ trình nguồn “trở về” và chỉ định mail đó đã được chia ca thông qua các host trên danh sách (host đầu tiên trong danh sách là host chia ca gần nhất). Danh sách này được dùng như một lộ trình nguồn trả về cho người gửi những thông báo về việc không thể phân phát. Khi mỗi host chia ca thêm phần định danh nó vào chổ bắt đầu của danh sách đó, nó phải dùng tên được biết đến trong IPCE nơi nó sẽ chia ca mail đến đó đúng hơn là IPCE có mail đến từ đó(nếu chúng khác nhau).
Lệnh này xoá reverse-path buffer, forward-path buffer và mail data buffer và chèn thông tin reverse-path từ lệnh này vào trong reverse-path buffer.
SEND AND MAIL (SAML) : Lệnh này dùng khởi tạo một giao dịch mail trong đó mail data được phân phát đến một hay nhiều terminal và các mailbox. Cho từng người nhận mail được phân phát đến terminal của người nhận nếu người nhận đó đang hoạt động trên host đó (và chấp nhận những terminal message ) và cho tất cả recipient thì đến mailbox của các recipient đo. Trường đối số chứa một reverse-path. Lệnh này thành công khi message được phân phát đến mailbox.
Reverse-path bao gồm một danh sách các host tuỳ ý và mailbox của người gửi. Khi danh sách hoàn tất nó là một lộ trình nguồn “trở về” và chỉ định mail đã được chia ca thông qua các host trong danh sách đó(host đầu tiên trong danh sách là host chia ca gần nhất ) Danh sách này được dùng như một lộ trình nguồn trả về cho người gửi những thông báo về việc không thể phân phát. Khi mỗi host chia ca thêm phần định danh nó vào chổ bắt đầu của danh sách đó nó phải dùng tên mà nó được biết đến trong IPCE mà nó sẽ chia ca mail đến đó đúng hơn là IPCE mà mail đến từ đó (nếu chúng khác nhau).
Lệnh này xoá reverse-path buffer, forward-path buffer và mail data buffer và chèn thông tin reverse-path từ lệnh này vào trong reverse-path buffer.
RESET (RSET) : Lệnh này định rõ giao dịch mail hiện hành bị huỷ bỏ. Các người gửi, recipient, mail data đã lưu sẽ bị huỷ bỏ và tất cả các bảng trạng thái, các buffer bị xoá. Receiver phải gửi một reply OK.
VERIFY (VRFY) : Lệnh này yêu cầu receiver xác nhận đối số định danh một
user. Nếu nó là một user name, full name của user đó (nếu receiver biết) và mailbox đặc tả đầy đủ được trả về.Lệnh này không ảnh hưởng đến reverse-path buffer, forward-path buffer và data mail buffer.
EXPAND (EXPN) : Lệnh này yêu cầu receiver xác nhận một mailing list (danh
sách địa chỉ) và trả về một thành phần trong danh sách đó. Full name của các user (nếu biết) và những mailbox được đặc tả đầy đủ được trả về trong một reply nhiều dòng.
Lệnh này không ảnh hưởng đến reverse-path buffer, forward-path buffer và data mail buffer.
HELP (HELP) : Lệnh này làm cho receiver thông tin giúp đỡ cho người gửi lệnh HELP. Lệnh này có thể nhận một đối số (có thể là tên lệnh) và trả về thông tin chi tiết.
Lệnh này không ảnh hưởng đến reverse-path buffer, forward-path buffer và data mail buffer.
NOOP (NOOP) : Lệnh này không ảnh hưởng các tham số hay các lệnh được đưa
vào trước nó, nó đặc tả không có một hành động nào khác hơn là receiver gửi một reply OK.
Lệnh này không ảnh hưởng đến reverse-path buffer, forward-path buffer và data mail buffer.
QUIT (QUIT) : Lệnh này định rõ receiver phải gửi một reply OK và sau đó đóng kênh giao dịch . Receiver sẽ không đóng kênh giao dịch cho đến khi nó nhận và trả lời cho lệnh QUIT (ngay cả nếu có một lỗi xãy ra). Người gửi sẽ không đóng kênh giao dịch cho đến khi nó gửi một lệnh QUIT và nhận reply đó (ngay cả nếu có một lỗi trả lời cho lệnh trước đó). Nếu kết nối bị đóng trước thời gian mong muốn receiver sẽ làm việc như vừa nhận được một lệnh RSET (bỏ tất cả các giao dịch đang treo mà chưa làm, nhưng không “undo” những giao dịch đã hoàn tất
trước đó) người gửi sẽ hành động như nếu lệnh hay giao dịch đó trong quá trình xử lý nhận được một lỗi tạm thời (4xx).
TURN (TURN) : Lệnh này định rõ Receiver-SMTP phải gửi một trong hai reply sau: (1) reply OK và sau đó nhận vai trò của một Sender-SMTP, hay (2) gửi một reply từ chối và giữ lại vai trò một Receiver-SMTP.
Nếu program-A hiện tại là một Sender-SMTP gửi một lệnh TURN và nhận một reply OK (250) thì program-A trở thành Receiver-SMTP sau đó program-A sẽ trong trạng thái khởi động chỉ nếu kênh giao chuyển đã được mở, sau đó nó chờ nhận một chào hỏi dịch vụ đã sẵn sàng 220.
Để từ chối thay đổi vai trò Receiver-SMTP gửi một reply 502. Có sự hạn chế trong trật tự khi dùng những lệnh này.
Đầu tiên trong một cuộc trao đổi phải là lệnh HELLO, lệnh này có thể được dùng sau đó trong một cuộc trao đổi khác. Nếu đối số trong lệnh HELLO không được chấp nhận một reply failure 501 phải được trả về và Receiver-SMTP đó phải ở trong trạng cũ.
Những lệnh NOOP, HELP, EXPAND và VRFY có thể được dùng nhiều lần trong một cuộc giao dịch.
Các lệnh MAIL, SEND, SOML, và SAML bắt đầu một giao dịch mail. Khi bắt đầu một giao dịch mail bao gồm một lệnh khởi tạo giao dịch , một hay nhiều lệnh RCPT, và một lệnh DATA đó là một trật tự . một giao dịch mail có thể được bỏ qua bởi một lệnh RSET có thể có hay không có nhiều giao dịch trong một cuộc trao đổi (session).
Nếu đối số của lệnh khởi động giao dịch không thể chấp nhận một reply failure 501 phải được trả về và Sender-SMTP phải nằm trong trạng thái cũ. Nếu những lệnh trong cuộc giao dịch không đúng trật tự một reply failure 503 được trả về và Receiver-SMTP đó phải nằm trong trạng thái cũ.
Lệnh cuối cùng trong cuộc trao đổi phải là lệnh QUIT và lệnh QUIT không thể được dùng nhiều lần trong một cuộc trao đổi.