RFC 3030 PROPOSED STANDARD EMAIL · SMTP · MIME

SMTP Chunking: SMTP Service Extensions for Transmission of Large and Binary MIME Messages

Two SMTP extensions: send mail in length-prefixed chunks with BDAT, and send raw binary MIME with no text encoding.

On rfc-editor.org ↗
PUBLISHED
December 2000
AUTHORS
G. Vaudreuil
ORG
Lucent
STREAM
Legacy
BUILDS ON
RFC 1830 — SMTP Large and Binary
CHUNKING EXTENSION NAME
CHUNKING
BINARY EXTENSION NAME
BINARYMIME
BDAT SYNTAX
BDAT SP chunk-size [ SP end-marker ] CR LF
END-MARKER VALUE
LAST
BODY-VALUE SYNTAX
7BIT / 8BITMIME / BINARYMIME
MAIL FROM LINE LENGTH INCREASE
16 characters
DOI
10.17487/RFC3030
ERRATA
Reported errata

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                                       G. Vaudreuil
Request for Comments: 3030                           Lucent Technologies
Obsolete: 1830                                             December 2000
Category: Standards Track


                        SMTP Service Extensions
                       for Transmission of Large
                        and Binary MIME Messages

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Copyright Notice

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

Abstract

   This memo defines two extensions to the SMTP (Simple Mail Transfer
   Protocol) service.  The first extension enables a SMTP client and
   server to negotiate the use of an alternative to the DATA command,
   called "BDAT", for efficiently sending large MIME (Multipurpose
   Internet Mail Extensions) messages.  The second extension takes
   advantage of the BDAT command to permit the negotiated sending of
   MIME messages that employ the binary transfer encoding.  This
   document is intended to update and obsolete RFC 1830.

Working Group Summary

   This protocol is not the product of an IETF working group, however
   the specification resulted from discussions within the ESMTP working
   group.  The resulting protocol documented in RFC 1830 was classified
   as experimental at that time due to questions about the robustness of
   the Binary Content-Transfer-Encoding deployed in then existent MIME
   implementations.  As MIME has matured and other uses of the Binary
   Content-Transfer-Encoding have been deployed, these concerns have
   been allayed.  With this document, Binary ESMTP is expected to become
   standards-track.

Document Conventions

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in RFC 2119 [RFC2119].

Table of Contents

   1.   Overview ...................................................  2
   2.   Framework for the Large Message Extensions .................  3
   3.   Framework for the Binary Service Extension .................  5
   4.   Examples ...................................................  8
     4.1  Simple Chunking ..........................................  8
     4.2  Pipelining BINARYMIME ....................................  8
   5.   Security Considerations ....................................  9
   6.   References .................................................  9
   7.   Author's Address ........................................... 10
   8.   Appendix A - Changes from RFC 1830 ......................... 11
   9.   Full Copyright Statement ................................... 12

