#!/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
 
