From ae938f9909013ff8322d06f8d2ffb76f2b1fee5f Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Thu, 8 Jan 2026 14:59:49 +0900 Subject: [PATCH] v0.44.0: Add more REGEX patters for email matching --- pyproject.toml | 2 +- src/corelibs/email_handling/send_email.py | 38 +++++++++++++++++------ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9f22f6a..3e9e428 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ # MARK: Project info [project] name = "corelibs" -version = "0.43.4" +version = "0.44.0" description = "Collection of utils for Python scripts" readme = "README.md" requires-python = ">=3.13" diff --git a/src/corelibs/email_handling/send_email.py b/src/corelibs/email_handling/send_email.py index df88ad6..409cca4 100644 --- a/src/corelibs/email_handling/send_email.py +++ b/src/corelibs/email_handling/send_email.py @@ -4,6 +4,8 @@ Send email wrapper import smtplib from email.message import EmailMessage +from email.header import Header +from email.utils import formataddr, parseaddr from typing import TYPE_CHECKING, Any if TYPE_CHECKING: from corelibs.logging_handling.log import Logger @@ -133,21 +135,30 @@ class SendEmail: _subject = template["subject"] _body = template["body"] for key, value in replace.items(): - _subject = _subject.replace(f"{{{{{key}}}}}", value) - _body = _body.replace(f"{{{{{key}}}}}", value) + placeholder = f"{{{{{key}}}}}" + _subject = _subject.replace(placeholder, value) + _body = _body.replace(placeholder, value) + name, addr = parseaddr(from_email) + if name: + # Encode the name part with MIME encoding + encoded_name = str(Header(name, 'utf-8')) + from_email_encoded = formataddr((encoded_name, addr)) + else: + from_email_encoded = from_email # create a simple email and add subhect, from email msg_email = EmailMessage() # msg.set_content(_body, charset='utf-8', cte='quoted-printable') msg_email.set_content(_body, charset="utf-8") msg_email["Subject"] = _subject - msg_email["From"] = from_email + msg_email["From"] = from_email_encoded # push to array for sening msg.append(msg_email) return msg def send_email_list( self, - email: list[EmailMessage], receivers: list[str], + emails: list[EmailMessage], + receivers: list[str], combined_send: bool | None = None, test_only: bool | None = None ): @@ -170,18 +181,27 @@ class SendEmail: smtp = smtplib.SMTP(smtp_host) except ConnectionRefusedError as e: self.log.error("Could not open SMTP connection to: %s, %s", smtp_host, e) + # prepare receiver list + receivers_encoded: list[str] = [] + for __receiver in receivers: + to_name, to_addr = parseaddr(__receiver) + if to_name: + # Encode the name part with MIME encoding + encoded_to_name = str(Header(to_name, 'utf-8')) + receivers_encoded.append(formataddr((encoded_to_name, to_addr))) + else: + receivers_encoded.append(__receiver) # loop over messages and then over recievers - for msg in email: + for msg in emails: if combined_send is True: - msg["To"] = ", ".join(receivers) + msg["To"] = ", ".join(receivers_encoded) if not self.settings.get('test'): if smtp is not None: - smtp.send_message(msg, msg["From"], receivers) + smtp.send_message(msg, msg["From"], receivers_encoded) else: self.log.info(f"[EMAIL] Test, not sending email\n{msg}") else: - for receiver in receivers: - # send to + for receiver in receivers_encoded: self.log.debug(f"===> Send to: {receiver}") if "To" in msg: msg.replace_header("To", receiver)