#!/usr/bin/env python # -*- coding: ascii -*- ''' $Id: EmailAddress.py,v 1.2 2004/05/19 01:16:06 zen Exp $ ''' __rcs_id__ = '$Id: EmailAddress.py,v 1.2 2004/05/19 01:16:06 zen Exp $' __version__ = '$Revision: 1.2 $'[11:-2] import email.Header from email.Utils import formataddr, parseaddr def decode_header(s): ''' Decode an RFC2047 email header into a Unicode string ''' try: s = s.encode('ascii') except UnicodeEncodeError: return s s = email.Header.decode_header(s) s = [b[0].decode(b[1] or 'ascii') for b in s] return u''.join(s) class EmailAddress(unicode): def __new__(self, addr, name=''): if not name: name, addr = parseaddr(addr) try: account, domain = addr.split('@') except ValueError: raise ValueError, 'Invalid email address %r' % (addr,) name = decode_header(name) account = account.encode('ascii') try: domain = domain.encode('ascii').decode('idna') except UnicodeEncodeError: pass addr = '%s@%s' % (account, domain) return unicode.__new__(self, formataddr((name, addr))) def __str__(self): name, addr = parseaddr(self) account, domain = addr.split('@') # Account name must be ASCII (?) account = account.encode('ascii') # Encode domain domain = domain.encode('idna') # Encode name. try: name = name.encode('ascii') except UnicodeEncodeError: # RFC2047 prefers iso-8859-* name = str(email.Header.Header(name, charset='iso-8859-1')) return formataddr((name, '%s@%s' % (account, domain))) def __getattribute__(self, attr): if attr == 'name': return parseaddr(self)[0] elif attr == 'addr': return parseaddr(self)[1] return unicode.__getattribute__(self, attr) def __cmp__(self, other): if isinstance(other, EmailAddress): return cmp(unicode(self.lower()), unicode(other.lower())) return cmp(self, EmailAddress(other)) # vim: set filetype=python ts=4 sw=4 et si