backend/fastapi/app/process/email/email_user.py

106 lines
3.1 KiB
Python
Raw Permalink Normal View History

2024-12-06 05:12:28 +00:00
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": "이메일 발송에 실패했습니다."
}