blob: 2466e38f1163bb1d2503f3842cc575ecabfd10be [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,\
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030032 map=None, enable_SMTPUTF8=False, decode_data=False)
Georg Brandl116aa622007-08-15 14:28:22 +000033
34 Create a new :class:`SMTPServer` object, which binds to local address
35 *localaddr*. It will treat *remoteaddr* as an upstream SMTP relayer. It
36 inherits from :class:`asyncore.dispatcher`, and so will insert itself into
37 :mod:`asyncore`'s event loop on instantiation.
38
R David Murrayd1a30c92012-05-26 14:33:59 -040039 *data_size_limit* specifies the maximum number of bytes that will be
40 accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
41 limit.
42
R David Murraya33df312015-05-11 12:11:40 -040043 *map* is the socket map to use for connections (an initially empty
44 dictionary is a suitable value). If not specified the :mod:`asyncore`
45 global socket map is used.
R David Murray2539e672014-08-09 16:40:49 -040046
R David Murraya33df312015-05-11 12:11:40 -040047 *enable_SMTPUTF8* determins whether the ``SMTPUTF8`` extension (as defined
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030048 in :RFC:`6531`) should be enabled. The default is ``False``.
R David Murraya33df312015-05-11 12:11:40 -040049 When ``True``, ``SMTPUTF8`` is accepted as a parameter to the ``MAIL``
50 command and when present is passed to :meth:`process_message` in the
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030051 ``kwargs['mail_options']`` list. *decode_data* and *enable_SMTPUTF8*
52 cannot be set to ``True`` at the same time.
Vinay Sajip30298b42013-06-07 15:21:41 +010053
R David Murray554bcbf2014-06-11 11:18:08 -040054 *decode_data* specifies whether the data portion of the SMTP transaction
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030055 should be decoded using UTF-8. The default is ``False``. When
56 *decode_data* is not set to ``True`` the server advertises the ``8BITMIME``
R David Murraya33df312015-05-11 12:11:40 -040057 extension (:rfc:`6152`), accepts the ``BODY=8BITMIME`` parameter to
58 the ``MAIL`` command, and when present passes it to :meth:`process_message`
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030059 in the ``kwargs['mail_options']`` list. *decode_data* and *enable_SMTPUTF8*
60 cannot be set to ``True`` at the same time.
R David Murray554bcbf2014-06-11 11:18:08 -040061
R David Murraya33df312015-05-11 12:11:40 -040062 .. method:: process_message(peer, mailfrom, rcpttos, data, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +000063
R David Murray2539e672014-08-09 16:40:49 -040064 Raise a :exc:`NotImplementedError` exception. Override this in subclasses to
Benjamin Petersone41251e2008-04-25 01:59:09 +000065 do something useful with this message. Whatever was passed in the
66 constructor as *remoteaddr* will be available as the :attr:`_remoteaddr`
67 attribute. *peer* is the remote host's address, *mailfrom* is the envelope
68 originator, *rcpttos* are the envelope recipients and *data* is a string
R David Murray2539e672014-08-09 16:40:49 -040069 containing the contents of the e-mail (which should be in :rfc:`5321`
Benjamin Petersone41251e2008-04-25 01:59:09 +000070 format).
Georg Brandl116aa622007-08-15 14:28:22 +000071
R David Murray554bcbf2014-06-11 11:18:08 -040072 If the *decode_data* constructor keyword is set to ``True``, the *data*
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030073 parameter will be a unicode string. If it is set to ``False``, it
R David Murray554bcbf2014-06-11 11:18:08 -040074 will be a bytes object.
75
R David Murraya33df312015-05-11 12:11:40 -040076 *kwargs* is a dictionary containing additional information. It is empty
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +030077 if ``decode_data=True`` was given as an init argument, otherwise
78 it contains the following keys:
R David Murraya33df312015-05-11 12:11:40 -040079
80 *mail_options*:
81 a list of all received parameters to the ``MAIL``
82 command (the elements are uppercase strings; example:
83 ``['BODY=8BITMIME', 'SMTPUTF8']``).
84
85 *rcpt_options*:
86 same as *mail_options* but for the ``RCPT`` command.
87 Currently no ``RCPT TO`` options are supported, so for now
88 this will always be an empty list.
89
R David Murray31137652015-05-16 14:16:33 -040090 Implementations of ``process_message`` should use the ``**kwargs``
R David Murraye09b42c2015-05-19 07:18:39 -040091 signature to accept arbitrary keyword arguments, since future feature
R David Murray31137652015-05-16 14:16:33 -040092 enhancements may add keys to the kwargs dictionary.
93
R David Murray2539e672014-08-09 16:40:49 -040094 Return ``None`` to request a normal ``250 Ok`` response; otherwise
95 return the desired response string in :RFC:`5321` format.
96
Richard Jones803ef8a2010-07-24 09:51:40 +000097 .. attribute:: channel_class
98
99 Override this in subclasses to use a custom :class:`SMTPChannel` for
100 managing SMTP clients.
101
R David Murraya33df312015-05-11 12:11:40 -0400102 .. versionadded:: 3.4
103 The *map* constructor argument.
Vinay Sajip30298b42013-06-07 15:21:41 +0100104
R David Murray2539e672014-08-09 16:40:49 -0400105 .. versionchanged:: 3.5
106 *localaddr* and *remoteaddr* may now contain IPv6 addresses.
107
108 .. versionadded:: 3.5
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300109 The *decode_data* and *enable_SMTPUTF8* constructor parameters, and the
110 *kwargs* parameter to :meth:`process_message` when one or more of these is
R David Murraya33df312015-05-11 12:11:40 -0400111 specified.
R David Murray554bcbf2014-06-11 11:18:08 -0400112
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300113 .. versionchanged:: 3.6
114 *decode_data* is now ``False`` by default.
115
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,\
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300154 map=None, enable_SMTPUTF8=False, decode_data=False)
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
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300166 in :RFC:`6531`) should be enabled. The default is ``False``.
167 *decode_data* and *enable_SMTPUTF8* cannot be set to ``True`` at the same
168 time.
R David Murray2539e672014-08-09 16:40:49 -0400169
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
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300173 should be decoded using UTF-8. The default is ``False``.
174 *decode_data* and *enable_SMTPUTF8* cannot be set to ``True`` at the same
175 time.
R David Murray554bcbf2014-06-11 11:18:08 -0400176
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
Serhiy Storchakacbcc2fd2016-05-16 09:36:31 +0300181 The *decode_data* and *enable_SMTPUTF8* parameters were added.
182
183 .. versionchanged:: 3.6
184 *decode_data* is now ``False`` by default.
R David Murray554bcbf2014-06-11 11:18:08 -0400185
Richard Jones803ef8a2010-07-24 09:51:40 +0000186 The :class:`SMTPChannel` has the following instance variables:
187
188 .. attribute:: smtp_server
189
190 Holds the :class:`SMTPServer` that spawned this channel.
191
192 .. attribute:: conn
193
194 Holds the socket object connecting to the client.
195
196 .. attribute:: addr
197
198 Holds the address of the client, the second value returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300199 :func:`socket.accept <socket.socket.accept>`
Richard Jones803ef8a2010-07-24 09:51:40 +0000200
201 .. attribute:: received_lines
202
203 Holds a list of the line strings (decoded using UTF-8) received from
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300204 the client. The lines have their ``"\r\n"`` line ending translated to
205 ``"\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000206
207 .. attribute:: smtp_state
208
209 Holds the current state of the channel. This will be either
210 :attr:`COMMAND` initially and then :attr:`DATA` after the client sends
211 a "DATA" line.
212
213 .. attribute:: seen_greeting
214
215 Holds a string containing the greeting sent by the client in its "HELO".
216
217 .. attribute:: mailfrom
218
219 Holds a string containing the address identified in the "MAIL FROM:" line
220 from the client.
221
222 .. attribute:: rcpttos
223
224 Holds a list of strings containing the addresses identified in the
225 "RCPT TO:" lines from the client.
226
227 .. attribute:: received_data
228
229 Holds a string containing all of the data sent by the client during the
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300230 DATA state, up to but not including the terminating ``"\r\n.\r\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000231
232 .. attribute:: fqdn
233
234 Holds the fully-qualified domain name of the server as returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300235 :func:`socket.getfqdn`.
Richard Jones803ef8a2010-07-24 09:51:40 +0000236
237 .. attribute:: peer
238
239 Holds the name of the client peer as returned by ``conn.getpeername()``
240 where ``conn`` is :attr:`conn`.
241
242 The :class:`SMTPChannel` operates by invoking methods named ``smtp_<command>``
243 upon reception of a command line from the client. Built into the base
244 :class:`SMTPChannel` class are methods for handling the following commands
245 (and responding to them appropriately):
246
247 ======== ===================================================================
248 Command Action taken
249 ======== ===================================================================
250 HELO Accepts the greeting from the client and stores it in
R David Murrayd1a30c92012-05-26 14:33:59 -0400251 :attr:`seen_greeting`. Sets server to base command mode.
252 EHLO Accepts the greeting from the client and stores it in
253 :attr:`seen_greeting`. Sets server to extended command mode.
Richard Jones803ef8a2010-07-24 09:51:40 +0000254 NOOP Takes no action.
255 QUIT Closes the connection cleanly.
256 MAIL Accepts the "MAIL FROM:" syntax and stores the supplied address as
R David Murrayd1a30c92012-05-26 14:33:59 -0400257 :attr:`mailfrom`. In extended command mode, accepts the
258 :rfc:`1870` SIZE attribute and responds appropriately based on the
Ezio Melottia58d8b02012-09-20 09:09:24 +0300259 value of *data_size_limit*.
Richard Jones803ef8a2010-07-24 09:51:40 +0000260 RCPT Accepts the "RCPT TO:" syntax and stores the supplied addresses in
261 the :attr:`rcpttos` list.
262 RSET Resets the :attr:`mailfrom`, :attr:`rcpttos`, and
263 :attr:`received_data`, but not the greeting.
264 DATA Sets the internal state to :attr:`DATA` and stores remaining lines
265 from the client in :attr:`received_data` until the terminator
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300266 ``"\r\n.\r\n"`` is received.
R David Murrayd1a30c92012-05-26 14:33:59 -0400267 HELP Returns minimal information on command syntax
268 VRFY Returns code 252 (the server doesn't know if the address is valid)
269 EXPN Reports that the command is not implemented.
Raymond Hettinger469271d2011-01-27 20:38:46 +0000270 ======== ===================================================================