Duplicate messages and SMTP
Why SMTP can deliver a message twice when the final acknowledgment is lost.
Partridge, C., "Duplicate messages and SMTP", RFC 1047, DOI 10.17487/RFC1047, February 1988, <https://www.rfc-editor.org/info/rfc1047>.
@misc{rfc1047,
series = {Request for Comments},
number = 1047,
howpublished = {RFC 1047},
publisher = {RFC Editor},
doi = {10.17487/RFC1047},
url = {https://www.rfc-editor.org/info/rfc1047},
author = {C. Partridge},
title = {{Duplicate messages and SMTP}},
pagetotal = 3,
year = 1988,
month = feb,
} RFC text
Contents
Network Working Group Craig Partridge
Request for Comments: 1047 CIC at BBN Labs
February 1988
DUPLICATE MESSAGES AND SMTP
STATUS OF THIS MEMO
An examination of a synchronization problem in the Simple Mail
Transfer Protocol (SMTP) is presented. This synchronization problem
can cause a message to be delivered multiple times. A method for
avoiding this problem is suggested. Nodding familiarity with the
SMTP specification, RFC-821, is required. Distribution of this memo
is unlimited.
INTRODUCTION
Over the past few years, the staff of the CSNET Coordination and
Information Center (CIC) has often been asked to help determine why a
single mail message is being delivered multiple times to its
recipients. In the process of tracing the problems of multiple
delivery, we have discovered that many duplicate messages are the
result of a synchronization problem in SMTP. There is a point in the
process of delivering a message where the receiving mailer knows it
has accepted the message but the sending mailer is still not sure the
message has been reliably delivered. If the SMTP conversation is
broken at this point, the sending mailer will be forced to re-deliver
the message, even though the message has already been received and
delivered by the receiving mailer.
DESCRIPTION OF THE PROBLEM
The synchronization problem occurs at the end of delivering a
message. When the sending mailer has finished sending the text of a
message, it is required to send a line containing a single dot or
period. When the receiving mailer receives this final dot, it is
expected to do its final message processing and either confirm
receipt of the message (with a 250 reply) or reject the message with
any one of several error codes.
Observe that there is a potential synchronization gap here. During
the period between the time the receiving mailer has determined that
it will accept the message, and the time that sending mailer gets the
250 reply, the message is active at both the sending and receiving
mailer. Until the sending mailer gets the 250 reply, it must assume
the message was not delivered. After the receiving mailer has
decided to accept the message, it must assume the message has been
delivered to it. If the communications link fails during this
synchronization gap, then the message has been duplicated. Both
mailers have active copies of the message that they will try to
deliver.
It may be hard to believe that this problem is the cause of many
duplicate messages. Intuitively, one might expect that the time
spent in the state between the final dot and its accepting 250 reply
is quite small. In practice, however, this period is often quite
long; long enough that timeouts by the sending mailer (or possibly
network failures) are quite common. Observations by the author
suggest that this synchronization problem may be the second leading
cause of duplicate messages on the Internet (second to mail loops).
Many mailers delay responding to the final dot because they are doing
sophisticated processing of the message, in an attempt to confirm
that they can deliver the message. For example, the mailers may
expand an entire mailing list to confirm that it can reach all
addressees or may attempt to physically deposit the message into the
mailboxes of local users, before confirming receipt of the final dot.
These practices are not unreasonable, but they often cause the
synchronization gap to continue for several minutes, and increase the
likelihood that the sending mailer will timeout or the network will
fail before the accepting 250 reply is sent.
AVOIDING SYNCHRONIZATION PROBLEMS
The best way to avoid the synchronization problem is to minimize the
length of the synchronization gap. In other words, receiving mailers
should acknowledge the final dot as soon as possible and do more
complex processing of the message later.
RFC-821 (on page 22) states that unless the receiving mailer is
completely unable to process a message it should accept the message
and acknowledge any errors in processing in a separate message or
messages sent back to the originator of the message. As a result,
receiving mailers should be able to acknowledge the final dot as soon
as the message has been safely put in a non-volatile (e.g., disk)
queue for further processing. Fast acceptance of a message does not
violate RFC-821.
Some mailers can be configured to do more or less processing upon
receipt of the final dot. In such situations, the mailer should
always be configured to do less processing.
Finally, some mailers allow remote mailers only a minute or two to
acknowledge the final dot before timing out and trying again. Given
the increasing round-trip times on the Internet, and that some
processing after the final dot is required, the timeout for reply to
the final dot should probably be at least 5 minutes and a timeout of
10 minutes would not be unreasonable.
ISO Plain Language
On this page
§1The Gap Between Acceptance and Confirmation
After sending the message text, the sender transmits a line containing a single dot. The receiving mailer then processes the message and either accepts it with a 250 reply or rejects it.
There is a period after the receiver decides to accept the message but before the sender receives the reply. During this synchronization gap, the receiver treats the message as delivered while the sender must still assume it was not delivered. If the connection fails then, both sides may try to deliver their copies.
The receiver can accept a message before the sender hears that it succeeded. If the connection breaks in between, the sender may send the message again.
§2Why the Gap Can Last
Some mailers delay the final reply while they perform additional processing. The RFC gives examples such as expanding a mailing list or trying to place the message into local mailboxes before confirming acceptance.
Those steps can keep both copies active for minutes, increasing the chance of a timeout or network failure before the sender receives the 250 reply.
Extra work before the receiver replies makes the uncertain period longer. A timeout or broken connection during that period can cause another delivery attempt.
§3Acknowledge After Safe Queuing
The RFC recommends that receiving mailers shorten the gap by acknowledging the final dot as soon as possible and doing more complex processing later. It says a receiver can reply after placing the message safely in a non-volatile queue, such as on disk.
The memo also recommends configuring mailers to do less processing before the reply. It says the timeout for the final response should probably be at least 5 minutes and that 10 minutes would not be unreasonable.
The receiver can confirm the message once it is safely stored, then do additional work later. A longer sender timeout also gives the receiver more time to reply.