106 lines
3.1 KiB
Python
106 lines
3.1 KiB
Python
|
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": "이메일 발송에 실패했습니다."
|
||
|
}
|