Feature: add support for emailing multiple documents (#10666)

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
Jan Kleine
2025-10-13 22:16:43 +02:00
committed by GitHub
parent 495159f0b2
commit f0d1c75fac
14 changed files with 558 additions and 89 deletions

View File

@@ -10,11 +10,20 @@ def send_email(
subject: str,
body: str,
to: list[str],
attachment: Path | None = None,
attachment_mime_type: str | None = None,
attachments: list[tuple[Path, str]],
) -> int:
"""
Send an email with an optional attachment.
Send an email with attachments.
Args:
subject: Email subject
body: Email body text
to: List of recipient email addresses
attachments: List of (path, mime_type) tuples for attachments (the list may be empty)
Returns:
Number of emails sent
TODO: re-evaluate this pending https://code.djangoproject.com/ticket/35581 / https://github.com/django/django/pull/18966
"""
email = EmailMessage(
@@ -22,17 +31,20 @@ def send_email(
body=body,
to=to,
)
if attachment:
# Something could be renaming the file concurrently so it can't be attached
with FileLock(settings.MEDIA_LOCK), attachment.open("rb") as f:
content = f.read()
if attachment_mime_type == "message/rfc822":
# See https://forum.djangoproject.com/t/using-emailmessage-with-an-attached-email-file-crashes-due-to-non-ascii/37981
content = message_from_bytes(f.read())
email.attach(
filename=attachment.name,
content=content,
mimetype=attachment_mime_type,
)
# Something could be renaming the file concurrently so it can't be attached
with FileLock(settings.MEDIA_LOCK):
for attachment_path, mime_type in attachments:
with attachment_path.open("rb") as f:
content = f.read()
if mime_type == "message/rfc822":
# See https://forum.djangoproject.com/t/using-emailmessage-with-an-attached-email-file-crashes-due-to-non-ascii/37981
content = message_from_bytes(content)
email.attach(
filename=attachment_path.name,
content=content,
mimetype=mime_type,
)
return email.send()