VirtualMailManager/EmailAddress.py
changeset 76 14c0a092d7d2
child 87 f9090d1a0730
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VirtualMailManager/EmailAddress.py	Mon Sep 08 05:30:17 2008 +0000
@@ -0,0 +1,87 @@
+# -*- coding: UTF-8 -*-
+# Copyright 2008 VEB IT
+# See COPYING for distribution information.
+# $Id$
+
+"""Virtual Mail Manager's EmailAddress class to handle e-mail addresses."""
+
+from constants.VERSION import VERSION
+
+__author__ = 'Pascal Volk <p.volk@veb-it.de>'
+__version__ = VERSION
+__revision__ = 'rev '+'$Rev$'.split()[1]
+__date__ = '$Date$'.split()[1]
+
+import re
+
+from Exceptions import VMMEmailAddressException as VMMEAE
+import VirtualMailManager as VMM
+import constants.ERROR as ERR
+
+RE_LOCALPART = """[^\w!#$%&'\*\+-\.\/=?^_`{\|}~]"""
+
+class EmailAddress(object):
+    def __init__(self, address):
+        self._localpart = None
+        self._domainname = None
+        self.__chkAddress(address)
+    
+    def __eq__(self, other):
+        if hasattr(other, '_localpart') and hasattr(other, '_domainname'):
+            return self._localpart == other._localpart\
+                    and self._domainname == other._domainname
+        else:
+            return NotImplemented
+
+    def __ne__(self, other):
+        if hasattr(other, '_localpart') and hasattr(other, '_domainname'):
+            return not self._localpart == other._localpart\
+                    and self._domainname == other._domainname
+        else:
+            return NotImplemented
+
+    def __repr__(self):
+        return "EmailAddress('%s@%s')" % (self._localpart, self._domainname)
+
+    def __str__(self):
+        return "%s@%s" % (self._localpart, self._domainname)
+
+    def __chkAddress(self, address):
+        try:
+            localpart, domain = address.split('@')
+        except ValueError:
+            raise VMMEAE(_(u"Missing '@' sign in e-mail address »%s«.") %
+                address, ERR.INVALID_ADDRESS)
+        except AttributeError:
+            raise VMMEAE(_(u"»%s« looks not like an e-mail address.") %
+                address, ERR.INVALID_ADDRESS)
+        if len(domain) > 0:
+            domain = VMM.VirtualMailManager.chkDomainname(domain)
+        else:
+            raise VMMEAE(_(u"Missing domain name after »%s@«.") %
+                    localpart, ERR.DOMAIN_NO_NAME)
+        localpart = self.__chkLocalpart(localpart)
+        self._localpart, self._domainname = localpart, domain
+
+    def __chkLocalpart(self, localpart):
+        """Validates the local part of an e-mail address.
+        
+        Keyword arguments:
+        localpart -- of the e-mail address that should be validated (str)
+        """
+        if len(localpart) < 1:
+            raise VMMEAE(_(u'No localpart specified.'),
+                ERR.LOCALPART_INVALID)
+        if len(localpart) > 64:
+            raise VMMEAE(_(u'The local part »%s« is too long') %
+                localpart, ERR.LOCALPART_TOO_LONG)
+        ic = re.compile(RE_LOCALPART).findall(localpart)
+        if len(ic):
+            ichrs = ''
+            for c in set(ic):
+                ichrs += u"»%s« " % c
+            raise VMMEAE(_(u"The local part »%(lpart)s« contains invalid\
+ characters: %(ichrs)s") % {'lpart': localpart, 'ichrs': ichrs},
+                ERR.LOCALPART_INVALID)
+        return localpart
+