Полезная информация

sendmail

sendmailSearch this book
Previous: 4.1 Become a Mode (-b)Chapter 4
How to Run sendmail
Next: 4.3 Debugging (-d)
 

4.2 Verbose (-v)

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:

[4] Verbose mode is actually far more powerful than we've shown here.

% /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:

[5] This is called the "hidden dot algorithm" and is documented in RFC821.

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.


Previous: 4.1 Become a Mode (-b)sendmailNext: 4.3 Debugging (-d)
4.1 Become a Mode (-b)Book Index4.3 Debugging (-d)