1. Overview

   The MIME extensions to the Internet message format provides for the
   transmission of many kinds of data that were previously unsupported
   in Internet mail.  Anticipating the need to transport the new media
   more efficiently, the SMTP protocol has been extended to provide
   transport for new message types.  RFC 1652 defines one such extension
   for the transmission of unencoded 8-bit MIME messages [8BIT].  This
   service extension permits the receiver SMTP to declare support for
   8-bit body parts and the sender to request 8-bit transmission of a
   particular message.

   One expected result of the use of MIME is that the Internet mail
   system will be expected to carry very large mail messages.  In such
   transactions, there is a performance-based desire to eliminate the
   requirement that the message be scanned for "CR LF . CR LF" sequences
   upon sending and receiving to detect the end of message.

   Independent of the need to send large messages, Internet mail is
   increasingly multimedia.  There is a need to avoid the overhead of
   base64 and quoted-printable encoding of binary objects sent using the
   MIME message format over SMTP between hosts that support binary
   message processing.

   This memo uses the mechanism defined in [ESMTP] to define two
   extensions to the SMTP service whereby an SMTP server ("receiver-
   SMTP") may declare support for the message chunking transmission mode
   and support for the reception of Binary messages, which the SMTP
   client ("sender-SMTP") is then free to use.

2. Framework for the Large Message Extensions

   The following service extension is hereby defined:

   1) The name of the data chunking service extension is "CHUNKING".

   2) The EHLO keyword value associated with this extension is
      "CHUNKING".

   3) A new SMTP verb, BDAT, is defined as an alternative to the "DATA"
      command of [RFC821].  The BDAT verb takes two arguments.  The
      first argument indicates the length, in octets, of the binary data
      chunk.  The second optional argument indicates that the data chunk
      is the last.

      bdat-cmd   ::= "BDAT" SP chunk-size [ SP end-marker ] CR LF
      chunk-size ::= 1*DIGIT
      end-marker ::= "LAST"

   4) This extension may be used for SMTP message submission.  [Submit]

   5) Servers that offer the BDAT extension MUST continue to support the
      regular SMTP DATA command.  Clients are free to use DATA to
      transfer appropriately encoded to servers that support the
      CHUNKING extension if they wish to do so.

   The CHUNKING service extension enables the use of the BDAT
   alternative to the DATA command.  This extension can be used for any
   message, whether 7-bit, 8BITMIME or BINARYMIME.

   When a sender-SMTP wishes to send (using the MAIL command) a large
   message using the CHUNKING extension, it first issues the EHLO
   command to the receiver-SMTP.  If the receiver-SMTP responds with
   code 250 to the EHLO command and the response includes the EHLO
   keyword value CHUNKING, then the receiver-SMTP is indicating that it
   supports the BDAT command and will accept the sending of messages in
   chunks.

   After all MAIL and RCPT responses are collected and processed, the
   message is sent using a series of BDAT commands.  The BDAT command
   takes one required argument, the exact length of the data segment in
   octets.  The message data is sent immediately after the trailing <CR>
   <LF> of the BDAT command line.  Once the receiver-SMTP receives the
   specified number of octets, it will return a 250 reply code.

   The optional LAST parameter on the BDAT command indicates that this
   is the last chunk of message data to be sent.  The last BDAT command
   MAY have a byte-count of zero indicating there is no additional data
   to be sent.  Any BDAT command sent after the BDAT LAST is illegal and
   MUST be replied to with a 503 "Bad sequence of commands" reply code.
   The state resulting from this error is indeterminate.  A RSET command
   MUST be sent to clear the transaction before continuing.

   A 250 response MUST be sent to each successful BDAT data block within
   a mail transaction.  If a failure occurs after a BDAT command is
   received, the receiver-SMTP MUST accept and discard the associated
   message data before sending the appropriate 5XX or 4XX code.  If a
   5XX or 4XX code is received by the sender-SMTP in response to a BDAT
   chunk, the transaction should be considered failed and the sender-
   SMTP MUST NOT send any additional BDAT segments.  If the receiver-
   SMTP has declared support for command pipelining [PIPE], the receiver
   SMTP MUST be prepared to accept and discard additional BDAT chunks
   already in the pipeline after the failed BDAT.

      Note: An error on the receiver-SMTP such as disk full or imminent
      shutdown can only be reported after the BDAT segment has been
      received.  It is therefore important to choose a reasonable chunk
      size given the expected end-to-end bandwidth.

      Note:  Because the receiver-SMTP does not acknowledge the BDAT
      command before the message data is sent, it is important to send
      the BDAT only to systems that have declared their capability to
      accept BDAT commands.  Illegally sending a BDAT command and
      associated message data to a non-CHUNKING capable system will
      result in the receiver-SMTP parsing the associated message data as
      if it were a potentially very long, ESMTP command line containing
      binary data.

   The resulting state from a failed BDAT command is indeterminate.  A
   RSET command MUST be issued to clear the transaction before
   additional commands may be sent.  The RSET command, when issued after
   the first BDAT and before the BDAT LAST, clears all segments sent
   during that transaction and resets the session.

   DATA and BDAT commands cannot be used in the same transaction.  If a
   DATA statement is issued after a BDAT for the current transaction, a
   503 "Bad sequence of commands" MUST be issued.  The state resulting
   from this error is indeterminate.  A RSET command MUST be sent to
   clear the transaction before continuing.  There is no prohibition on
   using DATA and BDAT in the same session, so long as they are not
   mixed in the same transaction.

   The local storage size of a message may not accurately reflect the
   actual size of the message sent due to local storage conventions.  In
   particular, text messages sent with the BDAT command MUST be sent in
   the canonical MIME format with lines delimited with a <CR><LF>.  It
   may not be possible to convert the entire message to the canonical
   format at once.  CHUNKING provides a mechanism to convert the message
   to canonical form, accurately count the bytes, and send the message a
   single chunk at a time.

      Note: Correct byte counting is essential.  If the sender-SMTP
      indicates a chunk-size larger than the actual chunk-size, the
      receiver-SMTP will continue to wait for the remainder of the data
      or when using streaming, will read the subsequent command as
      additional message data.  In the case where a portion of the
      previous command was read as data, the parser will return a syntax
      error when the incomplete command is read.

      If the sender-SMTP indicates a chunk-size smaller than the actual
      chunk-size, the receiver-SMTP will interpret the remainder of the
      message data as invalid commands.  Note that the remainder of the
      message data may be binary and as such lexicographical parsers
      MUST be prepared to receive, process, and reject lines of
      arbitrary octets.

