from fastapi import FastAPI, HTTPException, BackgroundTasks from pydantic import BaseModel, EmailStr import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import os import time import datetime from jinja2 import Template from process.logger import logger from common.config import SMTP_PASSWORD, SMTP_PORT, SMTP_SERVER, SMTP_USERNAME # HTML 템플릿을 로드하고 렌더링 def render_template(template_path, context): with open(template_path, 'r') as file: template = Template(file.read()) return template.render(context) # 메일 발송 함수 def send_email(email_to: str, subject: str, html_content: str): try: msg = MIMEMultipart("alternative") msg['From'] = SMTP_USERNAME msg['To'] = email_to msg['Subject'] = subject msg.attach(MIMEText(html_content, 'html')) server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls() server.login(SMTP_USERNAME, SMTP_PASSWORD) # 이메일 발송 server.sendmail(SMTP_USERNAME, email_to, msg.as_string()) server.quit() return { "result": 'OK', "msg": "이메일 발송에 성공했습니다." } except Exception as e: logger.error(f"이메일 발송에 실패했습니다. error_msg: {e}") return { "result": 'FAIL', "msg": "이메일 발송에 실패했습니다." } # 이메일 발송 API 엔드포인트 def send_email_api(context): try: html_content = render_template(f"/app/process/email/{context['template_name']}", context) send_email_result = send_email(email_to=context['user_email'], subject=context['email_title'], html_content=html_content) return send_email_result except Exception as e: logger.error(f"이메일 발송에 실패했습니다. error_msg: {e}") return { "result": 'FAIL', "msg": "이메일 발송에 실패했습니다." } # 아이디 찾기 이메일 발송 함수 def email_find_id(user_email, info): context = { "email_title": "[ALLSCORE] 아이디가 발송되었습니다.", "info": info, "user_email": user_email, "template_name": "find_id_template.html", } try: return send_email_api(context) except Exception as e: logger.error(f"이메일 발송에 실패했습니다. error_msg: {e}") return { "result": 'FAIL', "msg": "이메일 발송에 실패했습니다." } # 비밀번호 찾기 이메일 발송 함수 def email_find_password(user_email, info): context = { "email_title": "[유어라운드] 임시 비밀번호가 발급되었습니다.", "info": info, "user_email": user_email, "template_name": "find_password_template.html", } try: return send_email_api(context) except Exception as e: logger.error(f"이메일 발송에 실패했습니다. error_msg: {e}") return { "result": 'FAIL', "msg": "이메일 발송에 실패했습니다." }