\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_extn()}.

Unless you wish to use \method{has_extn()} 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 \constant{True} if \var{name} is in the set of SMTP service
extensions returned by the server, \constant{False} 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 (a bare string will be
treated as a list with 1 address), 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

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

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

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

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

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