[Twisted-Python] (newbie!) smtp to message object

Hello list, I'm new to twisted and to python in general, so still deep in the learning process. Please forgive any faulty assumptions you'll find in this post :) I'm trying to accomplish to the following task: realize a tool that acts as a proxy between the SMTP domain and the 'objects' domain. That is: a daemon that listens for SMTP connections (relayed sessions from Postfix) and bundles everything that belongs to a single session (envelope sender, envelope recipients, headers, body) into an object (it will probably become a JSON one day, not decided yet). The aim is to allow further processing (es. publishing to a queue) of a self-contained item. My (draft) implementation can be reached at http://pastebin.com/mbRztuid My main concerns are: 1) am I using the right classes? My implementation leverages twisted.mail.smtp, is this correct? 2) I've overridden smtp.SMTP._cbToValidate; I really don't like this very much (I'd like to leave the protocol untouched) but it's the only way I've come up with (after several days of experiments :) ) to have one single payload down the line (in smtp.SMTP.do_DATA), and not one copy of the message for every single recipient. May this have bad consequences? 3) what do you think about the overall approach? could it have been done differently/better? Thanks a lot for your help! Fabio

Hi, I also tried to figure out how to deliver one copy of a message instead of one for every recipient for a Twisted server tutorial (ticket #3324) which hasn't yet been finalized. Here's the way I went about it but I'd appreciate comments on the approach as well. For the IMessageDelivery.validateTo method, it generates the real IMessage object when it receives the first recipient. After that, it returns a NullMessage object for each subsequent recipient. The NullMessage object is called for each line received as part of the message but does nothing with it. Then you don't need to change _cbToValidate. Here's you're code with the modifications http://pastebin.com/6nFXiTgK. Stacey On Nov 6, 2013, at 5:08 AM, Fabio Sangiovanni <sangiovanni@nweb.it> wrote:
Hello list,
I'm new to twisted and to python in general, so still deep in the learning process. Please forgive any faulty assumptions you'll find in this post :)
I'm trying to accomplish to the following task: realize a tool that acts as a proxy between the SMTP domain and the 'objects' domain. That is: a daemon that listens for SMTP connections (relayed sessions from Postfix) and bundles everything that belongs to a single session (envelope sender, envelope recipients, headers, body) into an object (it will probably become a JSON one day, not decided yet). The aim is to allow further processing (es. publishing to a queue) of a self-contained item.
My (draft) implementation can be reached at http://pastebin.com/mbRztuid
My main concerns are: 1) am I using the right classes? My implementation leverages twisted.mail.smtp, is this correct? 2) I've overridden smtp.SMTP._cbToValidate; I really don't like this very much (I'd like to leave the protocol untouched) but it's the only way I've come up with (after several days of experiments :) ) to have one single payload down the line (in smtp.SMTP.do_DATA), and not one copy of the message for every single recipient. May this have bad consequences? 3) what do you think about the overall approach? could it have been done differently/better?
Thanks a lot for your help!
Fabio _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Hi,
I also tried to figure out how to deliver one copy of a message instead of one for every recipient for a Twisted server tutorial (ticket #3324) which hasn't yet been finalized. Here's the way I went about it but I'd appreciate comments on the approach as well.
For the IMessageDelivery.validateTo method, it generates the real IMessage object when it receives the first recipient. After that, it returns a NullMessage object for each subsequent recipient. The NullMessage object is called for each line received as part of the message but does nothing with it. Then you don't need to change _cbToValidate. Here's you're code with the modifications http://pastebin.com/6nFXiTgK.
Stacey Hi Stacey,
Il 06/11/13 12:09, Stacey Sern ha scritto: thanks for your reply. I think your approach is cleaner than mine! Thanks! My only concern is this loop in smtp.SMTP.do_DATA: for (user, msgFunc) in recipients: [...] that implies a scan of the whole list of messages (made of the 'real' message and of the other NullMessages). I don't know how it can really impact on performances, though. I aimed at not creating 'fake' messages at all, but it's not clear to me if it's even possible without overriding _cbToValidate. Let's keep in touch! Fabio
On Nov 6, 2013, at 5:08 AM, Fabio Sangiovanni <sangiovanni@nweb.it <mailto:sangiovanni@nweb.it>> wrote:
Hello list,
I'm new to twisted and to python in general, so still deep in the learning process. Please forgive any faulty assumptions you'll find in this post :)
I'm trying to accomplish to the following task: realize a tool that acts as a proxy between the SMTP domain and the 'objects' domain. That is: a daemon that listens for SMTP connections (relayed sessions from Postfix) and bundles everything that belongs to a single session (envelope sender, envelope recipients, headers, body) into an object (it will probably become a JSON one day, not decided yet). The aim is to allow further processing (es. publishing to a queue) of a self-contained item.
My (draft) implementation can be reached at http://pastebin.com/mbRztuid
My main concerns are: 1) am I using the right classes? My implementation leverages twisted.mail.smtp, is this correct? 2) I've overridden smtp.SMTP._cbToValidate; I really don't like this very much (I'd like to leave the protocol untouched) but it's the only way I've come up with (after several days of experiments :) ) to have one single payload down the line (in smtp.SMTP.do_DATA), and not one copy of the message for every single recipient. May this have bad consequences? 3) what do you think about the overall approach? could it have been done differently/better?
Thanks a lot for your help!
Fabio _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com <mailto:Twisted-Python@twistedmatrix.com> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

On 11:35 am, sangiovanni@nweb.it wrote:
Hi,
I also tried to figure out how to deliver one copy of a message instead of one for every recipient for a Twisted server tutorial (ticket #3324) which hasn't yet been finalized. Here's the way I went about it but I'd appreciate comments on the approach as well.
For the IMessageDelivery.validateTo method, it generates the real IMessage object when it receives the first recipient. After that, it returns a NullMessage object for each subsequent recipient. The NullMessage object is called for each line received as part of the message but does nothing with it. Then you don't need to change _cbToValidate. Here's you're code with the modifications http://pastebin.com/6nFXiTgK.
Stacey Hi Stacey,
Il 06/11/13 12:09, Stacey Sern ha scritto: thanks for your reply.
I think your approach is cleaner than mine! Thanks! My only concern is this loop in smtp.SMTP.do_DATA:
for (user, msgFunc) in recipients: [...]
that implies a scan of the whole list of messages (made of the 'real' message and of the other NullMessages). I don't know how it can really impact on performances, though. I aimed at not creating 'fake' messages at all, but it's not clear to me if it's even possible without overriding _cbToValidate.
The performance impact of this is going to be minimal. On a runtime like PyPy, the impact *may* even be zero. Jean-Paul
Let's keep in touch!
Fabio
On Nov 6, 2013, at 5:08 AM, Fabio Sangiovanni <sangiovanni@nweb.it <mailto:sangiovanni@nweb.it>> wrote:
Hello list,
I'm new to twisted and to python in general, so still deep in the learning process. Please forgive any faulty assumptions you'll find in this post :)
I'm trying to accomplish to the following task: realize a tool that acts as a proxy between the SMTP domain and the 'objects' domain. That is: a daemon that listens for SMTP connections (relayed sessions from Postfix) and bundles everything that belongs to a single session (envelope sender, envelope recipients, headers, body) into an object (it will probably become a JSON one day, not decided yet). The aim is to allow further processing (es. publishing to a queue) of a self- contained item.
My (draft) implementation can be reached at http://pastebin.com/mbRztuid
My main concerns are: 1) am I using the right classes? My implementation leverages twisted.mail.smtp, is this correct? 2) I've overridden smtp.SMTP._cbToValidate; I really don't like this very much (I'd like to leave the protocol untouched) but it's the only way I've come up with (after several days of experiments :) ) to have one single payload down the line (in smtp.SMTP.do_DATA), and not one copy of the message for every single recipient. May this have bad consequences? 3) what do you think about the overall approach? could it have been done differently/better?
Thanks a lot for your help!
Fabio _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com <mailto:Twisted- Python@twistedmatrix.com> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Il 06/11/13 15:20, exarkun@twistedmatrix.com ha scritto:
On 11:35 am, sangiovanni@nweb.it wrote:
Hi,
I also tried to figure out how to deliver one copy of a message instead of one for every recipient for a Twisted server tutorial (ticket #3324) which hasn't yet been finalized. Here's the way I went about it but I'd appreciate comments on the approach as well.
For the IMessageDelivery.validateTo method, it generates the real IMessage object when it receives the first recipient. After that, it returns a NullMessage object for each subsequent recipient. The NullMessage object is called for each line received as part of the message but does nothing with it. Then you don't need to change _cbToValidate. Here's you're code with the modifications http://pastebin.com/6nFXiTgK.
Stacey Hi Stacey,
Il 06/11/13 12:09, Stacey Sern ha scritto: thanks for your reply.
I think your approach is cleaner than mine! Thanks! My only concern is this loop in smtp.SMTP.do_DATA:
for (user, msgFunc) in recipients: [...]
that implies a scan of the whole list of messages (made of the 'real' message and of the other NullMessages). I don't know how it can really impact on performances, though. I aimed at not creating 'fake' messages at all, but it's not clear to me if it's even possible without overriding _cbToValidate.
The performance impact of this is going to be minimal.
On a runtime like PyPy, the impact *may* even be zero.
Jean-Paul Thanks Jean-Paul, I'll go the way suggested by Stacey, then. Any other suggestions about my approach?
Thanks again!
Let's keep in touch!
Fabio
On Nov 6, 2013, at 5:08 AM, Fabio Sangiovanni <sangiovanni@nweb.it <mailto:sangiovanni@nweb.it>> wrote:
Hello list,
I'm new to twisted and to python in general, so still deep in the learning process. Please forgive any faulty assumptions you'll find in this post :)
I'm trying to accomplish to the following task: realize a tool that acts as a proxy between the SMTP domain and the 'objects' domain. That is: a daemon that listens for SMTP connections (relayed sessions from Postfix) and bundles everything that belongs to a single session (envelope sender, envelope recipients, headers, body) into an object (it will probably become a JSON one day, not decided yet). The aim is to allow further processing (es. publishing to a queue) of a self- contained item.
My (draft) implementation can be reached at http://pastebin.com/mbRztuid
My main concerns are: 1) am I using the right classes? My implementation leverages twisted.mail.smtp, is this correct? 2) I've overridden smtp.SMTP._cbToValidate; I really don't like this very much (I'd like to leave the protocol untouched) but it's the only way I've come up with (after several days of experiments :) ) to have one single payload down the line (in smtp.SMTP.do_DATA), and not one copy of the message for every single recipient. May this have bad consequences? 3) what do you think about the overall approach? could it have been done differently/better?
Thanks a lot for your help!
Fabio _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com <mailto:Twisted- Python@twistedmatrix.com> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
participants (3)
-
exarkun@twistedmatrix.com
-
Fabio Sangiovanni
-
Stacey Sern