~dkuhlman/python-training-materials/Materials

« back to all changes in this revision

Viewing changes to python-3.5.1-docs-html/library/smtpd.html

  • Committer: Dave Kuhlman
  • Date: 2017-04-15 16:24:56 UTC
  • Revision ID: dkuhlman@davekuhlman.org-20170415162456-iav9vozzg4iwqwv3
Updated docs

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
 
 
4
 
 
5
 
<html xmlns="http://www.w3.org/1999/xhtml">
6
 
  <head>
7
 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8
 
    
9
 
    <title>21.18. smtpd — SMTP Server &mdash; Python 3.5.1 documentation</title>
10
 
    
11
 
    <link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
12
 
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
13
 
    
14
 
    <script type="text/javascript">
15
 
      var DOCUMENTATION_OPTIONS = {
16
 
        URL_ROOT:    '../',
17
 
        VERSION:     '3.5.1',
18
 
        COLLAPSE_INDEX: false,
19
 
        FILE_SUFFIX: '.html',
20
 
        HAS_SOURCE:  true
21
 
      };
22
 
    </script>
23
 
    <script type="text/javascript" src="../_static/jquery.js"></script>
24
 
    <script type="text/javascript" src="../_static/underscore.js"></script>
25
 
    <script type="text/javascript" src="../_static/doctools.js"></script>
26
 
    <script type="text/javascript" src="../_static/sidebar.js"></script>
27
 
    <link rel="search" type="application/opensearchdescription+xml"
28
 
          title="Search within Python 3.5.1 documentation"
29
 
          href="../_static/opensearch.xml"/>
30
 
    <link rel="author" title="About these documents" href="../about.html" />
31
 
    <link rel="copyright" title="Copyright" href="../copyright.html" />
32
 
    <link rel="top" title="Python 3.5.1 documentation" href="../contents.html" />
33
 
    <link rel="up" title="21. Internet Protocols and Support" href="internet.html" />
34
 
    <link rel="next" title="21.19. telnetlib — Telnet client" href="telnetlib.html" />
35
 
    <link rel="prev" title="21.17. smtplib — SMTP protocol client" href="smtplib.html" />
36
 
    <link rel="shortcut icon" type="image/png" href="../_static/py.png" />
37
 
    <script type="text/javascript" src="../_static/copybutton.js"></script>
38
 
    <script type="text/javascript" src="../_static/version_switch.js"></script>
39
 
    
40
 
 
41
 
 
42
 
  </head>
43
 
  <body role="document">  
44
 
    <div class="related" role="navigation" aria-label="related navigation">
45
 
      <h3>Navigation</h3>
46
 
      <ul>
47
 
        <li class="right" style="margin-right: 10px">
48
 
          <a href="../genindex.html" title="General Index"
49
 
             accesskey="I">index</a></li>
50
 
        <li class="right" >
51
 
          <a href="../py-modindex.html" title="Python Module Index"
52
 
             >modules</a> |</li>
53
 
        <li class="right" >
54
 
          <a href="telnetlib.html" title="21.19. telnetlib — Telnet client"
55
 
             accesskey="N">next</a> |</li>
56
 
        <li class="right" >
57
 
          <a href="smtplib.html" title="21.17. smtplib — SMTP protocol client"
58
 
             accesskey="P">previous</a> |</li>
59
 
        <li><img src="../_static/py.png" alt=""
60
 
                 style="vertical-align: middle; margin-top: -1px"/></li>
61
 
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
62
 
        <li>
63
 
          <span class="version_switcher_placeholder">3.5.1</span>
64
 
          <a href="../index.html">Documentation </a> &raquo;
65
 
        </li>
66
 
 
67
 
          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
68
 
          <li class="nav-item nav-item-2"><a href="internet.html" accesskey="U">21. Internet Protocols and Support</a> &raquo;</li> 
69
 
      </ul>
70
 
    </div>    
71
 
 
72
 
    <div class="document">
73
 
      <div class="documentwrapper">
74
 
        <div class="bodywrapper">
75
 
          <div class="body" role="main">
76
 
            
77
 
  <div class="section" id="module-smtpd">
78
 
<span id="smtpd-smtp-server"></span><h1>21.18. <a class="reference internal" href="#module-smtpd" title="smtpd: A SMTP server implementation in Python."><code class="xref py py-mod docutils literal"><span class="pre">smtpd</span></code></a> &#8212; SMTP Server<a class="headerlink" href="#module-smtpd" title="Permalink to this headline">¶</a></h1>
79
 
<p><strong>Source code:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/smtpd.py">Lib/smtpd.py</a></p>
80
 
<hr class="docutils" />
81
 
