| :mod:`smtplib` --- SMTP protocol client | |
| ======================================= | |
| .. module:: smtplib | |
| :synopsis: SMTP protocol client (requires sockets). | |
| .. sectionauthor:: Eric S. Raymond <esr@snark.thyrsus.com> | |
| **Source code:** :source:`Lib/smtplib.py` | |
| .. index:: | |
| pair: SMTP; protocol | |
| single: Simple Mail Transfer Protocol | |
| -------------- | |
| The :mod:`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` (Simple Mail Transfer | |
| Protocol) and :rfc:`1869` (SMTP Service Extensions). | |
| .. class:: SMTP(host='', port=0, local_hostname=None[, timeout], source_address=None) | |
| An :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 :meth:`connect` method is | |
| called with those parameters during initialization. If specified, | |
| *local_hostname* is used as the FQDN of the local host in the HELO/EHLO | |
| command. Otherwise, the local hostname is found using | |
| :func:`socket.getfqdn`. If the :meth:`connect` call returns anything other | |
| than a success code, an :exc:`SMTPConnectError` is raised. The optional | |
| *timeout* parameter specifies a timeout in seconds for blocking operations | |
| like the connection attempt (if not specified, the global default timeout | |
| setting will be used). If the timeout expires, :exc:`socket.timeout` is | |
| raised. The optional source_address parameter allows binding | |
| to some specific source address in a machine with multiple network | |
| interfaces, and/or to some specific source TCP port. It takes a 2-tuple | |
| (host, port), for the socket to bind to as its source address before | |
| connecting. If omitted (or if host or port are ``''`` and/or 0 respectively) | |
| the OS default behavior will be used. | |
| For normal use, you should only require the initialization/connect, | |
| :meth:`sendmail`, and :meth:`SMTP.quit` methods. | |
| An example is included below. | |
| The :class:`SMTP` class supports the :keyword:`with` statement. When used | |
| like this, the SMTP ``QUIT`` command is issued automatically when the | |
| :keyword:`!with` statement exits. E.g.:: | |
| >>> from smtplib import SMTP | |
| >>> with SMTP("domain.org") as smtp: | |
| ... smtp.noop() | |
| ... | |
| (250, b'Ok') | |
| >>> | |
| .. audit-event:: smtplib.send self,data smtplib.SMTP | |
| All commands will raise an :ref:`auditing event <auditing>` | |
| ``smtplib.SMTP.send`` with arguments ``self`` and ``data``, | |
| where ``data`` is the bytes about to be sent to the remote host. | |
| .. versionchanged:: 3.3 | |
| Support for the :keyword:`with` statement was added. | |
| .. versionchanged:: 3.3 | |
| source_address argument was added. | |
| .. versionadded:: 3.5 | |
| The SMTPUTF8 extension (:rfc:`6531`) is now supported. | |
| .. versionchanged:: 3.9 | |
| If the *timeout* parameter is set to be zero, it will raise a | |
| :class:`ValueError` to prevent the creation of a non-blocking socket | |
| .. class:: SMTP_SSL(host='', port=0, local_hostname=None, keyfile=None, \ | |
| certfile=None [, timeout], context=None, \ | |
| source_address=None) | |
| An :class:`SMTP_SSL` instance behaves exactly the same as instances of | |
| :class:`SMTP`. :class:`SMTP_SSL` should be used for situations where SSL is | |
| required from the beginning of the connection and using :meth:`starttls` is | |
| not appropriate. If *host* is not specified, the local host is used. If | |
| *port* is zero, the standard SMTP-over-SSL port (465) is used. The optional | |
| arguments *local_hostname*, *timeout* and *source_address* have the same | |
| meaning as they do in the :class:`SMTP` class. *context*, also optional, | |
| can contain a :class:`~ssl.SSLContext` and allows configuring various | |
| aspects of the secure connection. Please read :ref:`ssl-security` for | |
| best practices. | |
| *keyfile* and *certfile* are a legacy alternative to *context*, and can | |
| point to a PEM formatted private key and certificate chain file for the | |
| SSL connection. | |
| .. versionchanged:: 3.3 | |
| *context* was added. | |
| .. versionchanged:: 3.3 | |
| source_address argument was added. | |
| .. versionchanged:: 3.4 | |
| The class now supports hostname check with | |
| :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see | |
| :data:`ssl.HAS_SNI`). | |
| .. deprecated:: 3.6 | |
| *keyfile* and *certfile* are deprecated in favor of *context*. | |
| Please use :meth:`ssl.SSLContext.load_cert_chain` instead, or let | |
| :func:`ssl.create_default_context` select the system's trusted CA | |
| certificates for you. | |
| .. versionchanged:: 3.9 | |
| If the *timeout* parameter is set to be zero, it will raise a | |
| :class:`ValueError` to prevent the creation of a non-blocking socket | |
| .. class:: LMTP(host='', port=LMTP_PORT, local_hostname=None, \ | |
| source_address=None[, timeout]) | |
| The LMTP protocol, which is very similar to ESMTP, is heavily based on the | |
| standard SMTP client. It's common to use Unix sockets for LMTP, so our | |
| :meth:`connect` method must support that as well as a regular host:port | |
| server. The optional arguments local_hostname and source_address have the | |
| same meaning as they do in the :class:`SMTP` class. To specify a Unix | |
| socket, you must use an absolute path for *host*, starting with a '/'. | |
| Authentication is supported, using the regular SMTP mechanism. When using a | |
| Unix socket, LMTP generally don't support or require any authentication, but | |
| your mileage might vary. | |
| .. versionchanged:: 3.9 | |
| The optional *timeout* parameter was added. | |
| A nice selection of exceptions is defined as well: | |
| .. exception:: SMTPException | |
| Subclass of :exc:`OSError` that is the base exception class for all | |
| the other exceptions provided by this module. | |
| .. versionchanged:: 3.4 | |
| SMTPException became subclass of :exc:`OSError` | |
| .. exception:: 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. | |
| .. exception:: 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 :attr:`smtp_code` attribute of the error, and the | |
| :attr:`smtp_error` attribute is set to the error message. | |
| .. exception:: SMTPSenderRefused | |
| Sender address refused. In addition to the attributes set by on all | |
| :exc:`SMTPResponseException` exceptions, this sets 'sender' to the string that | |
| the SMTP server refused. | |
| .. exception:: SMTPRecipientsRefused | |
| All recipient addresses refused. The errors for each recipient are accessible | |
| through the attribute :attr:`recipients`, which is a dictionary of exactly the | |
| same sort as :meth:`SMTP.sendmail` returns. | |
| .. exception:: SMTPDataError | |
| The SMTP server refused to accept the message data. | |
| .. exception:: SMTPConnectError | |
| Error occurred during establishment of a connection with the server. | |
| .. exception:: SMTPHeloError | |
| The server refused our ``HELO`` message. | |
| .. exception:: SMTPNotSupportedError | |
| The command or option attempted is not supported by the server. | |
| .. versionadded:: 3.5 | |
| .. exception:: SMTPAuthenticationError | |
| SMTP authentication went wrong. Most probably the server didn't accept the | |
| username/password combination provided. | |
| .. seealso:: | |
| :rfc:`821` - Simple Mail Transfer Protocol | |
| Protocol definition for SMTP. This document covers the model, operating | |
| procedure, and protocol details for SMTP. | |
| :rfc:`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. | |
| .. _smtp-objects: | |
| SMTP Objects | |
| ------------ | |
| An :class:`SMTP` instance has the following methods: | |
| .. method:: SMTP.set_debuglevel(level) | |
| Set the debug output level. A value of 1 or ``True`` for *level* results in | |
| debug messages for connection and for all messages sent to and received from | |
| the server. A value of 2 for *level* results in these messages being | |
| timestamped. | |
| .. versionchanged:: 3.5 Added debuglevel 2. | |
| .. method:: SMTP.docmd(cmd, args='') | |
| Send a command *cmd* to the server. The optional argument *args* 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, | |
| :exc:`SMTPServerDisconnected` will be raised. | |
| .. method:: SMTP.connect(host='localhost', port=0) | |
| 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 (``':'``) | |
| 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. Returns a | |
| 2-tuple of the response code and message sent by the server in its | |
| connection response. | |
| .. audit-event:: smtplib.connect self,host,port smtplib.SMTP.connect | |
| .. method:: SMTP.helo(name='') | |
| Identify yourself to the SMTP server using ``HELO``. The hostname argument | |
| defaults to the fully qualified domain name of the local host. | |
| The message returned by the server is stored as the :attr:`helo_resp` attribute | |
| of the object. | |
| In normal operation it should not be necessary to call this method explicitly. | |
| It will be implicitly called by the :meth:`sendmail` when necessary. | |
| .. method:: SMTP.ehlo(name='') | |
| Identify yourself to an ESMTP server using ``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 :meth:`has_extn`. | |
| Also sets several informational attributes: the message returned by | |
| the server is stored as the :attr:`ehlo_resp` attribute, :attr:`does_esmtp` | |
| is set to true or false depending on whether the server supports ESMTP, and | |
| :attr:`esmtp_features` will be a dictionary containing the names of the | |
| SMTP service extensions this server supports, and their parameters (if any). | |
| Unless you wish to use :meth:`has_extn` before sending mail, it should not be | |
| necessary to call this method explicitly. It will be implicitly called by | |
| :meth:`sendmail` when necessary. | |
| .. method:: SMTP.ehlo_or_helo_if_needed() | |
| This method calls :meth:`ehlo` and/or :meth:`helo` if there has been no | |
| previous ``EHLO`` or ``HELO`` command this session. It tries ESMTP ``EHLO`` | |
| first. | |
| :exc:`SMTPHeloError` | |
| The server didn't reply properly to the ``HELO`` greeting. | |
| .. method:: SMTP.has_extn(name) | |
| Return :const:`True` if *name* is in the set of SMTP service extensions returned | |
| by the server, :const:`False` otherwise. Case is ignored. | |
| .. method:: SMTP.verify(address) | |
| Check the validity of an address on this server using SMTP ``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 ``VRFY`` in order to foil spammers. | |
| .. method:: SMTP.login(user, password, *, initial_response_ok=True) | |
| 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 | |
| ``EHLO`` or ``HELO`` command this session, this method tries ESMTP ``EHLO`` | |
| first. This method will return normally if the authentication was successful, or | |
| may raise the following exceptions: | |
| :exc:`SMTPHeloError` | |
| The server didn't reply properly to the ``HELO`` greeting. | |
| :exc:`SMTPAuthenticationError` | |
| The server didn't accept the username/password combination. | |
| :exc:`SMTPNotSupportedError` | |
| The ``AUTH`` command is not supported by the server. | |
| :exc:`SMTPException` | |
| No suitable authentication method was found. | |
| Each of the authentication methods supported by :mod:`smtplib` are tried in | |
| turn if they are advertised as supported by the server. See :meth:`auth` | |
| for a list of supported authentication methods. *initial_response_ok* is | |
| passed through to :meth:`auth`. | |
| Optional keyword argument *initial_response_ok* specifies whether, for | |
| authentication methods that support it, an "initial response" as specified | |
| in :rfc:`4954` can be sent along with the ``AUTH`` command, rather than | |
| requiring a challenge/response. | |
| .. versionchanged:: 3.5 | |
| :exc:`SMTPNotSupportedError` may be raised, and the | |
| *initial_response_ok* parameter was added. | |
| .. method:: SMTP.auth(mechanism, authobject, *, initial_response_ok=True) | |
| Issue an ``SMTP`` ``AUTH`` command for the specified authentication | |
| *mechanism*, and handle the challenge response via *authobject*. | |
| *mechanism* specifies which authentication mechanism is to | |
| be used as argument to the ``AUTH`` command; the valid values are | |
| those listed in the ``auth`` element of :attr:`esmtp_features`. | |
| *authobject* must be a callable object taking an optional single argument: | |
| data = authobject(challenge=None) | |
| If optional keyword argument *initial_response_ok* is true, | |
| ``authobject()`` will be called first with no argument. It can return the | |
| :rfc:`4954` "initial response" ASCII ``str`` which will be encoded and sent with | |
| the ``AUTH`` command as below. If the ``authobject()`` does not support an | |
| initial response (e.g. because it requires a challenge), it should return | |
| ``None`` when called with ``challenge=None``. If *initial_response_ok* is | |
| false, then ``authobject()`` will not be called first with ``None``. | |
| If the initial response check returns ``None``, or if *initial_response_ok* is | |
| false, ``authobject()`` will be called to process the server's challenge | |
| response; the *challenge* argument it is passed will be a ``bytes``. It | |
| should return ASCII ``str`` *data* that will be base64 encoded and sent to the | |
| server. | |
| The ``SMTP`` class provides ``authobjects`` for the ``CRAM-MD5``, ``PLAIN``, | |
| and ``LOGIN`` mechanisms; they are named ``SMTP.auth_cram_md5``, | |
| ``SMTP.auth_plain``, and ``SMTP.auth_login`` respectively. They all require | |
| that the ``user`` and ``password`` properties of the ``SMTP`` instance are | |
| set to appropriate values. | |
| User code does not normally need to call ``auth`` directly, but can instead | |
| call the :meth:`login` method, which will try each of the above mechanisms | |
| in turn, in the order listed. ``auth`` is exposed to facilitate the | |
| implementation of authentication methods not (or not yet) supported | |
| directly by :mod:`smtplib`. | |
| .. versionadded:: 3.5 | |
| .. method:: SMTP.starttls(keyfile=None, certfile=None, context=None) | |
| Put the SMTP connection in TLS (Transport Layer Security) mode. All SMTP | |
| commands that follow will be encrypted. You should then call :meth:`ehlo` | |
| again. | |
| If *keyfile* and *certfile* are provided, they are used to create an | |
| :class:`ssl.SSLContext`. | |
| Optional *context* parameter is an :class:`ssl.SSLContext` object; This is | |
| an alternative to using a keyfile and a certfile and if specified both | |
| *keyfile* and *certfile* should be ``None``. | |
| If there has been no previous ``EHLO`` or ``HELO`` command this session, | |
| this method tries ESMTP ``EHLO`` first. | |
| .. deprecated:: 3.6 | |
| *keyfile* and *certfile* are deprecated in favor of *context*. | |
| Please use :meth:`ssl.SSLContext.load_cert_chain` instead, or let | |
| :func:`ssl.create_default_context` select the system's trusted CA | |
| certificates for you. | |
| :exc:`SMTPHeloError` | |
| The server didn't reply properly to the ``HELO`` greeting. | |
| :exc:`SMTPNotSupportedError` | |
| The server does not support the STARTTLS extension. | |
| :exc:`RuntimeError` | |
| SSL/TLS support is not available to your Python interpreter. | |
| .. versionchanged:: 3.3 | |
| *context* was added. | |
| .. versionchanged:: 3.4 | |
| The method now supports hostname check with | |
| :attr:`SSLContext.check_hostname` and *Server Name Indicator* (see | |
| :data:`~ssl.HAS_SNI`). | |
| .. versionchanged:: 3.5 | |
| The error raised for lack of STARTTLS support is now the | |
| :exc:`SMTPNotSupportedError` subclass instead of the base | |
| :exc:`SMTPException`. | |
| .. method:: SMTP.sendmail(from_addr, to_addrs, msg, 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 ``8bitmime``) to be used in ``MAIL FROM`` commands as *mail_options*. | |
| ESMTP options (such as ``DSN`` commands) that should be used with all ``RCPT`` | |
| commands can be passed as *rcpt_options*. (If you need to use different ESMTP | |
| options to different recipients you have to use the low-level methods such as | |
| :meth:`mail`, :meth:`rcpt` and :meth:`data` to send the message.) | |
| .. note:: | |
| The *from_addr* and *to_addrs* parameters are used to construct the message | |
| envelope used by the transport agents. ``sendmail`` does not modify the | |
| message headers in any way. | |
| *msg* may be a string containing characters in the ASCII range, or a byte | |
| string. A string is encoded to bytes using the ascii codec, and lone ``\r`` | |
| and ``\n`` characters are converted to ``\r\n`` characters. A byte string is | |
| not modified. | |
| If there has been no previous ``EHLO`` or ``HELO`` command this session, this | |
| method tries ESMTP ``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 ``EHLO`` fails, ``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 raise an exception. That is, if this method does | |
| not raise an exception, then someone should get your mail. If this method does | |
| not raise 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. | |
| If ``SMTPUTF8`` is included in *mail_options*, and the server supports it, | |
| *from_addr* and *to_addrs* may contain non-ASCII characters. | |
| This method may raise the following exceptions: | |
| :exc:`SMTPRecipientsRefused` | |
| All recipients were refused. Nobody got the mail. The :attr:`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). | |
| :exc:`SMTPHeloError` | |
| The server didn't reply properly to the ``HELO`` greeting. | |
| :exc:`SMTPSenderRefused` | |
| The server didn't accept the *from_addr*. | |
| :exc:`SMTPDataError` | |
| The server replied with an unexpected error code (other than a refusal of a | |
| recipient). | |
| :exc:`SMTPNotSupportedError` | |
| ``SMTPUTF8`` was given in the *mail_options* but is not supported by the | |
| server. | |
| Unless otherwise noted, the connection will be open even after an exception is | |
| raised. | |
| .. versionchanged:: 3.2 | |
| *msg* may be a byte string. | |
| .. versionchanged:: 3.5 | |
| ``SMTPUTF8`` support added, and :exc:`SMTPNotSupportedError` may be | |
| raised if ``SMTPUTF8`` is specified but the server does not support it. | |
| .. method:: SMTP.send_message(msg, from_addr=None, to_addrs=None, \ | |
| mail_options=(), rcpt_options=()) | |
| This is a convenience method for calling :meth:`sendmail` with the message | |
| represented by an :class:`email.message.Message` object. The arguments have | |
| the same meaning as for :meth:`sendmail`, except that *msg* is a ``Message`` | |
| object. | |
| If *from_addr* is ``None`` or *to_addrs* is ``None``, ``send_message`` fills | |
| those arguments with addresses extracted from the headers of *msg* as | |
| specified in :rfc:`5322`\: *from_addr* is set to the :mailheader:`Sender` | |
| field if it is present, and otherwise to the :mailheader:`From` field. | |
| *to_addrs* combines the values (if any) of the :mailheader:`To`, | |
| :mailheader:`Cc`, and :mailheader:`Bcc` fields from *msg*. If exactly one | |
| set of :mailheader:`Resent-*` headers appear in the message, the regular | |
| headers are ignored and the :mailheader:`Resent-*` headers are used instead. | |
| If the message contains more than one set of :mailheader:`Resent-*` headers, | |
| a :exc:`ValueError` is raised, since there is no way to unambiguously detect | |
| the most recent set of :mailheader:`Resent-` headers. | |
| ``send_message`` serializes *msg* using | |
| :class:`~email.generator.BytesGenerator` with ``\r\n`` as the *linesep*, and | |
| calls :meth:`sendmail` to transmit the resulting message. Regardless of the | |
| values of *from_addr* and *to_addrs*, ``send_message`` does not transmit any | |
| :mailheader:`Bcc` or :mailheader:`Resent-Bcc` headers that may appear | |
| in *msg*. If any of the addresses in *from_addr* and *to_addrs* contain | |
| non-ASCII characters and the server does not advertise ``SMTPUTF8`` support, | |
| an :exc:`SMTPNotSupported` error is raised. Otherwise the ``Message`` is | |
| serialized with a clone of its :mod:`~email.policy` with the | |
| :attr:`~email.policy.EmailPolicy.utf8` attribute set to ``True``, and | |
| ``SMTPUTF8`` and ``BODY=8BITMIME`` are added to *mail_options*. | |
| .. versionadded:: 3.2 | |
| .. versionadded:: 3.5 | |
| Support for internationalized addresses (``SMTPUTF8``). | |
| .. method:: SMTP.quit() | |
| Terminate the SMTP session and close the connection. Return the result of | |
| the SMTP ``QUIT`` command. | |
| Low-level methods corresponding to the standard SMTP/ESMTP commands ``HELP``, | |
| ``RSET``, ``NOOP``, ``MAIL``, ``RCPT``, and ``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. | |
| .. _smtp-example: | |
| 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. :: | |
| import smtplib | |
| def prompt(prompt): | |
| return 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 True: | |
| try: | |
| line = 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() | |
| .. note:: | |
| In general, you will want to use the :mod:`email` package's features to | |
| construct an email message, which you can then send | |
| via :meth:`~smtplib.SMTP.send_message`; see :ref:`email-examples`. |