\section{\module{smtplib} ---
         SMTP protocol client}

\declaremodule{standard}{smtplib}
\modulesynopsis{SMTP protocol client (requires sockets).}
\sectionauthor{Eric S. Raymond}{esr@snark.thyrsus.com}

\indexii{SMTP}{protocol}
\index{Simple Mail Transfer Protocol}

The \module{smtplib} module defines an SMTP client session object that
can be used to send mail to any Internet machine with an SMTP or ESMTP
listener daemon.  For details of SMTP and ESMTP operation, consult
\rfc{821} (\citetitle{Simple Mail Transfer Protocol}) and \rfc{1869}
(\citetitle{SMTP Service Extensions}).

\begin{classdesc}{SMTP}{\optional{host\optional{, port\optional{,
                        local_hostname}}}}
A \class{SMTP} instance encapsulates an SMTP connection.  It has
methods that support a full repertoire of SMTP and ESMTP
operations. If the optional host and port parameters are given, the
SMTP \method{connect()} method is called with those parameters during
initialization.  An \exception{SMTPConnectError} is raised if the
specified host doesn't respond correctly.

For normal use, you should only require the initialization/connect,
\method{sendmail()}, and \method{quit()} methods.  An example is
included below.
\end{classdesc}


A nice selection of exceptions is defined as well:

\begin{excdesc}{SMTPException}
  Base exception class for all exceptions raised by this module.
\end{excdesc}

\begin{excdesc}{SMTPServerDisconnected}
  This exception is raised when the server unexpectedly disconnects,
  or when an attempt is made to use the \class{SMTP} instance before
  connecting it to a server.
\end{excdesc}

\begin{excdesc}{SMTPResponseException}
  Base class for all exceptions that include an SMTP error code.
  These exceptions are generated in some instances when the SMTP
  server returns an error code.  The error code is stored in the
  \member{smtp_code} attribute of the error, and the
  \member{smtp_error} attribute is set to the error message.
\end{excdesc}

