blob: 080411b66407104e59447e03705483d1e585f112 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`smtpd` --- SMTP Server
2============================
3
4.. module:: smtpd
5 :synopsis: A SMTP server implementation in Python.
6
Andrew Kuchling587e9702013-11-12 10:02:35 -05007.. moduleauthor:: Barry Warsaw <barry@python.org>
Georg Brandl116aa622007-08-15 14:28:22 +00008.. sectionauthor:: Moshe Zadka <moshez@moshez.org>
9
Raymond Hettinger469271d2011-01-27 20:38:46 +000010**Source code:** :source:`Lib/smtpd.py`
Georg Brandl116aa622007-08-15 14:28:22 +000011
Raymond Hettinger469271d2011-01-27 20:38:46 +000012--------------
Georg Brandl116aa622007-08-15 14:28:22 +000013
Richard Jones803ef8a2010-07-24 09:51:40 +000014This module offers several classes to implement SMTP (email) servers.
15
16Several server implementations are present; one is a generic
Georg Brandl116aa622007-08-15 14:28:22 +000017do-nothing implementation, which can be overridden, while the other two offer
18specific mail-sending strategies.
19
Richard Jones803ef8a2010-07-24 09:51:40 +000020Additionally the SMTPChannel may be extended to implement very specific
21interaction behaviour with SMTP clients.
Georg Brandl116aa622007-08-15 14:28:22 +000022
R David Murray2539e672014-08-09 16:40:49 -040023The code supports :RFC:`5321`, plus the :rfc:`1870` SIZE and :rfc:`6531`
24SMTPUTF8 extensions.
R David Murrayd1a30c92012-05-26 14:33:59 -040025
26
Georg Brandl116aa622007-08-15 14:28:22 +000027SMTPServer Objects
28------------------
29
30
Serhiy Storchaka98b28fd2013-10-13 23:12:09 +030031.. class:: SMTPServer(localaddr, remoteaddr, data_size_limit=33554432,\
R David Murray2539e672014-08-09 16:40:49 -040032 map=None, enable_SMTPUTF8=False, decode_data=True)
Georg Brandl116aa622007-08-15 14:28:22 +000033
34 Create a new :class:`SMTPServer` object, which binds to local address
R David Murray6b46ec72016-09-07 14:01:23 -040035 *localaddr*. It will treat *remoteaddr* as an upstream SMTP relayer. Both
36 *localaddr* and *remoteaddr* should be a :ref:`(host, port) <host_port>`
37 tuple. The object inherits from :class:`asyncore.dispatcher`, and so will
38 insert itself into :mod:`asyncore`'s event loop on instantiation.
Georg Brandl116aa622007-08-15 14:28:22 +000039
R David Murrayd1a30c92012-05-26 14:33:59 -040040 *data_size_limit* specifies the maximum number of bytes that will be
41 accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
42 limit.
43
R David Murraya33df312015-05-11 12:11:40 -040044 *map* is the socket map to use for connections (an initially empty
45 dictionary is a suitable value). If not specified the :mod:`asyncore`
46 global socket map is used.
R David Murray2539e672014-08-09 16:40:49 -040047
R David Murraya33df312015-05-11 12:11:40 -040048 *enable_SMTPUTF8* determins whether the ``SMTPUTF8`` extension (as defined
49 in :RFC:`6531`) should be enabled. The default is ``False``. If set to
50 ``True``, *decode_data* must be ``False`` (otherwise an error is raised).
51 When ``True``, ``SMTPUTF8`` is accepted as a parameter to the ``MAIL``
52 command and when present is passed to :meth:`process_message` in the
53 ``kwargs['mail_options']`` list.
Vinay Sajip30298b42013-06-07 15:21:41 +010054
R David Murray554bcbf2014-06-11 11:18:08 -040055 *decode_data* specifies whether the data portion of the SMTP transaction
56 should be decoded using UTF-8. The default is ``True`` for backward
R David Murraya33df312015-05-11 12:11:40 -040057 compatibility reasons, but will change to ``False`` in Python 3.6; specify
58 the keyword value explicitly to avoid the :exc:`DeprecationWarning`. When
59 *decode_data* is set to ``False`` the server advertises the ``8BITMIME``
60 extension (:rfc:`6152`), accepts the ``BODY=8BITMIME`` parameter to
61 the ``MAIL`` command, and when present passes it to :meth:`process_message`
62 in the ``kwargs['mail_options']`` list.
R David Murray554bcbf2014-06-11 11:18:08 -040063
R David Murraya33df312015-05-11 12:11:40 -040064 .. method:: process_message(peer, mailfrom, rcpttos, data, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +000065
R David Murray2539e672014-08-09 16:40:49 -040066 Raise a :exc:`NotImplementedError` exception. Override this in subclasses to
Benjamin Petersone41251e2008-04-25 01:59:09 +000067 do something useful with this message. Whatever was passed in the
68 constructor as *remoteaddr* will be available as the :attr:`_remoteaddr`
69 attribute. *peer* is the remote host's address, *mailfrom* is the envelope
70 originator, *rcpttos* are the envelope recipients and *data* is a string
R David Murray2539e672014-08-09 16:40:49 -040071 containing the contents of the e-mail (which should be in :rfc:`5321`
Benjamin Petersone41251e2008-04-25 01:59:09 +000072 format).
Georg Brandl116aa622007-08-15 14:28:22 +000073
R David Murray554bcbf2014-06-11 11:18:08 -040074 If the *decode_data* constructor keyword is set to ``True``, the *data*
75 argument will be a unicode string. If it is set to ``False``, it
76 will be a bytes object.
77
R David Murraya33df312015-05-11 12:11:40 -040078 *kwargs* is a dictionary containing additional information. It is empty
79 unless at least one of ``decode_data=False`` or ``enable_SMTPUTF8=True``
80 was given as an init parameter, in which case it contains the following
81 keys:
82
83 *mail_options*:
84 a list of all received parameters to the ``MAIL``
85 command (the elements are uppercase strings; example:
86 ``['BODY=8BITMIME', 'SMTPUTF8']``).
87
88 *rcpt_options*:
89 same as *mail_options* but for the ``RCPT`` command.
90 Currently no ``RCPT TO`` options are supported, so for now
91 this will always be an empty list.
92
R David Murray31137652015-05-16 14:16:33 -040093 Implementations of ``process_message`` should use the ``**kwargs``
R David Murraye09b42c2015-05-19 07:18:39 -040094 signature to accept arbitrary keyword arguments, since future feature
R David Murray31137652015-05-16 14:16:33 -040095 enhancements may add keys to the kwargs dictionary.
96
R David Murray2539e672014-08-09 16:40:49 -040097 Return ``None`` to request a normal ``250 Ok`` response; otherwise
98 return the desired response string in :RFC:`5321` format.
99
Richard Jones803ef8a2010-07-24 09:51:40 +0000100 .. attribute:: channel_class
101
102 Override this in subclasses to use a custom :class:`SMTPChannel` for
103 managing SMTP clients.
104
R David Murraya33df312015-05-11 12:11:40 -0400105 .. versionadded:: 3.4
106 The *map* constructor argument.
Vinay Sajip30298b42013-06-07 15:21:41 +0100107
R David Murray2539e672014-08-09 16:40:49 -0400108 .. versionchanged:: 3.5
109 *localaddr* and *remoteaddr* may now contain IPv6 addresses.
110
111 .. versionadded:: 3.5
112 the *decode_data* and *enable_SMTPUTF8* constructor arguments, and the
R David Murraya33df312015-05-11 12:11:40 -0400113 *kwargs* argument to :meth:`process_message` when one or more of these is
114 specified.
R David Murray554bcbf2014-06-11 11:18:08 -0400115
Georg Brandl116aa622007-08-15 14:28:22 +0000116
117DebuggingServer Objects
118-----------------------
119
120
121.. class:: DebuggingServer(localaddr, remoteaddr)
122
123 Create a new debugging server. Arguments are as per :class:`SMTPServer`.
124 Messages will be discarded, and printed on stdout.
125
126
127PureProxy Objects
128-----------------
129
130
131.. class:: PureProxy(localaddr, remoteaddr)
132
133 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
134 Everything will be relayed to *remoteaddr*. Note that running this has a good
135 chance to make you into an open relay, so please be careful.
136
137
138MailmanProxy Objects
139--------------------
140
141
142.. class:: MailmanProxy(localaddr, remoteaddr)
143
144 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
145 Everything will be relayed to *remoteaddr*, unless local mailman configurations
146 knows about an address, in which case it will be handled via mailman. Note that
147 running this has a good chance to make you into an open relay, so please be
148 careful.
149
Richard Jones803ef8a2010-07-24 09:51:40 +0000150SMTPChannel Objects
151-------------------
152
Serhiy Storchaka98b28fd2013-10-13 23:12:09 +0300153.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432,\
R David Murray2539e672014-08-09 16:40:49 -0400154 map=None, enable_SMTPUTF8=False, decode_data=True)
Richard Jones803ef8a2010-07-24 09:51:40 +0000155
156 Create a new :class:`SMTPChannel` object which manages the communication
157 between the server and a single SMTP client.
158
Vinay Sajip30298b42013-06-07 15:21:41 +0100159 *conn* and *addr* are as per the instance variables described below.
160
161 *data_size_limit* specifies the maximum number of bytes that will be
162 accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
163 limit.
164
R David Murray2539e672014-08-09 16:40:49 -0400165 *enable_SMTPUTF8* determins whether the ``SMTPUTF8`` extension (as defined
166 in :RFC:`6531`) should be enabled. The default is ``False``. A
167 :exc:`ValueError` is raised if both *enable_SMTPUTF8* and *decode_data* are
168 set to ``True`` at the same time.
169
Vinay Sajip30298b42013-06-07 15:21:41 +0100170 A dictionary can be specified in *map* to avoid using a global socket map.
171
R David Murray554bcbf2014-06-11 11:18:08 -0400172 *decode_data* specifies whether the data portion of the SMTP transaction
173 should be decoded using UTF-8. The default is ``True`` for backward
174 compatibility reasons, but will change to ``False`` in Python 3.6. Specify
175 the keyword value explicitly to avoid the :exc:`DeprecationWarning`.
176
Richard Jones803ef8a2010-07-24 09:51:40 +0000177 To use a custom SMTPChannel implementation you need to override the
178 :attr:`SMTPServer.channel_class` of your :class:`SMTPServer`.
179
R David Murray554bcbf2014-06-11 11:18:08 -0400180 .. versionchanged:: 3.5
R David Murray2539e672014-08-09 16:40:49 -0400181 the *decode_data* and *enable_SMTPUTF8* arguments were added.
R David Murray554bcbf2014-06-11 11:18:08 -0400182
Richard Jones803ef8a2010-07-24 09:51:40 +0000183 The :class:`SMTPChannel` has the following instance variables:
184
185 .. attribute:: smtp_server
186
187 Holds the :class:`SMTPServer` that spawned this channel.
188
189 .. attribute:: conn
190
191 Holds the socket object connecting to the client.
192
193 .. attribute:: addr
194
195 Holds the address of the client, the second value returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300196 :func:`socket.accept <socket.socket.accept>`
Richard Jones803ef8a2010-07-24 09:51:40 +0000197
198 .. attribute:: received_lines
199
200 Holds a list of the line strings (decoded using UTF-8) received from
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300201 the client. The lines have their ``"\r\n"`` line ending translated to
202 ``"\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000203
204 .. attribute:: smtp_state
205
206 Holds the current state of the channel. This will be either
207 :attr:`COMMAND` initially and then :attr:`DATA` after the client sends
208 a "DATA" line.
209
210 .. attribute:: seen_greeting
211
212 Holds a string containing the greeting sent by the client in its "HELO".
213
214 .. attribute:: mailfrom
215
216 Holds a string containing the address identified in the "MAIL FROM:" line
217 from the client.
218
219 .. attribute:: rcpttos
220
221 Holds a list of strings containing the addresses identified in the
222 "RCPT TO:" lines from the client.
223
224 .. attribute:: received_data
225
226 Holds a string containing all of the data sent by the client during the
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300227 DATA state, up to but not including the terminating ``"\r\n.\r\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000228
229 .. attribute:: fqdn
230
231 Holds the fully-qualified domain name of the server as returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300232 :func:`socket.getfqdn`.
Richard Jones803ef8a2010-07-24 09:51:40 +0000233
234 .. attribute:: peer
235
236 Holds the name of the client peer as returned by ``conn.getpeername()``
237 where ``conn`` is :attr:`conn`.
238
239 The :class:`SMTPChannel` operates by invoking methods named ``smtp_<command>``
240 upon reception of a command line from the client. Built into the base
241 :class:`SMTPChannel` class are methods for handling the following commands
242 (and responding to them appropriately):
243
244 ======== ===================================================================
245 Command Action taken
246 ======== ===================================================================
247 HELO Accepts the greeting from the client and stores it in
R David Murrayd1a30c92012-05-26 14:33:59 -0400248 :attr:`seen_greeting`. Sets server to base command mode.
249 EHLO Accepts the greeting from the client and stores it in
250 :attr:`seen_greeting`. Sets server to extended command mode.
Richard Jones803ef8a2010-07-24 09:51:40 +0000251 NOOP Takes no action.
252 QUIT Closes the connection cleanly.
253 MAIL Accepts the "MAIL FROM:" syntax and stores the supplied address as
R David Murrayd1a30c92012-05-26 14:33:59 -0400254 :attr:`mailfrom`. In extended command mode, accepts the
255 :rfc:`1870` SIZE attribute and responds appropriately based on the
Ezio Melottia58d8b02012-09-20 09:09:24 +0300256 value of *data_size_limit*.
Richard Jones803ef8a2010-07-24 09:51:40 +0000257 RCPT Accepts the "RCPT TO:" syntax and stores the supplied addresses in
258 the :attr:`rcpttos` list.
259 RSET Resets the :attr:`mailfrom`, :attr:`rcpttos`, and
260 :attr:`received_data`, but not the greeting.
261 DATA Sets the internal state to :attr:`DATA` and stores remaining lines
262 from the client in :attr:`received_data` until the terminator
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300263 ``"\r\n.\r\n"`` is received.
R David Murrayd1a30c92012-05-26 14:33:59 -0400264 HELP Returns minimal information on command syntax
265 VRFY Returns code 252 (the server doesn't know if the address is valid)
266 EXPN Reports that the command is not implemented.
Raymond Hettinger469271d2011-01-27 20:38:46 +0000267 ======== ===================================================================