3. Framework for the Binary Service Extension

   The following service extension is hereby defined:

   1) The name of the binary service extension is "BINARYMIME".

   2) The EHLO keyword value associated with this extension is
      "BINARYMIME".

   3) The BINARYMIME service extension can only be used with the
      "CHUNKING" service extension.

   4) No parameter is used with the BINARYMIME keyword.

   5) [8BIT] defines the BODY parameter for the MAIL command.  This
      extension defines an additional value for the BODY parameter,
      "BINARYMIME".  The value "BINARYMIME" associated with this
      parameter indicates that this message is a Binary MIME message (in
      strict compliance with [MIME]) with arbitrary octet content being
      sent.  The revised syntax of the value is as follows, using the
      ABNF notation of [RFC822]:

               body-value ::= "7BIT" / "8BITMIME" / "BINARYMIME"

   6) No new verbs are defined for the BINARYMIME extension.

   7) This extension may be used for SMTP message submission.  [Submit]

   8) The maximum length of a MAIL FROM command line is increased by 16
      characters by the possible addition of the BODY=BINARYMIME keyword
      and value;.

   A sender-SMTP may request that a binary MIME message be sent without
   transport encoding by sending a BODY parameter with a value of
   "BINARYMIME" with the MAIL command.  When the receiver-SMTP accepts a
   MAIL command with the BINARYMIME body-value, it agrees to preserve
   all bits in each octet passed using the BDAT command.  Once a
   receiver-SMTP supporting the BINARYMIME service extension accepts a
   message containing binary material, the receiver-SMTP MUST deliver or
   relay the message in such a way as to preserve all bits in each
   octet.

   BINARYMIME cannot be used with the DATA command.  If a DATA command
   is issued after a MAIL command containing the body-value of
   "BINARYMIME", a 503 "Bad sequence of commands" response MUST be sent.
   The resulting state from this error condition is indeterminate and
   the transaction MUST be reset with the RSET command.

   It is especially important when using BINARYMIME to ensure that the
   MIME message itself is properly formed.  In particular, it is
   essential that text be canonically encoded with each line properly
   terminated with <CR><LF>.  Any transformation of text into non-
   canonical MIME to observe local storage conventions MUST be reversed
   before sending as BINARYMIME.  Some line-oriented shortcuts will
   break if used with BINARYMIME.  A sender-SMTP MUST use the canonical
   encoding for a given MIME content-type.  In particular, text/* MUST
   be sent with <CR><LF> terminated lines.

   Note: Although CR and LF do not necessarily represent ends of text
   lines in BDAT chunks and use of the binary transfer encoding is
   allowed, the RFC 2781 prohibition against using a UTF-16 charset
   within the text top-level media type remains.

   The syntax of the extended MAIL command is identical to the MAIL
   command in [RFC821], except that a BODY=BINARYMIME parameter and
   value MUST be added.  The complete syntax of this extended command is
   defined in [ESMTP].

   If a receiver-SMTP does not indicate support the BINARYMIME message
   format then the sender-SMTP MUST NOT, under any circumstances, send
   binary data.

   If the receiver-SMTP does not support BINARYMIME and the message to
   be sent is a MIME object with a binary encoding, a sender-SMTP has
   three options with which to forward the message.  First, if the
   receiver-SMTP supports the 8bit-MIMEtransport extension [8bit] and
   the content is amenable to being encoded in 8bit, the sender-SMTP may
   implement a gateway transformation to convert the message into valid
   8bit-encoded MIME.  Second, it may implement a gateway transformation
   to convert the message into valid 7bit-encoded MIME.  Third, it may
   treat this as a permanent error and handle it in the usual manner for
   delivery failures.  The specifics of MIME content-transfer-encodings,
   including transformations from Binary MIME to 8bit or 7bit MIME are
   not described by this RFC; the conversion is nevertheless constrained
   in the following ways:

      1. The conversion MUST cause no loss of information;  MIME
         transport encodings MUST be employed as needed to insure this
         is the case.

      2. The resulting message MUST be valid 7bit or 8bit MIME.  In
         particular, the transformation MUST NOT result in nested Base-
         64 or Quoted-Printable content-transfer-encodings.

   Note that at the time of this writing there are no mechanisms for
   converting a binary MIME object into an 8-bit MIME object.  Such a
   transformation will require the specification of a new MIME content-
   transfer-encoding.

   If the MIME message contains a "Binary" content-transfer-encoding and
   the BODY parameter does not indicate BINARYMIME, the message MUST be
   accepted.  The message SHOULD be returned to the sender with an
   appropriate DSN.  The message contents MAY be returned to the sender
   if the offending content can be mangled into a legal DSN structure.
   "Fixing" and forwarding the offending content is beyond the scope of
   this document.

4. Examples

4.1 Simple Chunking

   The following simple dialogue illustrates the use of the large
   message extension to send a short pseudo-RFC 822 message to one
   recipient using the CHUNKING extension:

   R: <wait for connection on TCP port 25>
   S: <open connection to server>
   R: 220 cnri.reston.va.us SMTP service ready
   S: EHLO ymir.claremont.edu
   R: 250-cnri.reston.va.us says hello
   R: 250 CHUNKING
   S: MAIL FROM:<Sam@Random.com>
   R: 250 <Sam@Random.com> Sender ok
   S: RCPT TO:<Susan@Random.com>
   R: 250 <Susan@random.com> Recipient ok
   S: BDAT 86 LAST
   S: To: Susan@random.com<CR><LF>
   S: From: Sam@random.com<CR><LF>
   S: Subject: This is a bodyless test message<CR><LF>
   R: 250 Message OK, 86 octets received
   S: QUIT
   R: 221 Goodbye

4.2 Pipelining BINARYMIME

   The following dialogue illustrates the use of the large message
   extension to send a BINARYMIME object to two recipients using the
   CHUNKING and PIPELINING extensions:

   R: <wait for connection on TCP port
   S: <open connection to server>
   R: 220 cnri.reston.va.us SMTP service ready
   S: EHLO ymir.claremont.edu
   R: 250-cnri.reston.va.us says hello
   R: 250-PIPELINING
   R: 250-BINARYMIME
   R: 250 CHUNKING
   S: MAIL FROM:<ned@ymir.claremont.edu> BODY=BINARYMIME
   S: RCPT TO:<gvaudre@cnri.reston.va.us>
   S: RCPT TO:<jstewart@cnri.reston.va.us>
   R: 250 <ned@ymir.claremont.edu>... Sender and BINARYMIME ok
   R: 250 <gvaudre@cnri.reston.va.us>... Recipient ok
   R: 250 <jstewart@cnri.reston.va.us>... Recipient ok
   S: BDAT 100000
   S: (First 10000 octets of canonical MIME message data)
   S: BDAT 324
   S: (Remaining 324 octets of canonical MIME message data)
   S: BDAT 0 LAST
   R: 250 100000 octets received
   R: 250 324 octets received
   R: 250 Message OK, 100324 octets received
   S: QUIT
   R: 221 Goodbye

5. Security Considerations

   This extension is not known to present any additional security issues
   not already endemic to electronic mail and present in fully
   conforming implementations of [RFC821], or otherwise made possible by
   [MIME].

6. References

   [BINARY]  Vaudreuil, G., "SMTP Service Extensions for Transmission of
             Large and Binary MIME Messages", RFC 1830, August 1995.

   [RFC821]  Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC
             821, August 1982.

   [RFC822]  Crocker, D., "Standard for the Format of ARPA Internet Text
             Messages", STD 11, RFC 822, August 1982.

   [MIME]    Borenstein, N. and N. Freed, "Multipurpose Internet Mail
             Extensions (MIME) Part One: Format of Internet Message
             Bodies", RFC 2045, November 1996.

   [SUBMIT]  Gellens, R. and J. Klensin, "Message Submission", RFC 2476,
             December 1998.

   [ESMTP]   Klensin, J., Freed, N., Rose, M., Stefferud, E. and D.
             Crocker, "SMTP Service Extensions", RFC 1869, November
             1995.

   [8BIT]    Klensin, J., Freed, N., Rose, M., Stefferud, E. and D.
             Crocker, "SMTP Service Extension for 8bit-MIMEtransport",
             RFC 1652, July 1994.

   [PIPE]    Freed, N., "SMTP Service Extensions for Command
             Pipelining", RFC 2920, September 2000.

   [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
             Requirement Levels", BCP 14, RFC 2119, March 1997.

7. Author's Address

   Gregory M. Vaudreuil
   Lucent Technologies
   17080 Dallas Parkway
   Dallas, TX 75248-1905

   Phone/Fax: +1-972-733-2722
   EMail: GregV@ieee.org

Appendix A - Changes from RFC 1830

   Numerous editorial changes including required intellectual property
   boilerplate and revised authors contact information

   Corrected the simple chunking example to use the correct number of
   bytes.  Updated the pipelining example to illustrate use of the BDAT
   0 LAST construct.

Full Copyright Statement

   Copyright (C) The Internet Society (2000).  All Rights Reserved.

   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.

   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.

   This document and the information contained herein is provided on an
   "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Acknowledgement

   Funding for the RFC Editor function is currently provided by the
   Internet Society.

ISO Plain Language

On this page
PROBLEMThe DATA command ends a message with a line containing only a dot, so both ends have to scan the message for that sequence, and the sender has to say how much data is coming only by ending the transfer. Sending binary attachments also costs a base64 or quoted-printable encoding that inflates the message.
MECHANISMThe CHUNKING extension adds a BDAT command whose first argument is the exact length in octets of the data that follows, with an optional LAST marker. The BINARYMIME extension adds a BODY=BINARYMIME value to MAIL, which tells the receiver to preserve every bit in each octet.
WHY IT MATTERSLarge messages can be sent and counted without scanning for the end of data, and binary MIME content can travel unencoded between hosts that support it. The RFC obsoletes RFC 1830.

§1Why Two Extensions

The MIME extensions to the Internet message format provide for the transmission of many kinds of data that were previously unsupported in Internet mail. Anticipating the need to transport the new media more efficiently, the SMTP protocol has been extended to provide transport for new message types. RFC 1652 defines one such extension for the transmission of unencoded 8-bit MIME messages, allowing the receiver SMTP to declare support for 8-bit body parts and the sender to request 8-bit transmission of a particular message.

One expected result of the use of MIME is that the Internet mail system will be expected to carry very large mail messages. In such transactions there is a performance-based desire to eliminate the requirement that the message be scanned for "CR LF . CR LF" sequences upon sending and receiving, to detect the end of the message.

Independent of the need to send large messages, Internet mail is increasingly multimedia. There is a need to avoid the overhead of base64 and quoted-printable encoding of binary objects sent using the MIME message format over SMTP between hosts that support binary message processing.

The memo uses the mechanism defined in RFC 1869 to define two extensions to the SMTP service, whereby a receiver SMTP may declare support for the message chunking transmission mode and for the reception of Binary messages, which the sender SMTP is then free to use. The Working Group Summary records that the protocol in RFC 1830 was classified as experimental at the time because of questions about the robustness of the Binary Content-Transfer-Encoding in the MIME implementations of the day, and that as MIME has matured and other uses of that encoding have been deployed, those concerns have been allayed.

SMTP normally ends a message with a line holding a single dot, and both sides have to scan the whole message looking for it. This RFC adds a command that states the exact length of the data that follows, so large messages need no scanning. It also lets a sender send binary content without the text encoding that would otherwise inflate it.

§2The CHUNKING Extension and the BDAT Command

The CHUNKING service extension is defined with the name "CHUNKING" and the EHLO keyword value "CHUNKING". A new SMTP verb, BDAT, is defined as an alternative to the DATA command of RFC 821. It takes two arguments: the length in octets of the binary data chunk, and an optional second argument indicating that the data chunk is the last. The syntax is bdat-cmd ::= "BDAT" SP chunk-size [ SP end-marker ] CR LF, chunk-size ::= 1*DIGIT and end-marker ::= "LAST". Servers that offer the BDAT extension MUST continue to support the regular DATA command.

When a sender wants to send a large message using the extension, it first issues EHLO. If the receiver replies with code 250 and the response includes the EHLO keyword value CHUNKING, the receiver is saying it supports BDAT and will accept messages in chunks. After all MAIL and RCPT responses are collected and processed, the message is sent as a series of BDAT commands. The message data is sent immediately after the trailing CR LF of the BDAT command line, and once the receiver has the specified number of octets it returns a 250 reply code.

The optional LAST parameter marks the last chunk of message data. The last BDAT command MAY have a byte count of zero, indicating there is no additional data. Any BDAT command sent after the BDAT LAST is illegal and MUST be replied to with a 503 "Bad sequence of commands" reply code; the resulting state is indeterminate and a RSET command MUST be sent to clear the transaction before continuing. A 250 response MUST be sent to each successful BDAT data block. If a failure occurs after a BDAT command is received, the receiver MUST accept and discard the associated message data before sending the appropriate 5XX or 4XX code. If the receiver has declared support for command pipelining, it MUST be prepared to accept and discard additional BDAT chunks already in the pipeline after the failed one.

The RFC adds two notes about failure. An error on the receiver such as a full disk can only be reported after the BDAT segment has been received, so it is important to choose a reasonable chunk size given the expected end-to-end bandwidth. And because the receiver does not acknowledge the BDAT command before the message data is sent, it is important to send BDAT only to systems that have declared the capability: sending it to a non-CHUNKING capable system will make the receiver parse the message data as if it were a very long ESMTP command line containing binary data.

DATA and BDAT commands cannot be used in the same transaction. If a DATA statement is issued after a BDAT for the current transaction, a 503 "Bad sequence of commands" MUST be issued, the state is indeterminate, and a RSET must clear the transaction. There is no prohibition on using DATA and BDAT in the same session, so long as they are not mixed in the same transaction.

The RFC also explains why chunking helps with counting. The local storage size of a message may not accurately reflect the actual size of the message sent, due to local storage conventions, and text messages sent with BDAT MUST be sent in the canonical MIME format with lines delimited by CR LF. It may not be possible to convert the entire message to canonical form at once, and CHUNKING provides a mechanism to convert the message to canonical form, accurately count the bytes, and send the message a single chunk at a time.

Correct byte counting is essential. If the sender indicates a chunk size larger than the actual chunk, the receiver will wait for the remainder of the data, or, when streaming, will read the subsequent command as additional message data, and the parser will return a syntax error when the incomplete command is read. If the sender indicates a chunk size smaller than the actual chunk, the receiver will interpret the remainder of the message data as invalid commands, and the remainder may be binary, so lexicographical parsers MUST be prepared to receive, process and reject lines of arbitrary octets.

The new command is BDAT, and it says how many bytes follow before the bytes start. The receiver counts them off and replies once the block has arrived. The sender marks the final block with the word LAST, and may use a count of zero for it. The command can only be used with servers that have advertised it.

TWO WAYS TO END AN SMTP MESSAGE
AspectDATABDAT
How the end is markedA line holding only a dotThe LAST argument on the command
How the size is known THIS RFCNot stated; both sides scan for the dotThe chunk-size argument states the exact octets
ReplyOne reply after the whole messageOne 250 reply per chunk

§3The BINARYMIME Extension

The BINARYMIME service extension is defined with the name "BINARYMIME" and the EHLO keyword value "BINARYMIME". It can only be used with the CHUNKING service extension, no parameter is used with the keyword, and no new verbs are defined for it. It may be used for SMTP message submission.

RFC 1652 defines the BODY parameter for the MAIL command, and this extension adds a value to it, "BINARYMIME", so that the body-value syntax becomes body-value ::= "7BIT" / "8BITMIME" / "BINARYMIME". The value indicates that the message is a Binary MIME message, in strict compliance with MIME, with arbitrary octet content being sent. The maximum length of a MAIL FROM command line is increased by 16 characters by the possible addition of the BODY=BINARYMIME keyword and value.

A sender may request that a binary MIME message be sent without transport encoding by sending a BODY parameter with the value BINARYMIME with the MAIL command. When the receiver accepts a MAIL command with that body-value, it agrees to preserve all bits in each octet passed using the BDAT command. Once a receiver supporting BINARYMIME accepts a message containing binary material, it MUST deliver or relay the message in such a way as to preserve all bits in each octet.

BINARYMIME cannot be used with the DATA command. If a DATA command is issued after a MAIL command containing the body-value of BINARYMIME, a 503 "Bad sequence of commands" response MUST be sent, the resulting state is indeterminate, and the transaction MUST be reset with RSET. It is especially important when using BINARYMIME to ensure that the MIME message itself is properly formed, and in particular that text is canonically encoded with each line properly terminated with CR LF. Any transformation of text into non-canonical MIME to observe local storage conventions MUST be reversed before sending as BINARYMIME, and text/* MUST be sent with CR LF terminated lines. Although CR and LF do not necessarily represent ends of text lines in BDAT chunks, the RFC 2781 prohibition against using a UTF-16 charset within the text top-level media type remains.

If a receiver does not indicate support for the BINARYMIME message format, the sender MUST NOT, under any circumstances, send binary data. If the receiver does not support BINARYMIME and the message is a MIME object with a binary encoding, the sender has three options. It may implement a gateway transformation to convert the message into valid 8-bit MIME, if the receiver supports the 8BITMIME transport extension and the content is amenable to being encoded in 8 bits. It may implement a gateway transformation to convert the message into valid 7-bit MIME. Or it may treat this as a permanent error and handle it in the usual manner for delivery failures. The conversion is constrained in two ways: it must cause no loss of information, with MIME transport encodings employed as needed to ensure that, and the resulting message must be valid 7-bit or 8-bit MIME, so the transformation must not result in nested Base64 or Quoted-Printable content-transfer-encodings. The RFC notes that at the time of writing there are no mechanisms for converting a binary MIME object into an 8-bit MIME object, since that would require a new MIME content-transfer-encoding.

Finally, if the MIME message contains a Binary content-transfer-encoding and the BODY parameter does not indicate BINARYMIME, the message MUST be accepted and SHOULD be returned to the sender with an appropriate delivery status notification.

The second extension adds the word BINARYMIME to the BODY parameter of the MAIL command. When the receiver accepts that value, it promises to deliver the message without changing a single bit. The sender must not use it unless the receiver advertised the keyword, and it cannot be combined with the ordinary DATA command.

SENDING A BINARY MESSAGE IN CHUNKS
Sender SMTPReceiver SMTP
  1. EHLOThe server answers with the keywords CHUNKING and BINARYMIME.
  2. MAIL FROM BODY=BINARYMIME
  3. BDAT 100000Exactly 100000 octets follow the command line.
  4. 250One 250 reply per successful block.
  5. BDAT 0 LASTMarks the end of the message.

§4The Two Dialogues

Section 4.1 of the RFC shows a simple chunking exchange that sends a short pseudo-RFC 822 message to one recipient. The client opens the connection, the server answers 220, the client sends EHLO and the server replies with 250 and the keyword CHUNKING. The client then sends MAIL FROM and RCPT TO, which are each accepted, and finally BDAT 86 LAST followed by the three header lines of the message. The server replies 250 Message OK, 86 octets received.

Section 4.2 shows a BINARYMIME object sent to two recipients using the CHUNKING and PIPELINING extensions. The server's greeting lists PIPELINING, BINARYMIME and CHUNKING. The client sends MAIL FROM:<ned@ymir.claremont.edu> BODY=BINARYMIME and the two RCPT commands without waiting for replies in between, which is what pipelining allows. The server answers all three with 250.

The client then sends BDAT 100000 with the first 10000 octets of canonical MIME message data, and later BDAT 324 with the remaining 324 octets, and finally BDAT 0 LAST to mark the end. The server replies 250 for each chunk and finally 250 Message OK, 100324 octets received, which is the sum of the two chunk sizes.

The first dialogue sends a short message in one block. The second sends a binary message to two recipients, and splits it into two blocks with a final empty block marked LAST. The receiver's last reply gives the total number of octets it accepted.

THE SIMPLE CHUNKING EXAMPLE FROM SECTION 4.1
One chunk, one recipient
R: 220 cnri.reston.va.us SMTP service ready
S: EHLO ymir.claremont.edu
R: 250-cnri.reston.va.us says hello
R: 250 CHUNKING
S: MAIL FROM:<Sam@Random.com>
R: 250 <Sam@Random.com> Sender ok
S: RCPT TO:<Susan@Random.com>
R: 250 <Susan@random.com> Recipient ok
S: BDAT 86 LAST
S: To: Susan@random.com<CR><LF>
S: From: Sam@random.com<CR><LF>
S: Subject: This is a bodyless test message<CR><LF>
R: 250 Message OK, 86 octets received
S: QUIT
R: 221 Goodbye

§5Security Considerations

The RFC states that the extension is not known to present any additional security issues not already endemic to electronic mail and present in fully conforming implementations of RFC 821, or otherwise made possible by MIME.

The RFC says the extension raises no security issues beyond those that email already has.

§8Changes From RFC 1830

Appendix A of the RFC lists the changes from RFC 1830. There were numerous editorial changes, including required intellectual property boilerplate and revised authors' contact information. The simple chunking example was corrected to use the correct number of bytes, and the pipelining example was updated to illustrate the BDAT 0 LAST construct.

This edition is the same protocol as the experimental one, with the text tidied up and the examples corrected.

§7References