[tor-commits] [bridgedb/master] Refactor b.e.server.MailMessage class.
isis at torproject.org
isis at torproject.org
Fri Jun 6 23:39:14 UTC 2014
commit 9a1dbf55924ad71c1257d86caf6ad6cc65c78510
Author: Isis Lovecruft <isis at torproject.org>
Date: Mon Jun 2 20:58:23 2014 +0000
Refactor b.e.server.MailMessage class.
* ADD attributes so that the information about the incoming SMTP
message is still accessible to the autoresponder while we're creating
the reply.
* FIXUP docstrings.
---
lib/bridgedb/email/server.py | 49 ++++++++++++++++++++++++++++++------------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/lib/bridgedb/email/server.py b/lib/bridgedb/email/server.py
index 249b7c7..a493be0 100644
--- a/lib/bridgedb/email/server.py
+++ b/lib/bridgedb/email/server.py
@@ -122,34 +122,54 @@ class MailServerContext(object):
return canon
-class MailMessage(object):
+class SMTPMessage(object):
"""Plugs into the Twisted Mail and receives an incoming message.
:ivar list lines: A list of lines from an incoming email message.
:ivar int nBytes: The number of bytes received thus far.
:ivar bool ignoring: If ``True``, we're ignoring the rest of this message
- because it exceeded :ivar:`MailContext.maximumSize`.
+ because it exceeded :ivar:`MailServerContext.maximumSize`.
+ :ivar canonicalFromSMTP: See :meth:`SMTPAutoresponder.runChecks`.
+ :ivar canonicalFromEmail: See :meth:`SMTPAutoresponder.runChecks`.
+ :ivar canonicalDomainRules: See :meth:`SMTPAutoresponder.runChecks`.
+ :type message: :api:`twisted.mail.smtp.rfc822.Message` or ``None``
+ :ivar message: The incoming email message.
+ :type responder: :class:`autoresponder.SMTPAutoresponder`
+ :ivar responder: A parser and checker for the incoming :ivar:`message`. If
+ it decides to do so, it will build a
+ :meth:`~autoresponder.SMTPAutoresponder.reply` email and
+ :meth:`~autoresponder.SMTPAutoresponder.send` it.
"""
implements(smtp.IMessage)
- def __init__(self, context, fromCanonical=None):
- """Create a new MailMessage from a MailContext.
+ def __init__(self, context, canonicalFromSMTP=None):
+ """Create a new SMTPMessage.
- :type context: :class:`MailContext`
- :param context: The configured context for the email server.
- :type canonicalFrom: str or None
- :param canonicalFrom: The canonical domain which this message was
+ These are created automatically via
+ :class:`SMTPIncomingDelivery`.
+
+ :param context: The configured :class:`MailServerContext`.
+ :type canonicalFromSMTP: str or None
+ :param canonicalFromSMTP: The canonical domain which this message was
received from. For example, if ``'gmail.com'`` is the configured
canonical domain for ``'googlemail.com'`` and a message is
received from the latter domain, then this would be set to the
former.
"""
self.context = context
- self.fromCanonical = fromCanonical
+ self.canon = context.canon
+ self.canonicalFromSMTP = canonicalFromSMTP
+ self.canonicalFromEmail = None
+ self.canonicalDomainRules = None
+
self.lines = []
self.nBytes = 0
self.ignoring = False
+ self.message = None
+ self.responder = autoresponder.SMTPAutoresponder()
+ self.responder.incoming = self
+
def lineReceived(self, line):
"""Called when we get another line of an incoming message."""
self.nBytes += len(line)
@@ -161,9 +181,10 @@ class MailMessage(object):
logging.debug("> %s", line.rstrip("\r\n"))
def eomReceived(self):
- """Called when we receive the end of a message."""
+ """Tell the :ivar:`responder` to reply when we receive an EOM."""
if not self.ignoring:
- self.reply()
+ self.message = self.getIncomingMessage()
+ self.responder.reply()
return defer.succeed(None)
def connectionLost(self):
@@ -171,15 +192,15 @@ class MailMessage(object):
pass
def getIncomingMessage(self):
- """Create and parse an :rfc:`2822` message object for all ``lines``
+ """Create and parse an :rfc:`2822` message object for all :ivar:`lines`
received thus far.
:rtype: :api:`twisted.mail.smtp.rfc822.Message`
:returns: A ``Message`` comprised of all lines received thus far.
"""
rawMessage = io.StringIO()
- for ln in self.lines:
- rawMessage.writelines(unicode(ln) + unicode('\n'))
+ for line in self.lines:
+ rawMessage.writelines(unicode(line) + unicode('\n'))
rawMessage.seek(0)
return smtp.rfc822.Message(rawMessage)
More information about the tor-commits
mailing list