Skip to content

Commit 6ba6d23

Browse files
committed
refactor and black
1 parent 189158d commit 6ba6d23

File tree

4 files changed

+41
-15
lines changed

4 files changed

+41
-15
lines changed

app/config.py

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class SMTPConfig(BaseModel):
1010
port: int = os.getenv("EMAIL_PORT", 587)
1111
username: str = os.getenv("EMAIL_HOST_USER", "smtp_user")
1212
password: str = os.getenv("EMAIL_HOST_PASSWORD", "smtp_password")
13+
template_path: str = os.getenv("EMAIL_TEMPLATE_PATH", "templates")
1314

1415

1516
class Settings(BaseSettings):

app/services/scheduler.py

-1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,3 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
4545
await self.app(scope, receive, send)
4646
else:
4747
await self.app(scope, receive, send)
48-

app/services/smtp.py

+39-13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from attrs import define, field
12
import smtplib
23
from email.mime.multipart import MIMEMultipart
34
from email.mime.text import MIMEText
@@ -15,40 +16,65 @@
1516
logger = AppLogger().get_logger()
1617

1718

19+
@define
1820
class SMTPEmailService(metaclass=SingletonMetaNoArgs):
19-
def __init__(self):
20-
self.server = smtplib.SMTP(
21-
global_settings.smtp.server, global_settings.smtp.port
22-
)
21+
# SMTP configuration
22+
server_host: str = field(default=global_settings.smtp.server)
23+
server_port: int = field(default=global_settings.smtp.port)
24+
username: str = field(default=global_settings.smtp.username)
25+
password: str = field(default=global_settings.smtp.password)
26+
27+
# Dependencies
28+
templates: Jinja2Templates = field(
29+
factory=lambda: Jinja2Templates(global_settings.templates_dir)
30+
)
31+
server: smtplib.SMTP = field(init=False) # Deferred initialization in post-init
32+
33+
def __attrs_post_init__(self):
34+
"""Initialize the SMTP server connection after object creation."""
35+
self.server = smtplib.SMTP(self.server_host, self.server_port)
2336
self.server.starttls()
24-
self.server.login(global_settings.smtp.username, global_settings.smtp.password)
25-
self.templates = Jinja2Templates("templates")
37+
self.server.login(self.username, self.password)
2638

27-
def send_email(
39+
def _prepare_email(
2840
self,
2941
sender: EmailStr,
3042
recipients: list[EmailStr],
3143
subject: str,
32-
body_text: str = "",
33-
body_html=None,
34-
):
44+
body_text: str,
45+
body_html: str,
46+
) -> MIMEMultipart:
47+
"""Prepare the email message."""
3548
msg = MIMEMultipart()
3649
msg["From"] = sender
3750
msg["To"] = ",".join(recipients)
3851
msg["Subject"] = subject
3952
msg.attach(MIMEText(body_text, "plain"))
4053
if body_html:
4154
msg.attach(MIMEText(body_html, "html"))
55+
return msg
56+
57+
def send_email(
58+
self,
59+
sender: EmailStr,
60+
recipients: list[EmailStr],
61+
subject: str,
62+
body_text: str = "",
63+
body_html: str = None,
64+
):
65+
"""Send a regular email (plain text or HTML)."""
66+
msg = self._prepare_email(sender, recipients, subject, body_text, body_html)
4267
self.server.sendmail(sender, recipients, msg.as_string())
4368

4469
def send_template_email(
4570
self,
4671
recipients: list[EmailStr],
4772
subject: str,
48-
template: str = None,
49-
context: dict = None,
50-
sender: EmailStr = global_settings.smtp.from_email,
73+
template: str,
74+
context: dict,
75+
sender: EmailStr,
5176
):
77+
"""Send an email using a template with the provided context."""
5278
template_str = self.templates.get_template(template)
5379
body_html = template_str.render(context)
5480
self.send_email(sender, recipients, subject, body_html=body_html)

app/utils/singleton.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ def __call__(cls):
3333
if cls not in cls._instances:
3434
instance = super().__call__()
3535
cls._instances[cls] = instance
36-
return cls._instances[cls]
36+
return cls._instances[cls]

0 commit comments

Comments
 (0)