blob: 2682ee0c57308748e57daff5caea0ae27f0e18c8 [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
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
48 in :RFC:`6531`) should be enabled. The default is ``False``. If set to
49 ``True``, *decode_data* must be ``False`` (otherwise an error is raised).
50 When ``True``, ``SMTPUTF8`` is accepted as a parameter to the ``MAIL``
51 command and when present is passed to :meth:`process_message` in the
52 ``kwargs['mail_options']`` list.
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
55 should be decoded using UTF-8. The default is ``True`` for backward
R David Murraya33df312015-05-11 12:11:40 -040056 compatibility reasons, but will change to ``False`` in Python 3.6; specify
57 the keyword value explicitly to avoid the :exc:`DeprecationWarning`. When
58 *decode_data* is set to ``False`` the server advertises the ``8BITMIME``
59 extension (:rfc:`6152`), accepts the ``BODY=8BITMIME`` parameter to
60 the ``MAIL`` command, and when present passes it to :meth:`process_message`
61 in the ``kwargs['mail_options']`` list.
R David Murray554bcbf2014-06-11 11:18:08 -040062
R David Murraya33df312015-05-11 12:11:40 -040063 .. method:: process_message(peer, mailfrom, rcpttos, data, **kwargs)
Georg Brandl116aa622007-08-15 14:28:22 +000064
R David Murray2539e672014-08-09 16:40:49 -040065 Raise a :exc:`NotImplementedError` exception. Override this in subclasses to
Benjamin Petersone41251e2008-04-25 01:59:09 +000066 do something useful with this message. Whatever was passed in the
67 constructor as *remoteaddr* will be available as the :attr:`_remoteaddr`
68 attribute. *peer* is the remote host's address, *mailfrom* is the envelope
69 originator, *rcpttos* are the envelope recipients and *data* is a string
R David Murray2539e672014-08-09 16:40:49 -040070 containing the contents of the e-mail (which should be in :rfc:`5321`
Benjamin Petersone41251e2008-04-25 01:59:09 +000071 format).
Georg Brandl116aa622007-08-15 14:28:22 +000072
R David Murray554bcbf2014-06-11 11:18:08 -040073 If the *decode_data* constructor keyword is set to ``True``, the *data*
74 argument will be a unicode string. If it is set to ``False``, it
75 will be a bytes object.
76
R David Murraya33df312015-05-11 12:11:40 -040077 *kwargs* is a dictionary containing additional information. It is empty
78 unless at least one of ``decode_data=False`` or ``enable_SMTPUTF8=True``
79 was given as an init parameter, in which case it contains the following
80 keys:
81
82 *mail_options*:
83 a list of all received parameters to the ``MAIL``
84 command (the elements are uppercase strings; example:
85 ``['BODY=8BITMIME', 'SMTPUTF8']``).
86
87 *rcpt_options*:
88 same as *mail_options* but for the ``RCPT`` command.
89 Currently no ``RCPT TO`` options are supported, so for now
90 this will always be an empty list.
91
R David Murray31137652015-05-16 14:16:33 -040092 Implementations of ``process_message`` should use the ``**kwargs``
93 signature to accept arbitrary keword arguments, since future feature
94 enhancements may add keys to the kwargs dictionary.
95
R David Murray2539e672014-08-09 16:40:49 -040096 Return ``None`` to request a normal ``250 Ok`` response; otherwise
97 return the desired response string in :RFC:`5321` format.
98
Richard Jones803ef8a2010-07-24 09:51:40 +000099 .. attribute:: channel_class
100
101 Override this in subclasses to use a custom :class:`SMTPChannel` for
102 managing SMTP clients.
103
R David Murraya33df312015-05-11 12:11:40 -0400104 .. versionadded:: 3.4
105 The *map* constructor argument.
Vinay Sajip30298b42013-06-07 15:21:41 +0100106
R David Murray2539e672014-08-09 16:40:49 -0400107 .. versionchanged:: 3.5
108 *localaddr* and *remoteaddr* may now contain IPv6 addresses.
109
110 .. versionadded:: 3.5
111 the *decode_data* and *enable_SMTPUTF8* constructor arguments, and the
R David Murraya33df312015-05-11 12:11:40 -0400112 *kwargs* argument to :meth:`process_message` when one or more of these is
113 specified.
R David Murray554bcbf2014-06-11 11:18:08 -0400114
Georg Brandl116aa622007-08-15 14:28:22 +0000115
116DebuggingServer Objects
117-----------------------
118
119
120.. class:: DebuggingServer(localaddr, remoteaddr)
121
122 Create a new debugging server. Arguments are as per :class:`SMTPServer`.
123 Messages will be discarded, and printed on stdout.
124
125
126PureProxy Objects
127-----------------
128
129
130.. class:: PureProxy(localaddr, remoteaddr)
131
132 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
133 Everything will be relayed to *remoteaddr*. Note that running this has a good
134 chance to make you into an open relay, so please be careful.
135
136
137MailmanProxy Objects
138--------------------
139
140
141.. class:: MailmanProxy(localaddr, remoteaddr)
142
143 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
144 Everything will be relayed to *remoteaddr*, unless local mailman configurations
145 knows about an address, in which case it will be handled via mailman. Note that
146 running this has a good chance to make you into an open relay, so please be
147 careful.
148
Richard Jones803ef8a2010-07-24 09:51:40 +0000149SMTPChannel Objects
150-------------------
151
Serhiy Storchaka98b28fd2013-10-13 23:12:09 +0300152.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432,\
R David Murray2539e672014-08-09 16:40:49 -0400153 map=None, enable_SMTPUTF8=False, decode_data=True)
Richard Jones803ef8a2010-07-24 09:51:40 +0000154
155 Create a new :class:`SMTPChannel` object which manages the communication
156 between the server and a single SMTP client.
157
Vinay Sajip30298b42013-06-07 15:21:41 +0100158 *conn* and *addr* are as per the instance variables described below.
159
160 *data_size_limit* specifies the maximum number of bytes that will be
161 accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
162 limit.
163
R David Murray2539e672014-08-09 16:40:49 -0400164 *enable_SMTPUTF8* determins whether the ``SMTPUTF8`` extension (as defined
165 in :RFC:`6531`) should be enabled. The default is ``False``. A
166 :exc:`ValueError` is raised if both *enable_SMTPUTF8* and *decode_data* are
167 set to ``True`` at the same time.
168
Vinay Sajip30298b42013-06-07 15:21:41 +0100169 A dictionary can be specified in *map* to avoid using a global socket map.
170
R David Murray554bcbf2014-06-11 11:18:08 -0400171 *decode_data* specifies whether the data portion of the SMTP transaction
172 should be decoded using UTF-8. The default is ``True`` for backward
173 compatibility reasons, but will change to ``False`` in Python 3.6. Specify
174 the keyword value explicitly to avoid the :exc:`DeprecationWarning`.
175
Richard Jones803ef8a2010-07-24 09:51:40 +0000176 To use a custom SMTPChannel implementation you need to override the
177 :attr:`SMTPServer.channel_class` of your :class:`SMTPServer`.
178
R David Murray554bcbf2014-06-11 11:18:08 -0400179 .. versionchanged:: 3.5
R David Murray2539e672014-08-09 16:40:49 -0400180 the *decode_data* and *enable_SMTPUTF8* arguments were added.
R David Murray554bcbf2014-06-11 11:18:08 -0400181
Richard Jones803ef8a2010-07-24 09:51:40 +0000182 The :class:`SMTPChannel` has the following instance variables:
183
184 .. attribute:: smtp_server
185
186 Holds the :class:`SMTPServer` that spawned this channel.
187
188 .. attribute:: conn
189
190 Holds the socket object connecting to the client.
191
192 .. attribute:: addr
193
194 Holds the address of the client, the second value returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300195 :func:`socket.accept <socket.socket.accept>`
Richard Jones803ef8a2010-07-24 09:51:40 +0000196
197 .. attribute:: received_lines
198
199 Holds a list of the line strings (decoded using UTF-8) received from
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300200 the client. The lines have their ``"\r\n"`` line ending translated to
201 ``"\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000202
203 .. attribute:: smtp_state
204
205 Holds the current state of the channel. This will be either
206 :attr:`COMMAND` initially and then :attr:`DATA` after the client sends
207 a "DATA" line.
208
209 .. attribute:: seen_greeting
210
211 Holds a string containing the greeting sent by the client in its "HELO".
212
213 .. attribute:: mailfrom
214
215 Holds a string containing the address identified in the "MAIL FROM:" line
216 from the client.
217
218 .. attribute:: rcpttos
219
220 Holds a list of strings containing the addresses identified in the
221 "RCPT TO:" lines from the client.
222
223 .. attribute:: received_data
224
225 Holds a string containing all of the data sent by the client during the
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300226 DATA state, up to but not including the terminating ``"\r\n.\r\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000227
228 .. attribute:: fqdn
229
230 Holds the fully-qualified domain name of the server as returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300231 :func:`socket.getfqdn`.
Richard Jones803ef8a2010-07-24 09:51:40 +0000232
233 .. attribute:: peer
234
235 Holds the name of the client peer as returned by ``conn.getpeername()``
236 where ``conn`` is :attr:`conn`.
237
238 The :class:`SMTPChannel` operates by invoking methods named ``smtp_<command>``
239 upon reception of a command line from the client. Built into the base
240 :class:`SMTPChannel` class are methods for handling the following commands
241 (and responding to them appropriately):
242
243 ======== ===================================================================
244 Command Action taken
245 ======== ===================================================================
246 HELO Accepts the greeting from the client and stores it in
R David Murrayd1a30c92012-05-26 14:33:59 -0400247 :attr:`seen_greeting`. Sets server to base command mode.
248 EHLO Accepts the greeting from the client and stores it in
249 :attr:`seen_greeting`. Sets server to extended command mode.
Richard Jones803ef8a2010-07-24 09:51:40 +0000250 NOOP Takes no action.
251 QUIT Closes the connection cleanly.
252 MAIL Accepts the "MAIL FROM:" syntax and stores the supplied address as
R David Murrayd1a30c92012-05-26 14:33:59 -0400253 :attr:`mailfrom`. In extended command mode, accepts the
254 :rfc:`1870` SIZE attribute and responds appropriately based on the
Ezio Melottia58d8b02012-09-20 09:09:24 +0300255 value of *data_size_limit*.
Richard Jones803ef8a2010-07-24 09:51:40 +0000256 RCPT Accepts the "RCPT TO:" syntax and stores the supplied addresses in
257 the :attr:`rcpttos` list.
258 RSET Resets the :attr:`mailfrom`, :attr:`rcpttos`, and
259 :attr:`received_data`, but not the greeting.
260 DATA Sets the internal state to :attr:`DATA` and stores remaining lines
261 from the client in :attr:`received_data` until the terminator
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300262 ``"\r\n.\r\n"`` is received.
R David Murrayd1a30c92012-05-26 14:33:59 -0400263 HELP Returns minimal information on command syntax
264 VRFY Returns code 252 (the server doesn't know if the address is valid)
265 EXPN Reports that the command is not implemented.
Raymond Hettinger469271d2011-01-27 20:38:46 +0000266 ======== ===================================================================