@@ -116,7 +116,7 @@ def update_deep(dct, other):
116116 # (like dict.update(), no return value)
117117
118118
119- def parse_address_list (address_list ):
119+ def parse_address_list (address_list , field = None ):
120120 """Returns a list of EmailAddress objects from strings in address_list.
121121
122122 Essentially wraps :func:`email.utils.getaddresses` with better error
@@ -127,6 +127,8 @@ def parse_address_list(address_list):
127127
128128 :param list[str]|str|None|list[None] address_list:
129129 the address or addresses to parse
130+ :param str|None field:
131+ optional description of the source of these addresses, for error message
130132 :return list[:class:`EmailAddress`]:
131133 :raises :exc:`AnymailInvalidAddress`:
132134 """
@@ -151,26 +153,32 @@ def parse_address_list(address_list):
151153 for address in parsed :
152154 if address .username == '' or address .domain == '' :
153155 # Django SMTP allows username-only emails, but they're not meaningful with an ESP
154- errmsg = "Invalid email address '%s' parsed from '%s'." % (
155- address .addr_spec , ", " .join (address_list_strings ))
156+ errmsg = "Invalid email address '{problem}' parsed from '{source}'{where}." .format (
157+ problem = address .addr_spec ,
158+ source = ", " .join (address_list_strings ),
159+ where = " in `%s`" % field if field else "" ,
160+ )
156161 if len (parsed ) > len (address_list ):
157162 errmsg += " (Maybe missing quotes around a display-name?)"
158163 raise AnymailInvalidAddress (errmsg )
159164
160165 return parsed
161166
162167
163- def parse_single_address (address ):
168+ def parse_single_address (address , field = None ):
164169 """Parses a single EmailAddress from str address, or raises AnymailInvalidAddress
165170
166171 :param str address: the fully-formatted email str to parse
172+ :param str|None field: optional description of the source of this address, for error message
167173 :return :class:`EmailAddress`: if address contains a single email
168174 :raises :exc:`AnymailInvalidAddress`: if address contains no or multiple emails
169175 """
170- parsed = parse_address_list ([address ])
176+ parsed = parse_address_list ([address ], field = field )
171177 count = len (parsed )
172178 if count > 1 :
173- raise AnymailInvalidAddress ("Only one email address is allowed; found %d in %r" % (count , address ))
179+ raise AnymailInvalidAddress (
180+ "Only one email address is allowed; found {count} in '{address}'{where}." .format (
181+ count = count , address = address , where = " in `%s`" % field if field else "" ))
174182 else :
175183 return parsed [0 ]
176184
0 commit comments