Coverage for src / mysingle / core / email / email_sending.py: 0%

30 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2025-12-02 00:58 +0900

1# path: app/utils/email_sending.py 

2 

3import logging 

4from dataclasses import dataclass 

5from pathlib import Path 

6from typing import Any 

7 

8import emails 

9from jinja2 import Template 

10 

11from ..config import settings 

12 

13logger = logging.getLogger() 

14 

15 

16@dataclass 

17class EmailData: 

18 html_content: str 

19 subject: str 

20 

21 

22def render_email_template(*, template_name: str, context: dict[str, Any]) -> str: 

23 """ 

24 Jinja2를 사용하여 이메일 템플릿을 렌더링하는 함수 

25 """ 

26 template_str = ( 

27 Path(__file__).parent / "email-templates" / "build" / template_name 

28 ).read_text() 

29 html_content = Template(template_str).render(context) 

30 return html_content 

31 

32 

33def send_email( 

34 *, 

35 email_to: str, 

36 subject: str = "", 

37 html_content: str = "", 

38) -> None: 

39 assert settings.emails_enabled(), "no provided configuration for email variables" 

40 message = emails.Message( 

41 subject=subject, 

42 html=html_content, 

43 mail_from=(settings.EMAILS_FROM_NAME, settings.EMAILS_FROM_EMAIL), 

44 ) 

45 smtp_options = {"host": settings.SMTP_HOST, "port": settings.SMTP_PORT} 

46 if settings.SMTP_TLS: 

47 smtp_options["tls"] = True 

48 elif settings.SMTP_SSL: 

49 smtp_options["ssl"] = True 

50 if settings.SMTP_USER: 

51 smtp_options["user"] = settings.SMTP_USER 

52 if settings.SMTP_PASSWORD: 

53 smtp_options["password"] = settings.SMTP_PASSWORD 

54 response = message.send(to=email_to, smtp=smtp_options) 

55 logger.info(f"send email result: {response}")