<p>This module offers several classes to implement SMTP (email) servers.</p>
82
 
<p>Several server implementations are present; one is a generic
83
 
do-nothing implementation, which can be overridden, while the other two offer
84
 
specific mail-sending strategies.</p>
85
 
<p>Additionally the SMTPChannel may be extended to implement very specific
86
 
interaction behaviour with SMTP clients.</p>
87
 
<p>The code supports <span class="target" id="index-0"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc5321.html"><strong>RFC 5321</strong></a>, plus the <span class="target" id="index-1"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc1870.html"><strong>RFC 1870</strong></a> SIZE and <span class="target" id="index-2"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc6531.html"><strong>RFC 6531</strong></a>
88
 
SMTPUTF8 extensions.</p>
89
 
<div class="section" id="smtpserver-objects">
90
 
<h2>21.18.1. SMTPServer Objects<a class="headerlink" href="#smtpserver-objects" title="Permalink to this headline">¶</a></h2>
91
 
<dl class="class">
92
 
<dt id="smtpd.SMTPServer">
93
 
<em class="property">class </em><code class="descclassname">smtpd.</code><code class="descname">SMTPServer</code><span class="sig-paren">(</span><em>localaddr</em>, <em>remoteaddr</em>, <em>data_size_limit=33554432</em>, <em>map=None</em>, <em>enable_SMTPUTF8=False</em>, <em>decode_data=True</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.SMTPServer" title="Permalink to this definition">¶</a></dt>
94
 
<dd><p>Create a new <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a> object, which binds to local address
95
 
<em>localaddr</em>.  It will treat <em>remoteaddr</em> as an upstream SMTP relayer.  It
96
 
inherits from <a class="reference internal" href="asyncore.html#asyncore.dispatcher" title="asyncore.dispatcher"><code class="xref py py-class docutils literal"><span class="pre">asyncore.dispatcher</span></code></a>, and so will insert itself into
97
 
<a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal"><span class="pre">asyncore</span></code></a>&#8216;s event loop on instantiation.</p>
98
 
<p><em>data_size_limit</em> specifies the maximum number of bytes that will be
99
 
accepted in a <code class="docutils literal"><span class="pre">DATA</span></code> command.  A value of <code class="docutils literal"><span class="pre">None</span></code> or <code class="docutils literal"><span class="pre">0</span></code> means no
100
 
limit.</p>
101
 
<p><em>map</em> is the socket map to use for connections (an initially empty
102
 
dictionary is a suitable value).  If not specified the <a class="reference internal" href="asyncore.html#module-asyncore" title="asyncore: A base class for developing asynchronous socket handling services."><code class="xref py py-mod docutils literal"><span class="pre">asyncore</span></code></a>
103
 
global socket map is used.</p>
104
 
<p><em>enable_SMTPUTF8</em> determins whether the <code class="docutils literal"><span class="pre">SMTPUTF8</span></code> extension (as defined
105
 
in <span class="target" id="index-3"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc6531.html"><strong>RFC 6531</strong></a>) should be enabled.  The default is <code class="docutils literal"><span class="pre">False</span></code>.  If set to
106
 
<code class="docutils literal"><span class="pre">True</span></code>, <em>decode_data</em> must be <code class="docutils literal"><span class="pre">False</span></code> (otherwise an error is raised).
107
 
When <code class="docutils literal"><span class="pre">True</span></code>, <code class="docutils literal"><span class="pre">SMTPUTF8</span></code> is accepted as a parameter to the <code class="docutils literal"><span class="pre">MAIL</span></code>
108
 
command and when present is passed to <a class="reference internal" href="#smtpd.SMTPServer.process_message" title="smtpd.SMTPServer.process_message"><code class="xref py py-meth docutils literal"><span class="pre">process_message()</span></code></a> in the
109
 
<code class="docutils literal"><span class="pre">kwargs['mail_options']</span></code> list.</p>
110
 
<p><em>decode_data</em> specifies whether the data portion of the SMTP transaction
111
 
should be decoded using UTF-8.  The default is <code class="docutils literal"><span class="pre">True</span></code> for backward
112
 
compatibility reasons, but will change to <code class="docutils literal"><span class="pre">False</span></code> in Python 3.6; specify
113
 
the keyword value explicitly to avoid the <a class="reference internal" href="exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal"><span class="pre">DeprecationWarning</span></code></a>.  When
114
 
<em>decode_data</em> is set to <code class="docutils literal"><span class="pre">False</span></code> the server advertises the <code class="docutils literal"><span class="pre">8BITMIME</span></code>
115
 
extension (<span class="target" id="index-4"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc6152.html"><strong>RFC 6152</strong></a>), accepts the <code class="docutils literal"><span class="pre">BODY=8BITMIME</span></code> parameter to
116
 
the <code class="docutils literal"><span class="pre">MAIL</span></code> command, and when present passes it to <a class="reference internal" href="#smtpd.SMTPServer.process_message" title="smtpd.SMTPServer.process_message"><code class="xref py py-meth docutils literal"><span class="pre">process_message()</span></code></a>
117
 
in the <code class="docutils literal"><span class="pre">kwargs['mail_options']</span></code> list.</p>
118
 
<dl class="method">
119
 
<dt id="smtpd.SMTPServer.process_message">
120
 
<code class="descname">process_message</code><span class="sig-paren">(</span><em>peer</em>, <em>mailfrom</em>, <em>rcpttos</em>, <em>data</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.SMTPServer.process_message" title="Permalink to this definition">¶</a></dt>
121
 
<dd><p>Raise a <a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal"><span class="pre">NotImplementedError</span></code></a> exception. Override this in subclasses to
122
 
do something useful with this message. Whatever was passed in the
123
 
constructor as <em>remoteaddr</em> will be available as the <code class="xref py py-attr docutils literal"><span class="pre">_remoteaddr</span></code>
124
 
attribute. <em>peer</em> is the remote host&#8217;s address, <em>mailfrom</em> is the envelope
125
 
originator, <em>rcpttos</em> are the envelope recipients and <em>data</em> is a string
126
 
containing the contents of the e-mail (which should be in <span class="target" id="index-5"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc5321.html"><strong>RFC 5321</strong></a>
127
 
format).</p>
128
 
<p>If the <em>decode_data</em> constructor keyword is set to <code class="docutils literal"><span class="pre">True</span></code>, the <em>data</em>
129
 
argument will be a unicode string.  If it is set to <code class="docutils literal"><span class="pre">False</span></code>, it
130
 
will be a bytes object.</p>
131
 
<p><em>kwargs</em> is a dictionary containing additional information. It is empty
132
 
unless at least one of <code class="docutils literal"><span class="pre">decode_data=False</span></code> or <code class="docutils literal"><span class="pre">enable_SMTPUTF8=True</span></code>
133
 
was given as an init parameter, in which case it contains the following
134
 
keys:</p>
135
 
<blockquote>
136
 
<div><dl class="docutils">
137
 
<dt><em>mail_options</em>:</dt>
138
 
<dd>a list of all received parameters to the <code class="docutils literal"><span class="pre">MAIL</span></code>
139
 
command (the elements are uppercase strings; example:
140
 
<code class="docutils literal"><span class="pre">['BODY=8BITMIME',</span> <span class="pre">'SMTPUTF8']</span></code>).</dd>
141
 
<dt><em>rcpt_options</em>:</dt>
142
 
<dd>same as <em>mail_options</em> but for the <code class="docutils literal"><span class="pre">RCPT</span></code> command.
143
 
Currently no <code class="docutils literal"><span class="pre">RCPT</span> <span class="pre">TO</span></code> options are supported, so for now
144
 
this will always be an empty list.</dd>
145
 
</dl>
146
 
</div></blockquote>
147
 
<p>Implementations of <code class="docutils literal"><span class="pre">process_message</span></code> should use the <code class="docutils literal"><span class="pre">**kwargs</span></code>
148
 
signature to accept arbitrary keyword arguments, since future feature
149
 
enhancements may add keys to the kwargs dictionary.</p>
150
 
<p>Return <code class="docutils literal"><span class="pre">None</span></code> to request a normal <code class="docutils literal"><span class="pre">250</span> <span class="pre">Ok</span></code> response; otherwise
151
 
return the desired response string in <span class="target" id="index-6"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc5321.html"><strong>RFC 5321</strong></a> format.</p>
152
 
</dd></dl>
153
 
 
154
 
<dl class="attribute">
155
 
<dt id="smtpd.SMTPServer.channel_class">
156
 
<code class="descname">channel_class</code><a class="headerlink" href="#smtpd.SMTPServer.channel_class" title="Permalink to this definition">¶</a></dt>
157
 
<dd><p>Override this in subclasses to use a custom <a class="reference internal" href="#smtpd.SMTPChannel" title="smtpd.SMTPChannel"><code class="xref py py-class docutils literal"><span class="pre">SMTPChannel</span></code></a> for
158
 
managing SMTP clients.</p>
159
 
</dd></dl>
160
 
 
161
 
<div class="versionadded">
162
 
<p><span class="versionmodified">New in version 3.4: </span>The <em>map</em> constructor argument.</p>
163
 
</div>
164
 
<div class="versionchanged">
165
 
<p><span class="versionmodified">Changed in version 3.5: </span><em>localaddr</em> and <em>remoteaddr</em> may now contain IPv6 addresses.</p>
166
 
</div>
167
 
<div class="versionadded">
168
 
<p><span class="versionmodified">New in version 3.5: </span>the <em>decode_data</em> and <em>enable_SMTPUTF8</em> constructor arguments, and the
169
 
<em>kwargs</em> argument to <a class="reference internal" href="#smtpd.SMTPServer.process_message" title="smtpd.SMTPServer.process_message"><code class="xref py py-meth docutils literal"><span class="pre">process_message()</span></code></a> when one or more of these is
170
 
specified.</p>
171
 
</div>
172
 
</dd></dl>
173
 
 
174
 
</div>
175
 
<div class="section" id="debuggingserver-objects">
176
 
<h2>21.18.2. DebuggingServer Objects<a class="headerlink" href="#debuggingserver-objects" title="Permalink to this headline">¶</a></h2>
177
 
<dl class="class">
178
 
<dt id="smtpd.DebuggingServer">
179
 
<em class="property">class </em><code class="descclassname">smtpd.</code><code class="descname">DebuggingServer</code><span class="sig-paren">(</span><em>localaddr</em>, <em>remoteaddr</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.DebuggingServer" title="Permalink to this definition">¶</a></dt>
180
 
<dd><p>Create a new debugging server.  Arguments are as per <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a>.
181
 
Messages will be discarded, and printed on stdout.</p>
182
 
</dd></dl>
183
 
 
184
 
</div>
185
 
<div class="section" id="pureproxy-objects">
186
 
<h2>21.18.3. PureProxy Objects<a class="headerlink" href="#pureproxy-objects" title="Permalink to this headline">¶</a></h2>
187
 
<dl class="class">
188
 
<dt id="smtpd.PureProxy">
189
 
<em class="property">class </em><code class="descclassname">smtpd.</code><code class="descname">PureProxy</code><span class="sig-paren">(</span><em>localaddr</em>, <em>remoteaddr</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.PureProxy" title="Permalink to this definition">¶</a></dt>
190
 
<dd><p>Create a new pure proxy server. Arguments are as per <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a>.
191
 
Everything will be relayed to <em>remoteaddr</em>.  Note that running this has a good
192
 
chance to make you into an open relay, so please be careful.</p>
193
 
</dd></dl>
194
 
 
195
 
</div>
196
 
<div class="section" id="mailmanproxy-objects">
197
 
<h2>21.18.4. MailmanProxy Objects<a class="headerlink" href="#mailmanproxy-objects" title="Permalink to this headline">¶</a></h2>
198
 
<dl class="class">
199
 
<dt id="smtpd.MailmanProxy">
200
 
<em class="property">class </em><code class="descclassname">smtpd.</code><code class="descname">MailmanProxy</code><span class="sig-paren">(</span><em>localaddr</em>, <em>remoteaddr</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.MailmanProxy" title="Permalink to this definition">¶</a></dt>
201
 
<dd><p>Create a new pure proxy server. Arguments are as per <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a>.
202
 
Everything will be relayed to <em>remoteaddr</em>, unless local mailman configurations
203
 
knows about an address, in which case it will be handled via mailman.  Note that
204
 
running this has a good chance to make you into an open relay, so please be
205
 
careful.</p>
206
 
</dd></dl>
207
 
 
208
 
</div>
209
 
<div class="section" id="smtpchannel-objects">
210
 
<h2>21.18.5. SMTPChannel Objects<a class="headerlink" href="#smtpchannel-objects" title="Permalink to this headline">¶</a></h2>
211
 
<dl class="class">
212
 
<dt id="smtpd.SMTPChannel">
213
 
<em class="property">class </em><code class="descclassname">smtpd.</code><code class="descname">SMTPChannel</code><span class="sig-paren">(</span><em>server</em>, <em>conn</em>, <em>addr</em>, <em>data_size_limit=33554432</em>, <em>map=None</em>, <em>enable_SMTPUTF8=False</em>, <em>decode_data=True</em><span class="sig-paren">)</span><a class="headerlink" href="#smtpd.SMTPChannel" title="Permalink to this definition">¶</a></dt>
214
 
<dd><p>Create a new <a class="reference internal" href="#smtpd.SMTPChannel" title="smtpd.SMTPChannel"><code class="xref py py-class docutils literal"><span class="pre">SMTPChannel</span></code></a> object which manages the communication
215
 
between the server and a single SMTP client.</p>
216
 
<p><em>conn</em> and <em>addr</em> are as per the instance variables described below.</p>
217
 
<p><em>data_size_limit</em> specifies the maximum number of bytes that will be
218
 
accepted in a <code class="docutils literal"><span class="pre">DATA</span></code> command.  A value of <code class="docutils literal"><span class="pre">None</span></code> or <code class="docutils literal"><span class="pre">0</span></code> means no
219
 
limit.</p>
220
 
<p><em>enable_SMTPUTF8</em> determins whether the <code class="docutils literal"><span class="pre">SMTPUTF8</span></code> extension (as defined
221
 
in <span class="target" id="index-7"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc6531.html"><strong>RFC 6531</strong></a>) should be enabled.  The default is <code class="docutils literal"><span class="pre">False</span></code>.  A
222
 
<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a> is raised if both <em>enable_SMTPUTF8</em> and <em>decode_data</em> are
223
 
set to <code class="docutils literal"><span class="pre">True</span></code> at the same time.</p>
224
 
<p>A dictionary can be specified in <em>map</em> to avoid using a global socket map.</p>
225
 
<p><em>decode_data</em> specifies whether the data portion of the SMTP transaction
226
 
should be decoded using UTF-8.  The default is <code class="docutils literal"><span class="pre">True</span></code> for backward
227
 
compatibility reasons, but will change to <code class="docutils literal"><span class="pre">False</span></code> in Python 3.6.  Specify
228
 
the keyword value explicitly to avoid the <a class="reference internal" href="exceptions.html#DeprecationWarning" title="DeprecationWarning"><code class="xref py py-exc docutils literal"><span class="pre">DeprecationWarning</span></code></a>.</p>
229
 
<p>To use a custom SMTPChannel implementation you need to override the
230
 
<a class="reference internal" href="#smtpd.SMTPServer.channel_class" title="smtpd.SMTPServer.channel_class"><code class="xref py py-attr docutils literal"><span class="pre">SMTPServer.channel_class</span></code></a> of your <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a>.</p>
231
 
<div class="versionchanged">
232
 
<p><span class="versionmodified">Changed in version 3.5: </span>the <em>decode_data</em> and <em>enable_SMTPUTF8</em> arguments were added.</p>
233
 
</div>
234
 
<p>The <a class="reference internal" href="#smtpd.SMTPChannel" title="smtpd.SMTPChannel"><code class="xref py py-class docutils literal"><span class="pre">SMTPChannel</span></code></a> has the following instance variables:</p>
235
 
<dl class="attribute">
236
 
<dt id="smtpd.SMTPChannel.smtp_server">
237
 
<code class="descname">smtp_server</code><a class="headerlink" href="#smtpd.SMTPChannel.smtp_server" title="Permalink to this definition">¶</a></dt>
238
 
<dd><p>Holds the <a class="reference internal" href="#smtpd.SMTPServer" title="smtpd.SMTPServer"><code class="xref py py-class docutils literal"><span class="pre">SMTPServer</span></code></a> that spawned this channel.</p>
239
 
</dd></dl>
240
 
 
241
 
<dl class="attribute">
242
 
<dt id="smtpd.SMTPChannel.conn">
243
 
<code class="descname">conn</code><a class="headerlink" href="#smtpd.SMTPChannel.conn" title="Permalink to this definition">¶</a></dt>
244
 
<dd><p>Holds the socket object connecting to the client.</p>
245
 
</dd></dl>
246
 
 
247
 
<dl class="attribute">
248
 
<dt id="smtpd.SMTPChannel.addr">
249
 
<code class="descname">addr</code><a class="headerlink" href="#smtpd.SMTPChannel.addr" title="Permalink to this definition">¶</a></dt>
250
 
<dd><p>Holds the address of the client, the second value returned by
251
 
<a class="reference internal" href="socket.html#socket.socket.accept" title="socket.socket.accept"><code class="xref py py-func docutils literal"><span class="pre">socket.accept</span></code></a></p>
252
 
</dd></dl>
253
 
 
254
 
<dl class="attribute">
255
 
<dt id="smtpd.SMTPChannel.received_lines">
256
 
<code class="descname">received_lines</code><a class="headerlink" href="#smtpd.SMTPChannel.received_lines" title="Permalink to this definition">¶</a></dt>
257
 
<dd><p>Holds a list of the line strings (decoded using UTF-8) received from
258
 
the client. The lines have their <code class="docutils literal"><span class="pre">&quot;\r\n&quot;</span></code> line ending translated to
259
 
<code class="docutils literal"><span class="pre">&quot;\n&quot;</span></code>.</p>
260
 
</dd></dl>
261
 
 
262
 
<dl class="attribute">
263
 
<dt id="smtpd.SMTPChannel.smtp_state">
264
 
<code class="descname">smtp_state</code><a class="headerlink" href="#smtpd.SMTPChannel.smtp_state" title="Permalink to this definition">¶</a></dt>
265
 
<dd><p>Holds the current state of the channel. This will be either
266
 
<code class="xref py py-attr docutils literal"><span class="pre">COMMAND</span></code> initially and then <code class="xref py py-attr docutils literal"><span class="pre">DATA</span></code> after the client sends
267
 
a &#8220;DATA&#8221; line.</p>
268
 
</dd></dl>
269
 
 
270
 
<dl class="attribute">
271
 
<dt id="smtpd.SMTPChannel.seen_greeting">
272
 
<code class="descname">seen_greeting</code><a class="headerlink" href="#smtpd.SMTPChannel.seen_greeting" title="Permalink to this definition">¶</a></dt>
273
 
<dd><p>Holds a string containing the greeting sent by the client in its &#8220;HELO&#8221;.</p>
274
 
</dd></dl>
275
 
 
276
 
<dl class="attribute">
277
 
<dt id="smtpd.SMTPChannel.mailfrom">
278
 
<code class="descname">mailfrom</code><a class="headerlink" href="#smtpd.SMTPChannel.mailfrom" title="Permalink to this definition">¶</a></dt>
279
 
<dd><p>Holds a string containing the address identified in the &#8220;MAIL FROM:&#8221; line
280
 
from the client.</p>
281
 
</dd></dl>
282
 
 
283
 
<dl class="attribute">
284
 
<dt id="smtpd.SMTPChannel.rcpttos">
285
 
<code class="descname">rcpttos</code><a class="headerlink" href="#smtpd.SMTPChannel.rcpttos" title="Permalink to this definition">¶</a></dt>
286
 
<dd><p>Holds a list of strings containing the addresses identified in the
287
 
&#8220;RCPT TO:&#8221; lines from the client.</p>
288
 
</dd></dl>
289
 
 
290
 
<dl class="attribute">
291
 
<dt id="smtpd.SMTPChannel.received_data">
292
 
<code class="descname">received_data</code><a class="headerlink" href="#smtpd.SMTPChannel.received_data" title="Permalink to this definition">¶</a></dt>
293
 
<dd><p>Holds a string containing all of the data sent by the client during the
294
 
DATA state, up to but not including the terminating <code class="docutils literal"><span class="pre">&quot;\r\n.\r\n&quot;</span></code>.</p>
295
 
</dd></dl>
296
 
 
297
 
<dl class="attribute">
298
 
<dt id="smtpd.SMTPChannel.fqdn">
299
 
<code class="descname">fqdn</code><a class="headerlink" href="#smtpd.SMTPChannel.fqdn" title="Permalink to this definition">¶</a></dt>
300
 
<dd><p>Holds the fully-qualified domain name of the server as returned by
301
 
<a class="reference internal" href="socket.html#socket.getfqdn" title="socket.getfqdn"><code class="xref py py-func docutils literal"><span class="pre">socket.getfqdn()</span></code></a>.</p>
302
 
</dd></dl>
303
 
 
304
 
<dl class="attribute">
305
 
<dt id="smtpd.SMTPChannel.peer">
306
 
<code class="descname">peer</code><a class="headerlink" href="#smtpd.SMTPChannel.peer" title="Permalink to this definition">¶</a></dt>
307
 
<dd><p>Holds the name of the client peer as returned by <code class="docutils literal"><span class="pre">conn.getpeername()</span></code>
308
 
where <code class="docutils literal"><span class="pre">conn</span></code> is <a class="reference internal" href="#smtpd.SMTPChannel.conn" title="smtpd.SMTPChannel.conn"><code class="xref py py-attr docutils literal"><span class="pre">conn</span></code></a>.</p>
309
 
</dd></dl>
310
 
 
311
 
<p>The <a class="reference internal" href="#smtpd.SMTPChannel" title="smtpd.SMTPChannel"><code class="xref py py-class docutils literal"><span class="pre">SMTPChannel</span></code></a> operates by invoking methods named <code class="docutils literal"><span class="pre">smtp_&lt;command&gt;</span></code>
312
 
upon reception of a command line from the client. Built into the base
313
 
<a class="reference internal" href="#smtpd.SMTPChannel" title="smtpd.SMTPChannel"><code class="xref py py-class docutils literal"><span class="pre">SMTPChannel</span></code></a> class are methods for handling the following commands
314
 
(and responding to them appropriately):</p>
315
 
<table border="1" class="docutils">
316
 
<colgroup>
317
 
<col width="11%" />
318
 
<col width="89%" />
319
 
</colgroup>
320
 
<thead valign="bottom">
321
 
<tr class="row-odd"><th class="head">Command</th>
322
 
<th class="head">Action taken</th>
323
 
</tr>
324
 
</thead>
325
 
<tbody valign="top">
326
 
<tr class="row-even"><td>HELO</td>
327
 
<td>Accepts the greeting from the client and stores it in
328
 
<a class="reference internal" href="#smtpd.SMTPChannel.seen_greeting" title="smtpd.SMTPChannel.seen_greeting"><code class="xref py py-attr docutils literal"><span class="pre">seen_greeting</span></code></a>.  Sets server to base command mode.</td>
329
 
</tr>
330
 
<tr class="row-odd"><td>EHLO</td>
331
 
<td>Accepts the greeting from the client and stores it in
332
 
<a class="reference internal" href="#smtpd.SMTPChannel.seen_greeting" title="smtpd.SMTPChannel.seen_greeting"><code class="xref py py-attr docutils literal"><span class="pre">seen_greeting</span></code></a>.  Sets server to extended command mode.</td>
333
 
</tr>
334
 
<tr class="row-even"><td>NOOP</td>
335
 
<td>Takes no action.</td>
336
 
</tr>
337
 
<tr class="row-odd"><td>QUIT</td>
338
 
<td>Closes the connection cleanly.</td>
339
 
</tr>
340
 
<tr class="row-even"><td>MAIL</td>
341
 
<td>Accepts the &#8220;MAIL FROM:&#8221; syntax and stores the supplied address as
342
 
<a class="reference internal" href="#smtpd.SMTPChannel.mailfrom" title="smtpd.SMTPChannel.mailfrom"><code class="xref py py-attr docutils literal"><span class="pre">mailfrom</span></code></a>.  In extended command mode, accepts the
343
 
<span class="target" id="index-8"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc1870.html"><strong>RFC 1870</strong></a> SIZE attribute and responds appropriately based on the
344
 
value of <em>data_size_limit</em>.</td>
345
 
</tr>
346
 
<tr class="row-odd"><td>RCPT</td>
347
 
<td>Accepts the &#8220;RCPT TO:&#8221; syntax and stores the supplied addresses in
348
 
the <a class="reference internal" href="#smtpd.SMTPChannel.rcpttos" title="smtpd.SMTPChannel.rcpttos"><code class="xref py py-attr docutils literal"><span class="pre">rcpttos</span></code></a> list.</td>
349
 
</tr>
350
 
<tr class="row-even"><td>RSET</td>
351
 
<td>Resets the <a class="reference internal" href="#smtpd.SMTPChannel.mailfrom" title="smtpd.SMTPChannel.mailfrom"><code class="xref py py-attr docutils literal"><span class="pre">mailfrom</span></code></a>, <a class="reference internal" href="#smtpd.SMTPChannel.rcpttos" title="smtpd.SMTPChannel.rcpttos"><code class="xref py py-attr docutils literal"><span class="pre">rcpttos</span></code></a>, and
352
 
<a class="reference internal" href="#smtpd.SMTPChannel.received_data" title="smtpd.SMTPChannel.received_data"><code class="xref py py-attr docutils literal"><span class="pre">received_data</span></code></a>, but not the greeting.</td>
353
 
</tr>
354
 
<tr class="row-odd"><td>DATA</td>
355
 
<td>Sets the internal state to <code class="xref py py-attr docutils literal"><span class="pre">DATA</span></code> and stores remaining lines
356
 
from the client in <a class="reference internal" href="#smtpd.SMTPChannel.received_data" title="smtpd.SMTPChannel.received_data"><code class="xref py py-attr docutils literal"><span class="pre">received_data</span></code></a> until the terminator
357
 
<code class="docutils literal"><span class="pre">&quot;\r\n.\r\n&quot;</span></code> is received.</td>
358
 
</tr>
359
 
<tr class="row-even"><td>HELP</td>
360
 
<td>Returns minimal information on command syntax</td>
361
 
</tr>
362
 
<tr class="row-odd"><td>VRFY</td>
363
 
<td>Returns code 252 (the server doesn&#8217;t know if the address is valid)</td>
364
 
</tr>
365
 
<tr class="row-even"><td>EXPN</td>
366
 
<td>Reports that the command is not implemented.</td>
367
 
</tr>
368
 
</tbody>
369
 
</table>
370
 
</dd></dl>
371
 
 
372
 
</div>
373
 
</div>
374
 
 
375
 
 
376
 
          </div>
377
 
        </div>
378
 
      </div>
379
 
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
380
 
        <div class="sphinxsidebarwrapper">
381
 
  <h3><a href="../contents.html">Table Of Contents</a></h3>
382
 
  <ul>
383
 
<li><a class="reference internal" href="#">21.18. <code class="docutils literal"><span class="pre">smtpd</span></code> &#8212; SMTP Server</a><ul>
384
 
<li><a class="reference internal" href="#smtpserver-objects">21.18.1. SMTPServer Objects</a></li>
385
 
<li><a class="reference internal" href="#debuggingserver-objects">21.18.2. DebuggingServer Objects</a></li>
386
 
<li><a class="reference internal" href="#pureproxy-objects">21.18.3. PureProxy Objects</a></li>
387
 
<li><a class="reference internal" href="#mailmanproxy-objects">21.18.4. MailmanProxy Objects</a></li>
388
 
<li><a class="reference internal" href="#smtpchannel-objects">21.18.5. SMTPChannel Objects</a></li>
389
 
</ul>
390
 
</li>
391
 
</ul>
392
 
 
393
 
  <h4>Previous topic</h4>
394
 
  <p class="topless"><a href="smtplib.html"
395
 
                        title="previous chapter">21.17. <code class="docutils literal"><span class="pre">smtplib</span></code> &#8212; SMTP protocol client</a></p>
396
 
  <h4>Next topic</h4>
397
 
  <p class="topless"><a href="telnetlib.html"
398
 
                        title="next chapter">21.19. <code class="docutils literal"><span class="pre">telnetlib</span></code> &#8212; Telnet client</a></p>
399
 
<h3>This Page</h3>
400
 
<ul class="this-page-menu">
401
 
  <li><a href="../bugs.html">Report a Bug</a></li>
402
 
  <li><a href="../_sources/library/smtpd.txt"
403
 
         rel="nofollow">Show Source</a></li>
404
 
</ul>
405
 
 
406
 
<div id="searchbox" style="display: none" role="search">
407
 
  <h3>Quick search</h3>
408
 
    <form class="search" action="../search.html" method="get">
409
 
      <input type="text" name="q" />
410
 
      <input type="submit" value="Go" />
411
 
      <input type="hidden" name="check_keywords" value="yes" />
412
 
      <input type="hidden" name="area" value="default" />
413
 
    </form>
414
 
    <p class="searchtip" style="font-size: 90%">
415
 
    Enter search terms or a module, class or function name.
416
 
    </p>
417
 
</div>
418
 
<script type="text/javascript">$('#searchbox').show(0);</script>
419
 
        </div>
420
 
      </div>
421
 
      <div class="clearer"></div>
422
 
    </div>  
423
 
    <div class="related" role="navigation" aria-label="related navigation">
424
 
      <h3>Navigation</h3>
425
 
      <ul>
426
 
        <li class="right" style="margin-right: 10px">
427
 
          <a href="../genindex.html" title="General Index"
428
 
             >index</a></li>
429
 
        <li class="right" >
430
 
          <a href="../py-modindex.html" title="Python Module Index"
431
 
             >modules</a> |</li>
432
 
        <li class="right" >
433
 
          <a href="telnetlib.html" title="21.19. telnetlib — Telnet client"
434
 
             >next</a> |</li>
435
 
        <li class="right" >
436
 
          <a href="smtplib.html" title="21.17. smtplib — SMTP protocol client"
437
 
             >previous</a> |</li>
438
 
        <li><img src="../_static/py.png" alt=""
439
 
                 style="vertical-align: middle; margin-top: -1px"/></li>
440
 
        <li><a href="https://www.python.org/">Python</a> &raquo;</li>
441
 
        <li>
442
 
          <span class="version_switcher_placeholder">3.5.1</span>
443
 
          <a href="../index.html">Documentation </a> &raquo;
444
 
        </li>
445
 
 
446
 
          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &raquo;</li>
447
 
          <li class="nav-item nav-item-2"><a href="internet.html" >21. Internet Protocols and Support</a> &raquo;</li> 
448
 
      </ul>
449
 
    </div>  
450
 
    <div class="footer">
451
 
    &copy; <a href="../copyright.html">Copyright</a> 1990-2016, Python Software Foundation.
452
 
    <br />
453
 
    The Python Software Foundation is a non-profit corporation.
454
 
    <a href="https://www.python.org/psf/donations/">Please donate.</a>
455
 
    <br />
456
 
    Last updated on Jan 22, 2016.
457
 
    <a href="../bugs.html">Found a bug</a>?
458
 
    <br />
459
 
    Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.3.3.
460
 
    </div>
461
 
 
462
 
  </body>
463
 
</html>
 
 
b'\\ No newline at end of file'