comparison mercurial/mail.py @ 9948:e5b44a7986d0

mail: add parseaddrlist() function for parsing many addresses at once Adds a new function addrlistencode() to mercurial.mail, like addressencode(), but accepts a list of addresses as input, and returns a list of formatted addresses. This will be used by patchbomb. The difference is that each element in the input list can contain multiple addresses (comma separated or otherwise), and are split using Python's email.Utils.getaddresses().
author Marti Raudsepp <marti@juffo.org>
date Thu, 26 Nov 2009 10:47:39 +0200
parents f0e99a2eac76
children d6512b3e9ac0
comparison
equal deleted inserted replaced
9947:4600e6222efb 9948:e5b44a7986d0
158 # split into words? 158 # split into words?
159 s, cs = _encode(ui, s, charsets) 159 s, cs = _encode(ui, s, charsets)
160 return str(email.Header.Header(s, cs)) 160 return str(email.Header.Header(s, cs))
161 return s 161 return s
162 162
163 def addressencode(ui, address, charsets=None, display=False): 163 def _addressencode(ui, name, addr, charsets=None):
164 '''Turns address into RFC-2047 compliant header.'''
165 if display or not address:
166 return address or ''
167 name, addr = email.Utils.parseaddr(address)
168 name = headencode(ui, name, charsets) 164 name = headencode(ui, name, charsets)
169 try: 165 try:
170 acc, dom = addr.split('@') 166 acc, dom = addr.split('@')
171 acc = acc.encode('ascii') 167 acc = acc.encode('ascii')
172 dom = dom.decode(encoding.encoding).encode('idna') 168 dom = dom.decode(encoding.encoding).encode('idna')
179 addr = addr.encode('ascii') 175 addr = addr.encode('ascii')
180 except UnicodeDecodeError: 176 except UnicodeDecodeError:
181 raise util.Abort(_('invalid local address: %s') % addr) 177 raise util.Abort(_('invalid local address: %s') % addr)
182 return email.Utils.formataddr((name, addr)) 178 return email.Utils.formataddr((name, addr))
183 179
180 def addressencode(ui, address, charsets=None, display=False):
181 '''Turns address into RFC-2047 compliant header.'''
182 if display or not address:
183 return address or ''
184 name, addr = email.Utils.parseaddr(address)
185 return _addressencode(ui, name, addr, charsets)
186
187 def addrlistencode(ui, addrs, charsets=None, display=False):
188 '''Turns a list of addresses into a list of RFC-2047 compliant headers.
189 A single element of input list may contain multiple addresses, but output
190 always has one address per item'''
191 if display:
192 return [a.strip() for a in addrs if a.strip()]
193
194 result = []
195 for name, addr in email.Utils.getaddresses(addrs):
196 if name or addr:
197 result.append(_addressencode(ui, name, addr, charsets))
198 return result
199
184 def mimeencode(ui, s, charsets=None, display=False): 200 def mimeencode(ui, s, charsets=None, display=False):
185 '''creates mime text object, encodes it if needed, and sets 201 '''creates mime text object, encodes it if needed, and sets
186 charset and transfer-encoding accordingly.''' 202 charset and transfer-encoding accordingly.'''
187 cs = 'us-ascii' 203 cs = 'us-ascii'
188 if not display: 204 if not display: