1
2
3 """TurboMail utility functions and support classes."""
4
5
6 from turbomail.compat import Header, formataddr, parseaddr
7 from turbomail.email_validator import EmailValidator, ValidationException
8
9
10 __all__ = ['Address', 'AddressList']
11
12
13
15 """Validated electronic mail address class.
16
17 This class knows how to validate and format e-mail addresses. It
18 uses Python's built-in `parseaddr` and `formataddr` helper
19 functions and helps guarantee a uniform base for all e-mail
20 address operations.
21
22 The AddressList unit tests provide comprehensive testing of this
23 class as well."""
24
25 - def __init__(self, name_or_email, email=None):
26 if email == None:
27 if isinstance(name_or_email, AddressList):
28 assert len(name_or_email) > 0
29 name_or_email = str(name_or_email[0])
30 if isinstance(name_or_email, basestring):
31 self.name, self.address = parseaddr(name_or_email)
32 elif not isinstance(name_or_email, basestring):
33 self.name, self.address = name_or_email
34 else:
35 self.name = name_or_email
36 self.address = email
37 if not self.is_valid_address(self.address):
38 raise ValueError, 'Invalid e-mail address.'
39
41 if isinstance(other, (Address, basestring)):
42 return cmp(str(self), str(other))
43 elif isinstance(other, tuple):
44 return cmp((self.name, self.address), other)
45 return cmp(self, other)
46
48 return 'Address(\'%s\')' % str(self)
49
52
53 - def encode(self, encoding="ascii"):
54 assert self.address, "You must specify an address."
55 name_string = self.name
56 if isinstance(name_string, unicode):
57 name_string = str(Header(name_string, encoding))
58
59
60 localpart, domain = self.address.split('@', 1)
61 if isinstance(domain, unicode):
62 domain = domain.encode('idna')
63 address = '@'.join((localpart, domain))
64
65 return formataddr((name_string, address)).replace('\n', '')
66
73
74
76 - def __init__(self, addresses=[], encoding=None):
88
90 if not self:
91 return "AddressList()"
92
93 return "AddressList(\"" + "\", \"".join([str(i) for i in self]) + "\")"
94
96 return self.encode(self.encoding)
97
98 - def encode(self, encoding="ascii"):
103
108
116
119
122 addresses = property(addresses)
123
125 """Return a list of string representations of the addresses suitable for
126 usage in an SMTP transaction."""
127 address_strings = []
128 for address in self:
129 address_strings.append(str(address))
130 return address_strings
131 string_addresses = property(string_addresses)
132
134 def fget(self):
135 return getattr(self, field)
136
137 def fset(self, value):
138 if not isinstance(value, AddressList):
139 value = AddressList(value)
140 setattr(self, field, AddressList(value))
141
142 def fdel(self):
143 setattr(self, field, AddressList())
144
145 return property(fget, fset, fdel)
146 protected = classmethod(protected)
147