From ec7953bf0758be604f5f188b4743e49511a3606d Mon Sep 17 00:00:00 2001 From: TIANYOU CHEN <42710806+CTY-git@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:51:33 +0800 Subject: [PATCH 1/3] Allow eml_file_path in SendEmail and append body google style --- patchwork/steps/ReadEmail/ReadEmail.py | 3 +- patchwork/steps/ReadEmail/typed.py | 1 - patchwork/steps/SendEmail/SendEmail.py | 50 ++++++++++++++++++-------- patchwork/steps/SendEmail/typed.py | 5 ++- pyproject.toml | 2 +- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/patchwork/steps/ReadEmail/ReadEmail.py b/patchwork/steps/ReadEmail/ReadEmail.py index d3b04b9b6..b3abb3968 100644 --- a/patchwork/steps/ReadEmail/ReadEmail.py +++ b/patchwork/steps/ReadEmail/ReadEmail.py @@ -101,6 +101,7 @@ def run(self) -> dict: ) for body in email_data.body: - rv["body"] += body.content + rv["body"] = body.content + break return rv diff --git a/patchwork/steps/ReadEmail/typed.py b/patchwork/steps/ReadEmail/typed.py index daa211f88..eb60e1bbc 100644 --- a/patchwork/steps/ReadEmail/typed.py +++ b/patchwork/steps/ReadEmail/typed.py @@ -13,7 +13,6 @@ class ReadEmailInputs(__ReadEmailRequiredInputs, total=False): class Attachment(TypedDict): path: str - content: str class ReadEmailOutputs(TypedDict): diff --git a/patchwork/steps/SendEmail/SendEmail.py b/patchwork/steps/SendEmail/SendEmail.py index 9cd41a423..cfd64f31f 100644 --- a/patchwork/steps/SendEmail/SendEmail.py +++ b/patchwork/steps/SendEmail/SendEmail.py @@ -1,37 +1,48 @@ from __future__ import annotations import smtplib +import textwrap +from datetime import datetime from email.message import EmailMessage from patchwork.common.utils.utils import mustache_render from patchwork.step import Step +from patchwork.steps import ReadEmail from patchwork.steps.SendEmail.typed import SendEmailInputs, SendEmailOutputs class SendEmail(Step, input_class=SendEmailInputs, output_class=SendEmailOutputs): def __init__(self, inputs): super().__init__(inputs) - self.email_template_value = inputs.get("email_template_value", dict()) - self.subject = inputs.get("subject", "Patchwork Execution Email") - self.body = inputs.get("body", "Patchwork Execution Email") - self.sender_email = inputs["sender_email"] - self.recipient_email = inputs["recipient_email"] self.smtp_host = inputs.get("smtp_host", "smtp.gmail.com") self.smtp_username = inputs["smtp_username"] self.smtp_password = inputs["smtp_password"] self.smtp_port = int(inputs.get("smtp_port", 25)) - self.reply_message_id = inputs.get("reply_message_id") self.is_ssl = bool(inputs.get("is_smtp_ssl", False)) + self.sender_email = inputs["sender_email"] + self.recipient_email = inputs["recipient_email"] + email_template_value = inputs.get("email_template_value", dict()) + self.subject = mustache_render(inputs.get("subject", "Patchwork Execution Email"), email_template_value) + self.body = mustache_render(inputs.get("body", "Patchwork Execution Email"), email_template_value) + self.reply_message_id = inputs.get("reply_message_id") + self.__handle_eml_file(inputs.get("reply_eml_file_path")) + + def __handle_eml_file(self, eml_file: str): + if eml_file is None: + return + + original_email_data = ReadEmail(dict(eml_file_path=eml_file)).run() + timestamp: datetime = original_email_data.get("datetime") + date_str = timestamp.date().strftime('%-d %b %Y') + time_str = timestamp.time().strftime('%H:%M') + from_ = original_email_data.get("from") + self.subject = original_email_data.get("subject") + self.body += f"\n\nOn {date_str} at {time_str}, {from_} wrote:\n\n" + textwrap.indent(original_email_data.get("body"), "> ") + self.reply_message_id = original_email_data.get("message_id") + def run(self) -> dict: - msg = EmailMessage() - msg.set_content(mustache_render(self.body, self.email_template_value)) - msg["Subject"] = mustache_render(self.subject, self.email_template_value) - msg["From"] = self.sender_email - msg["To"] = self.recipient_email - if self.reply_message_id is not None: - msg.add_header("References", self.reply_message_id) - msg.add_header("In-Reply-To", self.reply_message_id) + msg = self.__create_email_message() smtp_clazz = smtplib.SMTP if self.is_ssl: @@ -41,3 +52,14 @@ def run(self) -> dict: mailserver.login(self.smtp_username, self.smtp_password) mailserver.send_message(msg) return dict() + + def __create_email_message(self): + msg = EmailMessage() + msg.set_content(self.body) + msg["Subject"] = self.subject + msg["From"] = self.sender_email + msg["To"] = self.recipient_email + if self.reply_message_id is not None: + msg.add_header("References", self.reply_message_id) + msg.add_header("In-Reply-To", self.reply_message_id) + return msg diff --git a/patchwork/steps/SendEmail/typed.py b/patchwork/steps/SendEmail/typed.py index a08f8e2ea..ccbf67a2b 100644 --- a/patchwork/steps/SendEmail/typed.py +++ b/patchwork/steps/SendEmail/typed.py @@ -1,4 +1,6 @@ -from typing_extensions import Any, TypedDict +from typing_extensions import Any, TypedDict, Annotated + +from patchwork.common.utils.step_typing import StepTypeConfig class __SendEmailRequiredInputs(TypedDict): @@ -16,6 +18,7 @@ class SendEmailInputs(__SendEmailRequiredInputs, total=False): smtp_port: int reply_message_id: str is_smtp_ssl: str + reply_eml_file_path: Annotated[str, StepTypeConfig(is_path=True)] class SendEmailOutputs(TypedDict): diff --git a/pyproject.toml b/pyproject.toml index 60f8c9138..df155974a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "patchwork-cli" -version = "0.0.117" +version = "0.0.117.dev0" description = "" authors = ["patched.codes"] license = "AGPL" From 0d74d09482fb4a3cf090e346a8744ae9212ae069 Mon Sep 17 00:00:00 2001 From: TIANYOU CHEN <42710806+CTY-git@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:53:22 +0800 Subject: [PATCH 2/3] update import --- patchwork/steps/SendEmail/SendEmail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patchwork/steps/SendEmail/SendEmail.py b/patchwork/steps/SendEmail/SendEmail.py index cfd64f31f..6dc279346 100644 --- a/patchwork/steps/SendEmail/SendEmail.py +++ b/patchwork/steps/SendEmail/SendEmail.py @@ -7,7 +7,7 @@ from patchwork.common.utils.utils import mustache_render from patchwork.step import Step -from patchwork.steps import ReadEmail +from patchwork.steps.ReadEmail.ReadEmail import ReadEmail from patchwork.steps.SendEmail.typed import SendEmailInputs, SendEmailOutputs From dd0867c68a32ec609a617d7f917da16ee0b94d57 Mon Sep 17 00:00:00 2001 From: TIANYOU CHEN <42710806+CTY-git@users.noreply.github.com> Date: Tue, 18 Mar 2025 15:17:31 +0800 Subject: [PATCH 3/3] go to v0.0.117 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index df155974a..60f8c9138 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "patchwork-cli" -version = "0.0.117.dev0" +version = "0.0.117" description = "" authors = ["patched.codes"] license = "AGPL"