<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-AU link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal>Hi,<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I have an existing application, written using Ice Middleware
(<a href="http://www.zeroc.com">www.zeroc.com</a>)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>This application is my source of infinite queue (server)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Following is my application (processing client to my
infinite queue server) idea to be implemented using Twisted Framework.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I can loop through my infinite queue and receive email data
(Using .next() kind of function)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Using this email data object, I need to trigger event to
send email using ESMTPSenderFactory and ESMTPSender. As, later I would be
extending ESMTP* classes to do my little funky stuff.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>What is the best code design I can use to implement this
stuff.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Following is basic algorithm kind of code I am doing right
now, but I feel I am missing something.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>#================<o:p></o:p></p>

<p class=MsoNormal>#Code Begins Here: <b>.tac file</b><o:p></o:p></p>

<p class=MsoNormal>#================<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>import</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> StringIO</span><span style='font-size:
10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>from</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> twisted.application </span><span
style='font-size:10.0pt;font-family:"Courier New";color:blue'>import</span><span
style='font-size:10.0pt;font-family:"Courier New";color:black'> service </span><span
style='font-size:10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>from</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> twisted.application </span><span
style='font-size:10.0pt;font-family:"Courier New";color:blue'>import</span><span
style='font-size:10.0pt;font-family:"Courier New";color:black'> internet</span><span
style='font-size:10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>from</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> twisted.internet </span><span
style='font-size:10.0pt;font-family:"Courier New";color:blue'>import</span><span
style='font-size:10.0pt;font-family:"Courier New";color:black'> protocol, defer</span><span
style='font-size:10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>from</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> twisted.mail </span><span
style='font-size:10.0pt;font-family:"Courier New";color:blue'>import</span><span
style='font-size:10.0pt;font-family:"Courier New";color:black'> smtp,
relaymanager</span><span style='font-size:10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:"Courier New";color:blue'>from</span><span style='font-size:10.0pt;
font-family:"Courier New";color:black'> twisted.internet </span><span
style='font-size:10.0pt;font-family:"Courier New";color:blue'>import</span><span
style='font-size:10.0pt;font-family:"Courier New";color:black'> reactor</span><span
style='font-size:10.0pt;font-family:"Courier New"'><o:p></o:p></span></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Def process_queue:<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; While True:<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try:<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Data
= my_queue.next()<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getMailExchange(<i>'localhost</i>).addCallback(cbMailExchange,
data)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Except:<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Break<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; Reactor.stop()<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>reactor.callLater(0, process_queue)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>application = service.Application(&quot;SMTP Client
Tutorial&quot;)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>class SMTPTutorialClient(smtp.ESMTPClient):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; mailFrom = &quot;test@test.com&quot;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; mailTo = &quot;receiver@test.com&quot;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; mailData = '''\<o:p></o:p></p>

<p class=MsoNormal>Date: Fri, 6 Feb 2004 10:14:39 -0800<o:p></o:p></p>

<p class=MsoNormal>From: Test &lt;test@test.com&gt;<o:p></o:p></p>

<p class=MsoNormal>To: Receiver &lt;receiver@test.com&gt;<o:p></o:p></p>

<p class=MsoNormal>Subject: Test Mail!<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Hello, how are you, goodbye.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>'''<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; <o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def __init__(self, secret=&quot;&quot;,
identity=&quot;&quot;, data = &quot;&quot;):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
smtp.ESMTPClient.__init__(self, secret=secret, identity=identity)<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.secret =
secret<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.identity =
identity<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.data = data<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def getMailFrom(self):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result =
self.mailFrom<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mailFrom =
None<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; <o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def getMailTo(self):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
[self.mailTo]<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def getMailData(self):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
StringIO.StringIO(self.mailData+self.data)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def sentMail(self, code, resp, numOk,
addresses, log):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Sent',
numOk, 'messages&#8217;<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #reactor.stop()<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>def getMailExchange(host):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def cbMX(mxRecord):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str(mxRecord.name)<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; return
relaymanager.MXCalculator().getMX(host).addCallback(cbMX)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>class SMTPClientFactory(protocol.ClientFactory):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; protocol = SMTPTutorialClient<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def __init__(self, data):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.data = data<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; def buildProtocol(self, addr):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
self.protocol(secret=None, identity='example.com', data=self.data)<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>def cbMailExchange(exchange, data):<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; smtpClientService =
internet.TCPClient(exchange, 2500, SMTPClientFactory(data))<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp;
smtpClientService.setServiceParent(application)<o:p></o:p></p>

<p class=MsoNormal>&nbsp;&nbsp;&nbsp; #reactor.run()<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>reactor.run()<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>#================<o:p></o:p></p>

<p class=MsoNormal>#Code Ends Here<o:p></o:p></p>

<p class=MsoNormal>#================<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>I have couple of <b>#reactor.run()</b> commented code, I
feel like lost between <b>application</b> and <b>reactor</b> based code.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>My understanding is that function <b>process_queue </b>drives
the control flow of my application. Please correct me.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>What is happening is, when my loop is finished in function <b>process_queue,
</b>then only actual events of SMTP factory and protocol objects are created.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Therefore, I am not getting event driven code, which is the
beauty of Twisted Framework.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Please advice the best document to look and fix this code.<o:p></o:p></p>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Thanks.<o:p></o:p></p>

<p class=MsoNormal><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>____________________________________<br>
Sury Prakash Soni<br>
Developer</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";
color:silver'><br>
</span><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>____________________________________<br>
<br>
<b>Next Digital<br>
</b>Level 8, 15 William St, Melbourne <br>
VIC 3000 Australia<br>
</span><b><i><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>p</span></i></b><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'> +61 3 8612 6888<br>
</span><b><i><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>f</span></i></b><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'> &nbsp;+61 3 8612 6899<br>
</span><b><i><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>m 0</span></i></b><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>433 661 327<br>
</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";
color:silver'><a href="mailto:ssoni@nextdigital.com"
title="mailto:rmarshall@nextdigital.com&#10;mailto:agoldman@nextdigital.com"><span
style='font-size:9.0pt;font-family:"Arial","sans-serif";color:#0066CC'>ssoni@nextdigital.com</span></a></span><span
style='font-size:12.0pt;font-family:"Arial","sans-serif";color:#0066CC'><br>
</span><span style='font-size:12.0pt;font-family:"Times New Roman","serif";
color:silver'><a href="http://www.nextdigital.com/"
title="http://www.nextdigital.com/"><span style='font-size:9.0pt;font-family:
"Arial","sans-serif";color:#0066CC'>www.nextdigital.com</span></a></span><span
style='font-size:12.0pt;font-family:"Arial","sans-serif";color:silver'><br>
</span><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:silver'>____________________________________</span><span
style='font-size:12.0pt;font-family:"Times New Roman","serif";color:silver'><br>
<br>
</span><span style='font-size:7.0pt;font-family:"Arial","sans-serif";
color:gray'>This email and any attachments are intended only for the use of the
recipient and may be confidential and/or legally privileged. Next Digital Group
Pty Ltd (&quot;Next Digital&quot;) disclaims liability for any errors,
omissions, viruses, loss and/or damage arising from using, opening or
transmitting this email. If you are not the intended recipient you must not
use, interfere with, disclose, copy or retain this email and you should notify
the sender immediately by return email or by contacting Next Digital by telephone
on +61 3 8612 6888.</span><o:p></o:p></p>

</div>

</body>

</html>