SMTP is the protocol that is used for mail delivery on the Internet. For a detailed description of the protocol, please refer to RFC 2821, as well as Dave Crocker's introduction to Internet Mail Architecture.
Mail deliveries involve an SMTP transaction between the connecting host (client) and the receiving host (server). For this discussion, the connecting host is the peer, and the receiving host is your server.
In a typical SMTP transaction, the client issues SMTP commands such as EHLO, MAIL FROM:, RCPT TO:, and DATA. Your server responds to each command with a 3-digit numeric code indicating whether the command was accepted (2xx), was subject to a temporary failure or restriction (4xx), or failed definitively/permanently (5xx), followed by some human readable explanation. A full description of these codes is included in RFC 2821.
A best case scenario SMTP transaction typically consists of the following relevant steps:
Table 1-1. Simple SMTP dialogue
Client | Server | ||
---|---|---|---|
Initiates a TCP connection to server. |
Presents an SMTP banner - that is, a greeting that starts with the code 220 to indicate that it is ready to speak SMTP (or usually ESMTP, a superset of SMTP):
| ||
Introduces itself by way of an Hello command, either HELO (now obsolete) or EHLO, followed by its own Fully Qualified Domain Name:
|
Accepts this greeting with a 250 response. If the client used the extended version of the Hello command (EHLO), your server knows that it is capable of handling multi-line responses, and so will normally send back several lines indicating the capabilities offered by your server:
If the PIPELINING capability is included in this response, the client can from this point forward issue several commands at once, without waiting for the response to each one. | ||
Starts a new mail transaction by specifying the Envelope Sender:
|
Issues a 250 response to indicate that the sender is accepted. | ||
Lists the Envelope Recipients of the message, one at a time, using the command:
|
Issues a response to each command (2xx, 4xx, or 5xx, depending on whether delivery to this recipient was accepted, subject to a temporary failure, or rejected). | ||
Issues a DATA command to indicate that it is ready to send the message. |
Responds 354 to indicate that the command has been provisionally accepted. | ||
Transmits the message, starting with RFC 2822 compliant header lines (such as: From:, To:, Subject:, Date:, Message-ID:). The header and the body are separated by an empty line. To indicate the end of the message, the client sends a single period (".") on a separate line. |
Replies 250 to indicate that the message has been accepted. | ||
If there are more messages to be delivered, issues the next MAIL FROM: command. Otherwise, it says QUIT, or in rare cases, simply disconnects. |
Disconnects. |