11import mimetypes
2- from email .charset import QP , Charset
3- from email .header import decode_header , make_header
4- from email .headerregistry import Address
52
63from ..exceptions import AnymailRequestsAPIError
74from ..message import AnymailRecipientStatus
129)
1310from .base_requests import AnymailRequestsBackend , RequestsPayload
1411
15- # Used to force RFC-2047 encoded word
16- # in address formatting workaround
17- QP_CHARSET = Charset ("utf-8" )
18- QP_CHARSET .header_encoding = QP
19-
2012
2113class EmailBackend (AnymailRequestsBackend ):
2214 """
@@ -39,18 +31,6 @@ def __init__(self, **kwargs):
3931 )
4032 if not api_url .endswith ("/" ):
4133 api_url += "/"
42-
43- # Undocumented setting to control workarounds for Resend display-name issues
44- # (see below). If/when Resend improves their API, you can disable Anymail's
45- # workarounds by adding `"RESEND_WORKAROUND_DISPLAY_NAME_BUGS": False`
46- # to your `ANYMAIL` settings.
47- self .workaround_display_name_bugs = get_anymail_setting (
48- "workaround_display_name_bugs" ,
49- esp_name = esp_name ,
50- kwargs = kwargs ,
51- default = True ,
52- )
53-
5434 super ().__init__ (api_url , ** kwargs )
5535
5636 def build_message_payload (self , message , defaults ):
@@ -118,7 +98,7 @@ def serialize_data(self):
11898 payload = []
11999 for to_email , to in zip (to_emails , self .to_recipients ):
120100 data = self .data .copy ()
121- data ["to" ] = [to_email ] # formatted for Resend (w/ workarounds)
101+ data ["to" ] = [to_email ]
122102 if to .addr_spec in self .merge_metadata :
123103 # Merge global metadata with any per-recipient metadata.
124104 recipient_metadata = self .metadata .copy ()
@@ -149,59 +129,14 @@ def serialize_data(self):
149129 def init_payload (self ):
150130 self .data = {} # becomes json
151131
152- def _resend_email_address (self , address ):
153- """
154- Return EmailAddress address formatted for use with Resend.
155-
156- Works around a Resend bug that rejects properly formatted RFC 5322
157- addresses that have the display-name enclosed in double quotes (e.g.,
158- any display-name containing a comma), by substituting an RFC 2047
159- encoded word.
160-
161- This works for all Resend address fields _except_ `from` (see below).
162- """
163- formatted = address .address
164- if self .backend .workaround_display_name_bugs :
165- if formatted .startswith ('"' ):
166- # Workaround: force RFC-2047 encoded word
167- formatted = str (
168- Address (
169- display_name = QP_CHARSET .header_encode (address .display_name ),
170- addr_spec = address .addr_spec ,
171- )
172- )
173- return formatted
174-
175132 def set_from_email (self , email ):
176- # Can't use the address header workaround above for the `from` field:
177- # self.data["from"] = self._resend_email_address(email)
178- # When `from` uses RFC-2047 encoding, Resend returns a "security_error"
179- # status 451, "The email payload contain invalid characters".
180- formatted = email .address
181- if self .backend .workaround_display_name_bugs :
182- if formatted .startswith ("=?" ):
183- # Workaround: use an *unencoded* (Unicode str) display-name.
184- # This allows use of non-ASCII characters (which Resend rejects when
185- # encoded with RFC 2047). Some punctuation will still result in unusual
186- # behavior or cause an "invalid `from` field" 422 error, but there's
187- # nothing we can do about that.
188- formatted = str (
189- # email.headerregistry.Address str format uses unencoded Unicode
190- Address (
191- # Convert RFC 2047 display name back to Unicode str
192- display_name = str (
193- make_header (decode_header (email .display_name ))
194- ),
195- addr_spec = email .addr_spec ,
196- )
197- )
198- self .data ["from" ] = formatted
133+ self .data ["from" ] = email .address
199134
200135 def set_recipients (self , recipient_type , emails ):
201136 assert recipient_type in ["to" , "cc" , "bcc" ]
202137 if emails :
203138 field = recipient_type
204- self .data [field ] = [self . _resend_email_address ( email ) for email in emails ]
139+ self .data [field ] = [email . address for email in emails ]
205140 self .recipients += emails
206141 if recipient_type == "to" :
207142 self .to_recipients = emails
@@ -211,9 +146,7 @@ def set_subject(self, subject):
211146
212147 def set_reply_to (self , emails ):
213148 if emails :
214- self .data ["reply_to" ] = [
215- self ._resend_email_address (email ) for email in emails
216- ]
149+ self .data ["reply_to" ] = [email .address for email in emails ]
217150
218151 def set_extra_headers (self , headers ):
219152 # Resend requires header values to be strings (not integers) as of 2023-10-20.
0 commit comments