Bonsoir,
Ce message pourrait faire lâobjet dâune nouvelle issue mais je soupçonne fortement une rĂ©gressionâŠ
En effet, il semblerait que je ne peux plus utiliser frappe.sendmail() avec un sujet qui comporte un accent.
Depuis la console, ceci fonctionne
frappe.sendmail(
recipients=['blabla@gmail.com'],
subject="Message sans accent",
message="Lien",
as_markdown=False,
delayed=False,
)
alors que ceci génÚre une erreur :
frappe.sendmail(
recipients=['blabla@gmail.com'],
subject="Message accentué",
message="Lien",
as_markdown=False,
delayed=False,
)
Voici la trace :
In [7]: frappe.sendmail(
...: recipients=['blabla@gmail.com'],
...: subject="Message accentué",
...: message="Lien",
...: as_markdown=False,
...: delayed=False,
...: )
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~/dokos/apps/frappe/frappe/commands/utils.py in <module>
4 message="Lien",
5 as_markdown=False,
----> 6 delayed=False,
7 )
~/dokos/apps/frappe/frappe/__init__.py in sendmail(recipients, sender, subject, message, as_markdown, delayed, reference_doctype, reference_name, unsubscribe_method, unsubscribe_params, unsubscribe_message, add_unsubscribe_link, attachments, content, doctype, name, reply_to, queue_separately, cc, bcc, message_id, in_reply_to, send_after, expose_recipients, send_priority, communication, retry, now, read_receipt, is_notification, inline_images, template, args, header, print_letterhead, with_container)
531 send_after=send_after, expose_recipients=expose_recipients, send_priority=send_priority, queue_separately=queue_separately,
532 communication=communication, now=now, read_receipt=read_receipt, is_notification=is_notification,
--> 533 inline_images=inline_images, header=header, print_letterhead=print_letterhead, with_container=with_container)
534
535 whitelisted = []
~/dokos/apps/frappe/frappe/email/queue.py in send(recipients, sender, subject, message, text_content, reference_doctype, reference_name, unsubscribe_method, unsubscribe_params, unsubscribe_message, attachments, reply_to, cc, bcc, message_id, in_reply_to, send_after, expose_recipients, send_priority, communication, now, read_receipt, queue_separately, is_notification, add_unsubscribe_link, inline_images, header, print_letterhead, with_container)
163 header=header,
164 now=now,
--> 165 print_letterhead=print_letterhead)
166
167
~/dokos/apps/frappe/frappe/email/queue.py in add(recipients, sender, subject, **kwargs)
184 frappe.db.commit()
185 else:
--> 186 email_queue = get_email_queue(recipients, sender, subject, **kwargs)
187 if kwargs.get('now'):
188 send_one(email_queue.name, now=True)
~/dokos/apps/frappe/frappe/email/queue.py in get_email_queue(recipients, sender, subject, **kwargs)
228
229 e.message_id = mail.msg_root["Message-Id"].strip(" <>")
--> 230 e.message = cstr(mail.as_string())
231 e.sender = mail.sender
232
~/dokos/apps/frappe/frappe/email/email_body.py in as_string(self)
246 self.validate()
247 self.make()
--> 248 return self.msg_root.as_string(policy=policy.SMTP)
249
250 def get_formatted_html(subject, message, footer=None, print_html=None,
/usr/lib/python3.7/email/message.py in as_string(self, unixfrom, maxheaderlen, policy)
156 maxheaderlen=maxheaderlen,
157 policy=policy)
--> 158 g.flatten(self, unixfrom=unixfrom)
159 return fp.getvalue()
160
/usr/lib/python3.7/email/generator.py in flatten(self, msg, unixfrom, linesep)
114 ufrom = 'From nobody ' + time.ctime(time.time())
115 self.write(ufrom + self._NL)
--> 116 self._write(msg)
117 finally:
118 self.policy = old_gen_policy
/usr/lib/python3.7/email/generator.py in _write(self, msg)
193 meth = getattr(msg, '_write_headers', None)
194 if meth is None:
--> 195 self._write_headers(msg)
196 else:
197 meth(self)
/usr/lib/python3.7/email/generator.py in _write_headers(self, msg)
220 def _write_headers(self, msg):
221 for h, v in msg.raw_items():
--> 222 self.write(self.policy.fold(h, v))
223 # A blank line always separates headers from body
224 self.write(self._NL)
/usr/lib/python3.7/email/policy.py in fold(self, name, value)
181
182 """
--> 183 return self._fold(name, value, refold_binary=True)
184
185 def fold_binary(self, name, value):
/usr/lib/python3.7/email/policy.py in _fold(self, name, value, refold_binary)
203 def _fold(self, name, value, refold_binary=False):
204 if hasattr(value, 'name'):
--> 205 return value.fold(policy=self)
206 maxlen = self.max_line_length if self.max_line_length else float('inf')
207 lines = value.splitlines()
/usr/lib/python3.7/email/headerregistry.py in fold(self, policy)
256 parser.CFWSList([parser.WhiteSpaceTerminal(' ', 'fws')]))
257 header.append(self._parse_tree)
--> 258 return header.fold(policy=policy)
259
260
/usr/lib/python3.7/email/_header_value_parser.py in fold(self, policy)
142
143 def fold(self, *, policy):
--> 144 return _refold_parse_tree(self, policy=policy)
145
146 def pprint(self, indent=''):
/usr/lib/python3.7/email/_header_value_parser.py in _refold_parse_tree(parse_tree, policy)
2650 # combining it with previously encoded words if allowed.
2651 last_ew = _fold_as_ew(tstr, lines, maxlen, last_ew,
-> 2652 part.ew_combine_allowed, charset)
2653 want_encoding = False
2654 continue
/usr/lib/python3.7/email/_header_value_parser.py in _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset)
2727 # XXX We'll get an infinite loop here if maxlen is <= 7
2728 continue
-> 2729 first_part = to_encode[:text_space]
2730 ew = _ew.encode(first_part, charset=encode_as)
2731 excess = len(ew) - remaining_space
TypeError: slice indices must be integers or None or have an __index__ method
Dans le fichier apps/frappe/frappe/email/email_body.py
, la ligne 248 est appelée.
Ligne modifiée dans ce commit : fix: Change encoding policy to correctly encode subject in header (67842c03) · Commits · atelierdusoleiletudvent / Dodock · GitLab
Et commit qui a Ă©tĂ© effectuĂ© suite aux Ă©changes ci-dessusâŠ
Pouvez-vous reproduire le bug ?