diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 0f0ac9d..55ed6f0 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -32,6 +32,7 @@ from django_mailbox.signals import message_received from django_mailbox.transports import Pop3Transport, ImapTransport, \ MaildirTransport, MboxTransport, BabylTransport, MHTransport, \ MMDFTransport, GmailImapTransport +from django_mailbox.transports.registry import registry logger = logging.getLogger(__name__) @@ -233,6 +234,8 @@ class Mailbox(models.Model): conn = MHTransport(self.location) elif self.type == 'mmdf': conn = MMDFTransport(self.location) + else: + conn = registry[self.type].from_url(self.uri) return conn def process_incoming_message(self, message): diff --git a/django_mailbox/transports/__init__.py b/django_mailbox/transports/__init__.py index 7aeef95..b995258 100644 --- a/django_mailbox/transports/__init__.py +++ b/django_mailbox/transports/__init__.py @@ -8,3 +8,4 @@ from django_mailbox.transports.babyl import BabylTransport from django_mailbox.transports.mh import MHTransport from django_mailbox.transports.mmdf import MMDFTransport from django_mailbox.transports.gmail import GmailImapTransport +from django_mailbox.transports.registry import registry, register diff --git a/django_mailbox/transports/base.py b/django_mailbox/transports/base.py index a90af9f..38fdebd 100644 --- a/django_mailbox/transports/base.py +++ b/django_mailbox/transports/base.py @@ -9,3 +9,10 @@ class EmailTransport: message = email.message_from_bytes(contents) return message + + +class PluggableEmailTransport(EmailTransport): + @classmethod + def from_uri(cls, uri): + raise NotImplemented("The class does not implement {0}.from_uri, and it should. " + "Overwrite {0}.from_uri.".format(cls.__name__)) diff --git a/django_mailbox/transports/registry.py b/django_mailbox/transports/registry.py new file mode 100644 index 0000000..4ed847e --- /dev/null +++ b/django_mailbox/transports/registry.py @@ -0,0 +1,8 @@ +registry = {} + + +def register(transport_type): + def decorator(f): + registry[transport_type] = f + return f + return decorator