From adf4af61e9370f223ccb9b52bcf3aa68dd451a3d Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Mon, 12 Feb 2024 15:56:41 +0100
Subject: [PATCH] add skeleton email service

---
 gso/services/mailer.py | 26 ++++++++++++++++++++++++++
 gso/settings.py        | 12 ++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 gso/services/mailer.py

diff --git a/gso/services/mailer.py b/gso/services/mailer.py
new file mode 100644
index 00000000..be7fd2b1
--- /dev/null
+++ b/gso/services/mailer.py
@@ -0,0 +1,26 @@
+"""The mailer service sends notification emails, as part of workflows that require interaction with external parties."""
+
+import smtplib
+from email.message import EmailMessage
+
+from gso.settings import load_oss_params
+
+
+def send_mail(recipient, subject, body) -> None:
+    """Send an email message to the given address.
+
+    :param recipient: The destination address.
+    :param subject: The email subject.
+    :param body: The contents of the email message.
+    """
+    email_params = load_oss_params().EMAIL
+    msg = EmailMessage()
+    msg["From"] = email_params.from_address
+    msg["To"] = recipient
+    msg["Subject"] = subject
+    msg.set_content(body)
+
+    with smtplib.SMTP(email_params.smtp_host, email_params.smtp_port) as s:
+        if email_params.smtp_username or email_params.smtp_password:
+            s.login(email_params.smtp_username, email_params.smtp_password)
+        s.send_message(msg)
diff --git a/gso/settings.py b/gso/settings.py
index ca0da591..6c7fc8ef 100644
--- a/gso/settings.py
+++ b/gso/settings.py
@@ -152,6 +152,17 @@ class NetBoxParams(BaseSettings):
     api: str
 
 
+class EmailParams(BaseSettings):
+    """Parameters for the email service."""
+
+    # TODO: Use more strict types after we've migrated to Pydantic 2.x
+    from_address: str
+    smtp_host: str
+    smtp_port: int
+    smtp_username: str | None = ""
+    smtp_password: str | None = ""
+
+
 class OSSParams(BaseSettings):
     """The set of parameters required for running :term:`GSO`."""
 
@@ -162,6 +173,7 @@ class OSSParams(BaseSettings):
     PROVISIONING_PROXY: ProvisioningProxyParams
     CELERY: CeleryParams
     THIRD_PARTY_API_KEYS: dict[str, str]
+    EMAIL: EmailParams
 
 
 def load_oss_params() -> OSSParams:
-- 
GitLab