\begin{excdesc}{SMTPSenderRefused}
  Sender address refused.  In addition to the attributes set by on all 
  \exception{SMTPResponseException} exceptions, this sets `sender' to
  the string that the SMTP server refused.
\end{excdesc}

\begin{excdesc}{SMTPRecipientsRefused}
  All recipient addresses refused.  The errors for each recipient are
  accessible through the attribute \member{recipients}, which is a
  dictionary of exactly the same sort as \method{SMTP.sendmail()}
  returns.
\end{excdesc}

\begin{excdesc}{SMTPDataError}
  The SMTP server refused to accept the message data.
\end{excdesc}

\begin{excdesc}{SMTPConnectError}
  Error occurred during establishment of a connection  with the server.
\end{excdesc}

\begin{excdesc}{SMTPHeloError}
  The server refused our \samp{HELO} message.
\end{excdesc}


\begin{seealso}
  \seerfc{821}{Simple Mail Transfer Protocol}{Protocol definition for
          SMTP.  This document covers the model, operating procedure,
          and protocol details for SMTP.}
  \seerfc{1869}{SMTP Service Extensions}{Definition of the ESMTP
          extensions for SMTP.  This describes a framework for
          extending SMTP with new commands, supporting dynamic
          discovery of the commands provided by the server, and
          defines a few additional commands.}
\end{seealso}


\subsection{SMTP Objects \label{SMTP-objects}}

An \class{SMTP} instance has the following methods:

\begin{methoddesc}{set_debuglevel}{level}
Set the debug output level.  A true value for \var{level} results in
debug messages for connection and for all messages sent to and
received from the server.
\end{methoddesc}

\begin{methoddesc}{connect}{\optional{host\optional{, port}}}
Connect to a host on a given port.  The defaults are to connect to the 
local host at the standard SMTP port (25).
If the hostname ends with a colon (\character{:}) followed by a
number, that suffix will be stripped off and the number interpreted as 
the port number to use.
This method is automatically invoked by the constructor if a
host is specified during instantiation.
\end{methoddesc}

\begin{methoddesc}{docmd}{cmd, \optional{, argstring}}
Send a command \var{cmd} to the server.  The optional argument
\var{argstring} is simply concatenated to the command, separated by a
space.

This returns a 2-tuple composed of a numeric response code and the
actual response line (multiline responses are joined into one long
line.)

In normal operation it should not be necessary to call this method
explicitly.  It is used to implement other methods and may be useful
for testing private extensions.

If the connection to the server is lost while waiting for the reply,
\exception{SMTPServerDisconnected} will be raised.
\end{methoddesc}

\begin{methoddesc}{helo}{\optional{hostname}}
Identify yourself to the SMTP server using \samp{HELO}.  The hostname
argument defaults to the fully qualified domain name of the local
host.

In normal operation it should not be necessary to call this method
explicitly.  It will be implicitly called by the \method{sendmail()}
when necessary.
\end{methoddesc}

\begin{methoddesc}{ehlo}{\optional{hostname}}
Identify yourself to an ESMTP server using \samp{EHLO}.  The hostname
argument defaults to the fully qualified domain name of the local
host.  Examine the response for ESMTP option and store them for use by
\method{has_option()}.

Unless you wish to use \method{has_option()} before sending
mail, it should not be necessary to call this method explicitly.  It
will be implicitly called by \method{sendmail()} when necessary.
\end{methoddesc}

\begin{methoddesc}{has_extn}{name}
Return \code{1} if \var{name} is in the set of SMTP service extensions
returned by the server, \code{0} otherwise.  Case is ignored.
\end{methoddesc}

\begin{methoddesc}{verify}{address}
Check the validity of an address on this server using SMTP \samp{VRFY}.
Returns a tuple consisting of code 250 and a full \rfc{822} address
(including human name) if the user address is valid. Otherwise returns
an SMTP error code of 400 or greater and an error string.

\note{Many sites disable SMTP \samp{VRFY} in order to foil spammers.}
\end{methoddesc}

\begin{methoddesc}{login}{user, password}
Log in on an SMTP server that requires authentication.
The arguments are the username and the password to authenticate with.
If there has been no previous \samp{EHLO} or \samp{HELO} command this
session, this method tries ESMTP \samp{EHLO} first.
This method will return normally if the authentication was successful,
or may raise the following exceptions:

\begin{description}
  \item[\exception{SMTPHeloError}]
    The server didn't reply properly to the \samp{HELO} greeting.
  \item[\exception{SMTPAuthenticationError}]
    The server didn't accept the username/password combination.
  \item[\exception{SMTPError}]
    No suitable authentication method was found.
\end{description}
\end{methoddesc}

\begin{methoddesc}{starttls}{\optional{keyfile\optional{, certfile}}}
Put the SMTP connection in TLS (Transport Layer Security) mode.  All
SMTP commands that follow will be encrypted.  You should then call
\method{ehlo()} again.

If \var{keyfile} and \var{certfile} are provided, these are passed to
the \refmodule{socket} module's \function{ssl()} function.
\end{methoddesc}

\begin{methoddesc}{sendmail}{from_addr, to_addrs, msg\optional{,
                             mail_options, rcpt_options}}
Send mail.  The required arguments are an \rfc{822} from-address
string, a list of \rfc{822} to-address strings, and a message string.
The caller may pass a list of ESMTP options (such as \samp{8bitmime})
to be used in \samp{MAIL FROM} commands as \var{mail_options}.  ESMTP
options (such as \samp{DSN} commands) that should be used with all
\samp{RCPT} commands can be passed as \var{rcpt_options}.  (If you
need to use different ESMTP options to different recipients you have
to use the low-level methods such as \method{mail}, \method{rcpt} and
\method{data} to send the message.)

\note{The \var{from_addr} and \var{to_addrs} parameters are
used to construct the message envelope used by the transport agents.
The \class{SMTP} does not modify the message headers in any way.}

If there has been no previous \samp{EHLO} or \samp{HELO} command this
session, this method tries ESMTP \samp{EHLO} first. If the server does
ESMTP, message size and each of the specified options will be passed
to it (if the option is in the feature set the server advertises).  If
\samp{EHLO} fails, \samp{HELO} will be tried and ESMTP options
suppressed.

This method will return normally if the mail is accepted for at least
one recipient. Otherwise it will throw an exception.  That is, if this
method does not throw an exception, then someone should get your mail.
If this method does not throw an exception, it returns a dictionary,
with one entry for each recipient that was refused.  Each entry
contains a tuple of the SMTP error code and the accompanying error
message sent by the server.

This method may raise the following exceptions:

\begin{description}
\item[\exception{SMTPRecipientsRefused}]
All recipients were refused.  Nobody got the mail.  The
\member{recipients} attribute of the exception object is a dictionary
with information about the refused recipients (like the one returned
when at least one recipient was accepted).

\item[\exception{SMTPHeloError}]
The server didn't reply properly to the \samp{HELO} greeting.

\item[\exception{SMTPSenderRefused}]
The server didn't accept the \var{from_addr}.

\item[\exception{SMTPDataError}]
The server replied with an unexpected error code (other than a refusal
of a recipient).
\end{description}

Unless otherwise noted, the connection will be open even after
an exception is raised.

\end{methoddesc}

\begin{methoddesc}{quit}{}
Terminate the SMTP session and close the connection.
\end{methoddesc}

Low-level methods corresponding to the standard SMTP/ESMTP commands
\samp{HELP}, \samp{RSET}, \samp{NOOP}, \samp{MAIL}, \samp{RCPT}, and
\samp{DATA} are also supported.  Normally these do not need to be
called directly, so they are not documented here.  For details,
consult the module code.


\subsection{SMTP Example \label{SMTP-example}}

This example prompts the user for addresses needed in the message
envelope (`To' and `From' addresses), and the message to be
delivered.  Note that the headers to be included with the message must 
be included in the message as entered; this example doesn't do any
processing of the \rfc{822} headers.  In particular, the `To' and
`From' addresses must be included in the message headers explicitly.

\begin{verbatim}
import smtplib
import string

def prompt(prompt):
    return raw_input(prompt).strip()

fromaddr = prompt("From: ")
toaddrs  = prompt("To: ").split()
print "Enter message, end with ^D:"

# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
       % (fromaddr, string.join(toaddrs, ", ")))
while 1:
    try:
        line = raw_input()
    except EOFError:
        break
    if not line:
        break
    msg = msg + line

print "Message length is " + `len(msg)`

server = smtplib.SMTP('localhost')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
\end{verbatim}
