Finish a transaction with LAST and respect its boundaries
03Each successful chunk receives a 250 reply. LAST identifies the final chunk; it is a BDAT parameter, not a separate command or a count of the whole message.
Separate reset to an unfinished BDAT transaction: the sender issues DATA. The receiver returns 503 and the transaction needs RSET. Changing the transfer verb mid-message is not a repair.
Source for this drawing: RFC 3030 · Read RFC section 2 ↗
New to this? Start hereA quick picture + helpful background
A message needs an address.
Think of a packet as a small addressed envelope. Devices pass it onward; transport protocols decide what delivery promises an application gets.
Helpful first, if these ideas are unfamiliar
These pictures are analogies to help you learn. The linked RFC explains the actual rules.
Terms in this drawing
Related RFCs and changes
“Updates” changes part of an earlier RFC. “Obsoletes” replaces it. This list shows selected related documents.
The first chunk description is missing a zero: BDAT 100000 carries 100000 octets, then 324, then zero LAST. The declared command stays 100000.
Read the updated RFC section ↗A 250 response MUST be sent for each successful BDAT block. A non-LAST acknowledgement is not acceptance of the complete message.
- A 250 response MUST be sent for each successful BDAT block. A non-LAST acknowledgement is not acceptance of the complete message.
- The last BDAT MAY have count zero. The worked example follows verified erratum 349: chunks of 100000 and 324 octets, followed by BDAT 0 LAST, total 100324.
- An additional BDAT after BDAT LAST, before a new transaction, is illegal and MUST receive 503. Its error state is indeterminate; RSET MUST clear it before continuing.
- DATA and BDAT cannot mix in one transaction. DATA after BDAT MUST receive 503 and requires RSET. They can be used in different transactions of the same session.
Fictional example.com mail peers. Counts and byte excerpts are illustrative, not a full MIME message or a deployment configuration. Separate comparisons reset state. This companion is not an SMTP parser or implementation.
Read the RFC section ↗