Skip to content

Commit b385ca5

Browse files
authored
Allow eml_file_path in SendEmail and append body google style (#1516)
* Allow eml_file_path in SendEmail and append body google style * update import * go to v0.0.117
1 parent 4b54119 commit b385ca5

File tree

4 files changed

+42
-17
lines changed

4 files changed

+42
-17
lines changed

patchwork/steps/ReadEmail/ReadEmail.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ def run(self) -> dict:
101101
)
102102

103103
for body in email_data.body:
104-
rv["body"] += body.content
104+
rv["body"] = body.content
105+
break
105106

106107
return rv

patchwork/steps/ReadEmail/typed.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ class ReadEmailInputs(__ReadEmailRequiredInputs, total=False):
1313

1414
class Attachment(TypedDict):
1515
path: str
16-
content: str
1716

1817

1918
class ReadEmailOutputs(TypedDict):
Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,48 @@
11
from __future__ import annotations
22

33
import smtplib
4+
import textwrap
5+
from datetime import datetime
46
from email.message import EmailMessage
57

68
from patchwork.common.utils.utils import mustache_render
79
from patchwork.step import Step
10+
from patchwork.steps.ReadEmail.ReadEmail import ReadEmail
811
from patchwork.steps.SendEmail.typed import SendEmailInputs, SendEmailOutputs
912

1013

1114
class SendEmail(Step, input_class=SendEmailInputs, output_class=SendEmailOutputs):
1215
def __init__(self, inputs):
1316
super().__init__(inputs)
14-
self.email_template_value = inputs.get("email_template_value", dict())
15-
self.subject = inputs.get("subject", "Patchwork Execution Email")
16-
self.body = inputs.get("body", "Patchwork Execution Email")
17-
self.sender_email = inputs["sender_email"]
18-
self.recipient_email = inputs["recipient_email"]
1917
self.smtp_host = inputs.get("smtp_host", "smtp.gmail.com")
2018
self.smtp_username = inputs["smtp_username"]
2119
self.smtp_password = inputs["smtp_password"]
2220
self.smtp_port = int(inputs.get("smtp_port", 25))
23-
self.reply_message_id = inputs.get("reply_message_id")
2421
self.is_ssl = bool(inputs.get("is_smtp_ssl", False))
2522

23+
self.sender_email = inputs["sender_email"]
24+
self.recipient_email = inputs["recipient_email"]
25+
email_template_value = inputs.get("email_template_value", dict())
26+
self.subject = mustache_render(inputs.get("subject", "Patchwork Execution Email"), email_template_value)
27+
self.body = mustache_render(inputs.get("body", "Patchwork Execution Email"), email_template_value)
28+
self.reply_message_id = inputs.get("reply_message_id")
29+
self.__handle_eml_file(inputs.get("reply_eml_file_path"))
30+
31+
def __handle_eml_file(self, eml_file: str):
32+
if eml_file is None:
33+
return
34+
35+
original_email_data = ReadEmail(dict(eml_file_path=eml_file)).run()
36+
timestamp: datetime = original_email_data.get("datetime")
37+
date_str = timestamp.date().strftime('%-d %b %Y')
38+
time_str = timestamp.time().strftime('%H:%M')
39+
from_ = original_email_data.get("from")
40+
self.subject = original_email_data.get("subject")
41+
self.body += f"\n\nOn {date_str} at {time_str}, {from_} wrote:\n\n" + textwrap.indent(original_email_data.get("body"), "> ")
42+
self.reply_message_id = original_email_data.get("message_id")
43+
2644
def run(self) -> dict:
27-
msg = EmailMessage()
28-
msg.set_content(mustache_render(self.body, self.email_template_value))
29-
msg["Subject"] = mustache_render(self.subject, self.email_template_value)
30-
msg["From"] = self.sender_email
31-
msg["To"] = self.recipient_email
32-
if self.reply_message_id is not None:
33-
msg.add_header("References", self.reply_message_id)
34-
msg.add_header("In-Reply-To", self.reply_message_id)
45+
msg = self.__create_email_message()
3546

3647
smtp_clazz = smtplib.SMTP
3748
if self.is_ssl:
@@ -41,3 +52,14 @@ def run(self) -> dict:
4152
mailserver.login(self.smtp_username, self.smtp_password)
4253
mailserver.send_message(msg)
4354
return dict()
55+
56+
def __create_email_message(self):
57+
msg = EmailMessage()
58+
msg.set_content(self.body)
59+
msg["Subject"] = self.subject
60+
msg["From"] = self.sender_email
61+
msg["To"] = self.recipient_email
62+
if self.reply_message_id is not None:
63+
msg.add_header("References", self.reply_message_id)
64+
msg.add_header("In-Reply-To", self.reply_message_id)
65+
return msg

patchwork/steps/SendEmail/typed.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from typing_extensions import Any, TypedDict
1+
from typing_extensions import Any, TypedDict, Annotated
2+
3+
from patchwork.common.utils.step_typing import StepTypeConfig
24

35

46
class __SendEmailRequiredInputs(TypedDict):
@@ -16,6 +18,7 @@ class SendEmailInputs(__SendEmailRequiredInputs, total=False):
1618
smtp_port: int
1719
reply_message_id: str
1820
is_smtp_ssl: str
21+
reply_eml_file_path: Annotated[str, StepTypeConfig(is_path=True)]
1922

2023

2124
class SendEmailOutputs(TypedDict):

0 commit comments

Comments
 (0)