Skip to content

Commit 29771da

Browse files
authored
Add ability to send email as a step (#1287)
* Add ability to send email as a step * lint * fix some issues
1 parent 87706a1 commit 29771da

File tree

6 files changed

+59
-2
lines changed

6 files changed

+59
-2
lines changed

patchwork/steps/CallSQL/CallSQL.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __build_engine(self, inputs: dict):
3333
**{k: v for k, v in kwargs.items() if v is not None},
3434
)
3535

36-
connect_args = None
36+
connect_args = dict()
3737
if inputs.get("db_driver_args") is not None:
3838
connect_args = parse_to_dict(inputs.get("db_driver_args"))
3939

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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+
def run(self) -> dict:
24+
msg = MIMEText(mustache_render(self.body, self.email_template_value))
25+
msg["Subject"] = mustache_render(self.subject, self.email_template_value)
26+
msg["From"] = self.sender_email
27+
msg["To"] = self.recipient_email
28+
29+
# TODO: support smtp without ssl
30+
with smtplib.SMTP_SSL(self.smtp_host, self.smtp_port) as smtp_server:
31+
smtp_server.login(self.sender_email, self.password)
32+
smtp_server.sendmail(self.sender_email, self.recipient_email, msg.as_string())
33+
34+
return dict()

patchwork/steps/SendEmail/__init__.py

Whitespace-only changes.

patchwork/steps/SendEmail/typed.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing_extensions import Annotated, Any, Dict, TypedDict
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+
20+
class SendEmailOutputs(TypedDict):
21+
pass

patchwork/steps/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
from patchwork.steps.ScanDepscan.ScanDepscan import ScanDepscan
4848
from patchwork.steps.ScanSemgrep.ScanSemgrep import ScanSemgrep
4949
from patchwork.steps.ScanSonar.ScanSonar import ScanSonar
50+
from patchwork.steps.SendEmail.SendEmail import SendEmail
5051
from patchwork.steps.SimplifiedLLM.SimplifiedLLM import SimplifiedLLM
5152
from patchwork.steps.SimplifiedLLMOnce.SimplifiedLLMOnce import SimplifiedLLMOnce
5253
from patchwork.steps.SlackMessage.SlackMessage import SlackMessage
@@ -99,6 +100,7 @@
99100
"ScanDepscan",
100101
"ScanSemgrep",
101102
"ScanSonar",
103+
"SendEmail",
102104
"SimplifiedLLM",
103105
"SimplifiedLLMOnce",
104106
"SimplifiedLLMOncePB",

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)