blob: 575dcec9946211510bbeeffda976ac61f5b2bfb1 [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 Murray2539e672014-08-09 16:40:49 -040092 Return ``None`` to request a normal ``250 Ok`` response; otherwise
93 return the desired response string in :RFC:`5321` format.
94
Richard Jones803ef8a2010-07-24 09:51:40 +000095 .. attribute:: channel_class
96
97 Override this in subclasses to use a custom :class:`SMTPChannel` for
98 managing SMTP clients.
99
R David Murraya33df312015-05-11 12:11:40 -0400100 .. versionadded:: 3.4
101 The *map* constructor argument.
Vinay Sajip30298b42013-06-07 15:21:41 +0100102
R David Murray2539e672014-08-09 16:40:49 -0400103 .. versionchanged:: 3.5
104 *localaddr* and *remoteaddr* may now contain IPv6 addresses.
105
106 .. versionadded:: 3.5
107 the *decode_data* and *enable_SMTPUTF8* constructor arguments, and the
R David Murraya33df312015-05-11 12:11:40 -0400108 *kwargs* argument to :meth:`process_message` when one or more of these is
109 specified.
R David Murray554bcbf2014-06-11 11:18:08 -0400110
Georg Brandl116aa622007-08-15 14:28:22 +0000111
112DebuggingServer Objects
113-----------------------
114
115
116.. class:: DebuggingServer(localaddr, remoteaddr)
117
118 Create a new debugging server. Arguments are as per :class:`SMTPServer`.
119 Messages will be discarded, and printed on stdout.
120
121
122PureProxy Objects
123-----------------
124
125
126.. class:: PureProxy(localaddr, remoteaddr)
127
128 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
129 Everything will be relayed to *remoteaddr*. Note that running this has a good
130 chance to make you into an open relay, so please be careful.
131
132
133MailmanProxy Objects
134--------------------
135
136
137.. class:: MailmanProxy(localaddr, remoteaddr)
138
139 Create a new pure proxy server. Arguments are as per :class:`SMTPServer`.
140 Everything will be relayed to *remoteaddr*, unless local mailman configurations
141 knows about an address, in which case it will be handled via mailman. Note that
142 running this has a good chance to make you into an open relay, so please be
143 careful.
144
Richard Jones803ef8a2010-07-24 09:51:40 +0000145SMTPChannel Objects
146-------------------
147
Serhiy Storchaka98b28fd2013-10-13 23:12:09 +0300148.. class:: SMTPChannel(server, conn, addr, data_size_limit=33554432,\
R David Murray2539e672014-08-09 16:40:49 -0400149 map=None, enable_SMTPUTF8=False, decode_data=True)
Richard Jones803ef8a2010-07-24 09:51:40 +0000150
151 Create a new :class:`SMTPChannel` object which manages the communication
152 between the server and a single SMTP client.
153
Vinay Sajip30298b42013-06-07 15:21:41 +0100154 *conn* and *addr* are as per the instance variables described below.
155
156 *data_size_limit* specifies the maximum number of bytes that will be
157 accepted in a ``DATA`` command. A value of ``None`` or ``0`` means no
158 limit.
159
R David Murray2539e672014-08-09 16:40:49 -0400160 *enable_SMTPUTF8* determins whether the ``SMTPUTF8`` extension (as defined
161 in :RFC:`6531`) should be enabled. The default is ``False``. A
162 :exc:`ValueError` is raised if both *enable_SMTPUTF8* and *decode_data* are
163 set to ``True`` at the same time.
164
Vinay Sajip30298b42013-06-07 15:21:41 +0100165 A dictionary can be specified in *map* to avoid using a global socket map.
166
R David Murray554bcbf2014-06-11 11:18:08 -0400167 *decode_data* specifies whether the data portion of the SMTP transaction
168 should be decoded using UTF-8. The default is ``True`` for backward
169 compatibility reasons, but will change to ``False`` in Python 3.6. Specify
170 the keyword value explicitly to avoid the :exc:`DeprecationWarning`.
171
Richard Jones803ef8a2010-07-24 09:51:40 +0000172 To use a custom SMTPChannel implementation you need to override the
173 :attr:`SMTPServer.channel_class` of your :class:`SMTPServer`.
174
R David Murray554bcbf2014-06-11 11:18:08 -0400175 .. versionchanged:: 3.5
R David Murray2539e672014-08-09 16:40:49 -0400176 the *decode_data* and *enable_SMTPUTF8* arguments were added.
R David Murray554bcbf2014-06-11 11:18:08 -0400177
Richard Jones803ef8a2010-07-24 09:51:40 +0000178 The :class:`SMTPChannel` has the following instance variables:
179
180 .. attribute:: smtp_server
181
182 Holds the :class:`SMTPServer` that spawned this channel.
183
184 .. attribute:: conn
185
186 Holds the socket object connecting to the client.
187
188 .. attribute:: addr
189
190 Holds the address of the client, the second value returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300191 :func:`socket.accept <socket.socket.accept>`
Richard Jones803ef8a2010-07-24 09:51:40 +0000192
193 .. attribute:: received_lines
194
195 Holds a list of the line strings (decoded using UTF-8) received from
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300196 the client. The lines have their ``"\r\n"`` line ending translated to
197 ``"\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000198
199 .. attribute:: smtp_state
200
201 Holds the current state of the channel. This will be either
202 :attr:`COMMAND` initially and then :attr:`DATA` after the client sends
203 a "DATA" line.
204
205 .. attribute:: seen_greeting
206
207 Holds a string containing the greeting sent by the client in its "HELO".
208
209 .. attribute:: mailfrom
210
211 Holds a string containing the address identified in the "MAIL FROM:" line
212 from the client.
213
214 .. attribute:: rcpttos
215
216 Holds a list of strings containing the addresses identified in the
217 "RCPT TO:" lines from the client.
218
219 .. attribute:: received_data
220
221 Holds a string containing all of the data sent by the client during the
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300222 DATA state, up to but not including the terminating ``"\r\n.\r\n"``.
Richard Jones803ef8a2010-07-24 09:51:40 +0000223
224 .. attribute:: fqdn
225
226 Holds the fully-qualified domain name of the server as returned by
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300227 :func:`socket.getfqdn`.
Richard Jones803ef8a2010-07-24 09:51:40 +0000228
229 .. attribute:: peer
230
231 Holds the name of the client peer as returned by ``conn.getpeername()``
232 where ``conn`` is :attr:`conn`.
233
234 The :class:`SMTPChannel` operates by invoking methods named ``smtp_<command>``
235 upon reception of a command line from the client. Built into the base
236 :class:`SMTPChannel` class are methods for handling the following commands
237 (and responding to them appropriately):
238
239 ======== ===================================================================
240 Command Action taken
241 ======== ===================================================================
242 HELO Accepts the greeting from the client and stores it in
R David Murrayd1a30c92012-05-26 14:33:59 -0400243 :attr:`seen_greeting`. Sets server to base command mode.
244 EHLO Accepts the greeting from the client and stores it in
245 :attr:`seen_greeting`. Sets server to extended command mode.
Richard Jones803ef8a2010-07-24 09:51:40 +0000246 NOOP Takes no action.
247 QUIT Closes the connection cleanly.
248 MAIL Accepts the "MAIL FROM:" syntax and stores the supplied address as
R David Murrayd1a30c92012-05-26 14:33:59 -0400249 :attr:`mailfrom`. In extended command mode, accepts the
250 :rfc:`1870` SIZE attribute and responds appropriately based on the
Ezio Melottia58d8b02012-09-20 09:09:24 +0300251 value of *data_size_limit*.
Richard Jones803ef8a2010-07-24 09:51:40 +0000252 RCPT Accepts the "RCPT TO:" syntax and stores the supplied addresses in
253 the :attr:`rcpttos` list.
254 RSET Resets the :attr:`mailfrom`, :attr:`rcpttos`, and
255 :attr:`received_data`, but not the greeting.
256 DATA Sets the internal state to :attr:`DATA` and stores remaining lines
257 from the client in :attr:`received_data` until the terminator
Ezio Melotti8bbcb582012-09-20 09:06:51 +0300258 ``"\r\n.\r\n"`` is received.
R David Murrayd1a30c92012-05-26 14:33:59 -0400259 HELP Returns minimal information on command syntax
260 VRFY Returns code 252 (the server doesn't know if the address is valid)
261 EXPN Reports that the command is not implemented.
Raymond Hettinger469271d2011-01-27 20:38:46 +0000262 ======== ===================================================================