# -*- coding: UTF-8 -*-# Copyright (c) 2008 - 2010, Pascal Volk# See COPYING for distribution information."""Virtual Mail Manager's EmailAddress class to handle e-mail addresses."""importrefromVirtualMailManagerimportchk_domainnamefromVirtualMailManager.constants.ERRORimport \DOMAIN_NO_NAME,INVALID_ADDRESS,LOCALPART_INVALID,LOCALPART_TOO_LONGfromVirtualMailManager.ExceptionsimportVMMEmailAddressExceptionasVMMEAERE_LOCALPART="""[^\w!#$%&'\*\+-\.\/=?^_`{\|}~]"""classEmailAddress(object):__slots__=('_localpart','_domainname')def__init__(self,address):ifnotisinstance(address,basestring):raiseTypeError('address is not a str/unicode object: %r'%address)self._localpart=Noneself._domainname=Noneself.__chkAddress(address)def__eq__(self,other):ifisinstance(other,self.__class__):returnself._localpart==other._localpartand \self._domainname==other._domainnamereturnNotImplementeddef__ne__(self,other):ifisinstance(other,self.__class__):returnself._localpart!=other._localpartor \self._domainname!=other._domainnamereturnNotImplementeddef__repr__(self):return"EmailAddress('%s@%s')"%(self._localpart,self._domainname)def__str__(self):return"%s@%s"%(self._localpart,self._domainname)def__chkAddress(self,address):parts=address.split('@')p_len=len(parts)ifp_lenis2:self._localpart=self.__chkLocalpart(parts[0])iflen(parts[1])>0:self._domainname=chk_domainname(parts[1])else:raiseVMMEAE(_(u"Missing domain name after “%s@”.")%self._localpart,DOMAIN_NO_NAME)elifp_len<2:raiseVMMEAE(_(u"Missing '@' sign in e-mail address “%s”.")%address,INVALID_ADDRESS)elifp_len>2:raiseVMMEAE(_(u"Too many '@' signs in e-mail address “%s”.")%address,INVALID_ADDRESS)def__chkLocalpart(self,localpart):"""Validates the local-part of an e-mail address. Arguments: localpart -- local-part of the e-mail address that should be validated """iflen(localpart)<1:raiseVMMEAE(_(u'No local-part specified.'),LOCALPART_INVALID)iflen(localpart)>64:raiseVMMEAE(_(u'The local-part “%s” is too long')%localpart,LOCALPART_TOO_LONG)ic=set(re.findall(RE_LOCALPART,localpart))iflen(ic):ichrs=u''.join((u'“%s” '%cforcinic))raiseVMMEAE(_(u"The local-part “%(lpart)s” contains invalid\ characters: %(ichrs)s")%{'lpart':localpart,'ichrs':ichrs},LOCALPART_INVALID)returnlocalpart