The
-v
command-line switch tells
sendmail
to run in
verbose
mode. In that mode,
sendmail
prints a blow-by-blow
[4]
description
of all the steps it takes in
delivering a mail message.
To watch
sendmail
run in verbose mode, send mail
to yourself
as you did in
Section 1.4, "Run sendmail by Hand"
,
but this time add a
-v
switch:
%
/usr/lib/sendmail -v
you
< sendstuff
The output produced shows that
sendmail
delivers your mail locally:
you
... Connecting to local...
you
... Sent
When
sendmail
forwards mail to another machine over a TCP/IP
network, it communicates with that other machine using
a protocol called SMTP (Simple Mail Transfer Protocol). To see
what SMTP looks like, run
sendmail
again, but this time, instead of using
you
as
the recipient, give
sendmail
your address on another
machine.
%
/usr/lib/sendmail -v
you@remote.domain
< sendstuff
The output
produced by this command line will look similar to the following:
you@remote.domain... Connecting to remote.domain via smtp...
220-remote.Domain Sendmail 8.6.12/8.5 ready at Fri, 13 Dec 1996 06:36:12 -0800
220 ESMTP spoken here
>>> EHLO here.us.edu
250-remote.domain Hello here.us.edu, pleased to meet you
250-EXPN
250-SIZE
250 HELP
>>> MAIL From:<you@here.us.edu>
250 <you@here.us.edu>... Sender ok
>>> RCPT To:<you@remote.domain>
250 <you@remote.domain>... Recipient ok
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
250 GAA20115 Message accepted for delivery
you@remote.domain... Sent (GAA20115 Message accepted for delivery)
Closing connection to remote.domain
>>> QUIT
221 remote.domain closing connection
The lines that begin with numbers and the lines that begin with
>>>
characters constitute a record of the SMTP conversation.
We'll discuss those shortly.
The other lines are
sendmail
on your local machine
telling you what it is trying to do and what it has successfully done:
you@remote.domain... Connecting to remote.domain via smtp...
...
you@remote.domain... Sent (GAA20115 Message accepted for delivery)
Closing connection to remote.domain
The first line shows to whom the mail is addressed and
that the machine
remote.domain
is on the network.
The last two lines show that the mail message was successfully sent.
In the SMTP conversation your local machine displays what it is
saying to the remote host by preceding each line with
>>>
characters. The messages (replies) from the remote machine are
displayed with leading numbers.
We now explain that conversation.
220-remote.Domain Sendmail 8.6.12/8.5 ready at Fri, 13 Dec 1996 06:36:12 -0800
220 ESMTP spoken here
Once your
sendmail
has connected to the remote machine, your
sendmail
waits
for the other machine to initiate the conversation. The other
machine says that it is ready by sending the number 220, a dash
(to say that it has more to say), and
its fully qualified hostname (the only required information).
If the other machine is running
sendmail
,
it also says the program name
sendmail
and the version. It also states that
it is ready and gives its idea of the local date and time.
The second line also starts with a 220, but that 220
is not followed by a dash. A dash means that more lines will
follow, and the absence of a dash means that this is the last line.
The "ESMTP spoken here" means that the remote site understands
the Extended SMTP protocol.
If the other machine were running V8.7 or later
sendmail
, the
ESMTP would precede
Sendmail
in the first line, and there
would be no second line.
If sendmail waits too long for a connection without receiving
this initial message, it prints "Connection timed out" and
queues the mail message for later delivery.
Next the local
sendmail
sends (the
>>>
) the word
EHLO
, for Extended Hello, and its own hostname:
>>> EHLO here.us.edu
250-remote.domain Hello here.us.edu, pleased to meet you
250-EXPN
250-SIZE
250 HELP
The E of the
EHLO
says that the local
sendmail
speaks
ESMTP too.
The remote machine replies with
250
and the acknowledgment
that your hostname is acceptable, then lists the ESMTP
services that it supports.
One problem that could occur
is your machine sending a short hostname ("here")
in the
EHLO
message.
This would cause an error because the remote machine wouldn't find
here
in its domain
remote.domain
.
This is one reason why it is important for your
sendmail
to always use your machine's fully qualified hostname. A fully qualified
name is one that begins with the host's name,
followed by a dot, then the entire DNS domain.
If all has gone well so far, the local machine sends the name of
the sender of the mail message:
>>> MAIL From:<you@here.us.edu>
250 <you@here.us.edu>... Sender ok
Here, that
sender address was accepted by the remote machine.
Next the local machine sends the name of the recipient:
>>> RCPT To:<you@remote.domain>
250 <you@remote.domain>... Recipient ok
If the user
you
were not known on
the remote machine, it would reply with an error of "User unknown."
Here, the recipient is
ok
. Note that
ok
does not necessarily
mean that the address is good. It can still be bounced later. The
ok
means only that the address is acceptable.
After the envelope information has been sent, your
sendmail
attempts to send the mail message (header and body combined).
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
DATA
tells the remote host to "get ready."
The remote machine says to send the message, and the local machine does so.
(The message is not printed as it is sent.)
A dot on a line by itself is used to
mark the end of a mail message. This is a convention of the
SMTP protocol. Because mail messages may contain lines that begin with dots
as a valid part of the message,
sendmail
doubles any dots at
the beginning of lines before they are sent.
[5]
For example, consider when the following
text is sent through the mail:
My results matched yours at first:
126.71
126.72
...
126.79
But then the numbers suddenly jumped high, looking like
noise saturated the line.
To prevent any of these lines from being wrongly interpreted as
the end of the mail message,
sendmail
inserts an extra
dot at the beginning of any line that begins with a dot, so the
actual text transferred is
My results matched yours at first:
126.71
126.72
....
note extra dot
126.79
But then the numbers suddenly jumped high, looking like
noise saturated the line.
The SMTP-server program running at the receiving end (for example, another
sendmail
)
strips those extra dots when it receives the message.
The remote
sendmail
shows the queue identification number that it
assigned to the mail it accepted:
250 GAA20115 Message accepted for delivery
>>> QUIT
221 remote.domain closing connection
The local
sendmail
sends
QUIT
to say
it is all done. The remote machine acknowledges by closing the
connection.
Note that the
-v
(verbose) switch for
sendmail
is
most useful with mail sent to remote machines. It allows you
to watch SMTP conversations as they occur and can help in tracking
down why a mail message fails to reach its destination.