diff -r af813ede1e19 -r 14c0a092d7d2 VirtualMailManager/EmailAddress.py --- /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 ' +__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 +