Skip to content

Commit 180078b

Browse files
committed
Add ability to send email as a step
1 parent 87706a1 commit 180078b

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from __future__ import annotations
2+
3+
import smtplib
4+
from email.mime.text import MIMEText
5+
6+
from patchwork.common.utils.utils import mustache_render
7+
from patchwork.step import Step
8+
from patchwork.steps.SendEmail.typed import SendEmailInputs, SendEmailOutputs
9+
10+
11+
class SendEmail(Step, input_class=SendEmailInputs, output_class=SendEmailOutputs):
12+
def __init__(self, inputs):
13+
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"]
19+
self.password = inputs["sender_email_password"]
20+
self.smtp_host = inputs.get("smtp_host", "smtp.gmail.com")
21+
self.smtp_port = int(inputs.get("smtp_port", 465))
22+
23+
24+
def run(self) -> dict:
25+
msg = MIMEText(mustache_render(self.body, self.email_template_value))
26+
msg['Subject'] = mustache_render(self.subject, self.email_template_value)
27+
msg['From'] = self.sender_email
28+
msg['To'] = self.recipient_email
29+
30+
# TODO: support smtp without ssl
31+
with smtplib.SMTP_SSL(self.smtp_host, self.smtp_port) as smtp_server:
32+
smtp_server.login(self.sender_email, self.password)
33+
smtp_server.sendmail(self.sender_email, self.recipient_email, msg.as_string())
34+
35+
return dict()

patchwork/steps/SendEmail/__init__.py

Whitespace-only changes.

patchwork/steps/SendEmail/typed.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from typing_extensions import Annotated, Dict, TypedDict, Any
2+
3+
from patchwork.common.utils.step_typing import StepTypeConfig
4+
5+
6+
class __SendEmailRequiredInputs(TypedDict):
7+
sender_email: str
8+
recipient_email: str
9+
sender_email_password: str
10+
11+
12+
class SendEmailInputs(__SendEmailRequiredInputs, total=False):
13+
email_template_value: dict[str, Any]
14+
subject: str
15+
body: str
16+
smtp_host: str
17+
smtp_port: int
18+
19+
class SendEmailOutputs(TypedDict):
20+
is_slack_message_sent: bool

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "patchwork-cli"
3-
version = "0.0.97"
3+
version = "0.0.98"
44
description = ""
55
authors = ["patched.codes"]
66
license = "AGPL"

0 commit comments

Comments
 (0)