<div dir="ltr"><span style="color:rgb(33,33,33);font-size:13px">I am working on putting together an SMTP server implemented within Twisted.  This will act as a conduit to my API, where there are two basic flows:</span><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">1) A device that supports sending email can "send" an email through the SMTP server. This is, in effect, the SMTP server handling the message as an outbound request.  The device would authenticate with the server and then provide it the message to be sent (which in reality will be uploaded to my API).</div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px"><br class="gmail_msg"></div><div class="gmail_msg" style="color:rgb(33,33,33);font-size:13px">2) A device can send an email to my SMTP server via their own SMTP server. My server would receive the incoming message, parse its contents, and then upload the data to my API. Naturally, these incoming messages would not be required to authenticate with the server.<br class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I'm having trouble constructing the server in a way that outbound messages require authentication but incoming messages do not.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">My service currently looks more or less like below:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;font-weight:700">from</span><span class="gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px"><span class="inbox-inbox-Apple-converted-space"> </span></span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-nn gmail_msg" style="font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;color:rgb(85,85,85)">twisted.cred.portal</span><span class="gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px"><span class="inbox-inbox-Apple-converted-space"> </span></span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;font-weight:700">import</span><span class="gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px"><span class="inbox-inbox-Apple-converted-space"> </span></span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51);font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px">Portal</span><br class="gmail_msg"></div><div class="gmail_msg"><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;line-height:1.4;color:rgb(51,51,51)"><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg"><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;line-height:1.4"><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="font-weight:700">from</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-nn gmail_msg" style="color:rgb(85,85,85)">twisted.mail</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="font-weight:700">import</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">smtp</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="font-weight:700">from</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-nn gmail_msg" style="color:rgb(85,85,85)">twisted.mail.imap4</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-kn gmail_msg" style="font-weight:700">import</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">LOGINCredentials</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">,</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">PLAINCredentials</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-k gmail_msg" style="font-weight:700">class</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-nc gmail_msg" style="font-weight:700;color:rgb(68,85,136)">SMTPFactory</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">smtp</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">SMTPFactory</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">):</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>    <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">protocol</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">=</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">smtp</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">ESMTP</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>    <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-k gmail_msg" style="font-weight:700">def</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-nf gmail_msg" style="color:rgb(153,0,0);font-weight:700">buildProtocol</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-bp gmail_msg" style="color:rgb(153,153,153)">self</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">,</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">addr</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">):</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-c1 gmail_msg" style="font-style:italic;color:rgb(153,153,136)"># Add authentication to SMTP server</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">p</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">=</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">smtp</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">SMTPFactory</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">buildProtocol</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-bp gmail_msg" style="color:rgb(153,153,153)">self</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">,</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">addr</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">)</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">p</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">challengers</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">=</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">{</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>            <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-s2 gmail_msg" style="color:rgb(187,136,68)">"LOGIN"</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">:</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">LOGINCredentials</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">,</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>            <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-s2 gmail_msg" style="color:rgb(187,136,68)">"PLAIN"</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">:</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">PLAINCredentials</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">}</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-c1 gmail_msg" style="font-style:italic;color:rgb(153,153,136)"># Set a timeout for the connection message to be processed</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">p</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">timeout</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">=</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-mi gmail_msg" style="color:rgb(0,153,153)">200</span>
<a class="gmail_msg" style="color:rgb(53,114,176)"></a>        <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-k gmail_msg" style="font-weight:700">return</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">p</span></pre>
</span></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;line-height:1.4;color:rgb(51,51,51)">provider <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="font-weight:700">=</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">Provider</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">('localhost'</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">,</span> <span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg">settings</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg">)</span><br class="gmail_msg"></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;line-height:1.4"><a class="gmail_msg" style="color:rgb(53,114,176)"></a><font color="#333333" class="gmail_msg">
</font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-c1 gmail_msg" style="color:rgb(153,153,136);font-style:italic"># Multiple checkers that for backwards compatibility</span><font color="#333333" class="gmail_msg">
</font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">cascade</span><font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="color:rgb(51,51,51);font-weight:700">=</span><font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">CascadeChecker</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">()</span><font color="#333333" class="gmail_msg">
</font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">cascade</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="color:rgb(51,51,51);font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">registerChecker</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">FilePasswordDB</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">pw_file</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">))</span><font color="#333333" class="gmail_msg">
</font><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;line-height:1.4"><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-inbox-inbox-c1 gmail_msg" style="color:rgb(153,153,136);font-style:italic"># ... some other checks</span></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;line-height:1.4"><br class="gmail_msg"></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;line-height:1.4">portal<font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="color:rgb(51,51,51);font-weight:700">=</span><font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">Portal</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">SimpleRealm</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">options</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">,</span><font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">provider</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">))</span><br class="gmail_msg"></pre><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">portal</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="color:rgb(51,51,51);font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">registerChecker</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">cascade</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">)</span><font color="#333333" class="gmail_msg">
</font><a class="gmail_msg" style="color:rgb(53,114,176)"></a><font color="#333333" class="gmail_msg">
</font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">internet</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-o gmail_msg" style="color:rgb(51,51,51);font-weight:700">.</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">TCPServer</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg"><font color="#333333" class="gmail_msg">(</font><font color="#999999" class="gmail_msg">2500</font></span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">,</span><font color="#333333" class="gmail_msg"> </font><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">SMTPFactory</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">(</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-n gmail_msg" style="color:rgb(51,51,51)">portal</span><span class="inbox-inbox-m_-6371377944921104612m_5862718390705044860inbox-inbox-p gmail_msg" style="color:rgb(51,51,51)">))</span></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;line-height:1.4;color:rgb(51,51,51)"><br class="gmail_msg"></pre><pre class="gmail_msg" style="margin-top:0px;margin-bottom:0px;padding:0px;font-family:consolas,menlo,"liberation mono",courier,monospace;font-size:12px;line-height:1.4;color:rgb(51,51,51)"><br class="gmail_msg"></pre>The problem is that, as currently written, I need to authenticate with the server upon connection. Naturally, this doesn't make sense for the inbound emails. It seems that a common pattern is to analyze the "to" address of the emails and to allow any incoming emails (without authentication) that have a matching domain, however this seems difficult to configure with Twisted as I don't have the context of the email at the time the authentication check is done.<br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Can anyone direct me to an example of an SMTP server that is both accepting inbound and outbound emails and authenticates only on outbound emails?</div><div class="gmail_msg"><br></div><div class="gmail_msg">PS, I'm not super familiar with the inner workings of email or the SMTP protocol, please let me know if I'm heading in the wrong direction</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Best,</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Anthony</div></div></div>