Package turbomail :: Module util
[hide private]
[frames] | no frames]

Source Code for Module turbomail.util

  1  # encoding: utf-8 
  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   
14 -class Address(object):
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
40 - def __cmp__(self, other):
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
47 - def __repr__(self):
48 return 'Address(\'%s\')' % str(self)
49
50 - def __str__(self):
51 return self.encode()
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 # Encode punycode for internationalized domains. 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
67 - def is_valid_address(self, address):
68 try: 69 EmailValidator().validate_or_raise(address) 70 return True 71 except ValidationException: 72 return False
73 74
75 -class AddressList(list):
76 - def __init__(self, addresses=[], encoding=None):
77 super(AddressList, self).__init__() 78 79 self.encoding = encoding 80 if isinstance(addresses, basestring): 81 addresses = addresses.split(',') 82 83 elif isinstance(addresses, tuple): 84 addresses = [addresses] 85 86 if addresses is not None: 87 self.extend(addresses)
88
89 - def __repr__(self):
90 if not self: 91 return "AddressList()" 92 93 return "AddressList(\"" + "\", \"".join([str(i) for i in self]) + "\")"
94
95 - def __str__(self):
96 return self.encode(self.encoding)
97
98 - def encode(self, encoding="ascii"):
99 addresses = [] 100 for address in self: 101 addresses.append(address.encode(encoding)) 102 return ", ".join(addresses)
103
104 - def __setitem__(self, k, value):
105 if not isinstance(value, Address): 106 value = Address(value) 107 super(AddressList, self).__setitem__(k, value)
108
109 - def extend(self, value):
110 values = [] 111 for i in value: 112 if not isinstance(i, Address): 113 i = Address(i) 114 values.append(i) 115 super(AddressList, self).extend(values)
116
117 - def append(self, value):
118 self.extend([value])
119
120 - def addresses(self):
121 return AddressList([i.address for i in self])
122 addresses = property(addresses) 123
124 - def string_addresses(self):
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
133 - def protected(cls, field):
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