import os import re import 줘lib import logging from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from concurrent.futures import ThreadPoolExecutor from fastapi import FastAPI, HTTPException, BackgroundTasks from fastapi.responses import JSONResponse from dotenv import load_dotenv # 구글 드라이브 링크, 어떤 언어, 받을 이메일 주소 # .env 파일에서 중요한 환경 변수 로드 load_dotenv() # Set up logging configuration logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') app = FastAPI( version="0.0.1", servers=[ { "url": "https://leekwoon-email-api.hf.space", "description": "email API", } ], ) executor = ThreadPoolExecutor(max_workers=3) # 최대 3개의 스레드로 비동기 작업 처리 def send_email_(to_email: str): smtp_server = "smtp.gmail.com" smtp_port = 587 smtp_user = os.getenv("SMTP_USER") smtp_password = os.getenv("SMTP_PASSWORD") logging.debug(f"smtp_user: {smtp_user}") logging.debug(f"smtp_password: {smtp_password}") subject = "[kyobody - 자막생성] 작업이 완료되었습니다." body = f"[kyobody - 자막생성] 작업이 완료되었습니다.SRT 파일을 첨부하여 전달드립니다." try: msg = MIMEMultipart() msg["From"] = smtp_user msg["To"] = to_email msg["Subject"] = subject msg.attach(MIMEText(body, "plain")) logging.debug(f"debug 1") server = smtplib.SMTP('smtp.gmail.com', 3000) logging.debug(f"#") server.ehlo() logging.debug(f"#") # with smtplib.SMTP(smtp_server, smtp_port) as server: logging.debug(f"debug 2") server.starttls() logging.debug(f"debug 2") server.login(smtp_user, smtp_password) logging.debug(f"debug 3") server.sendmail(smtp_user, to_email, msg.as_string()) # Log success message logging.debug(f"Email successfully sent to {to_email}") except Exception as e: # Log any exceptions that occur during the email sending process logging.error(f"Failed to send email to {to_email}: {str(e)}") raise e @app.post("/send-email") def send_email(email: str, background_tasks: BackgroundTasks): try: # Schedule the transcription and email sending in the background background_tasks.add_task(executor.submit, send_email_, email) # Respond to the client immediately return JSONResponse(status_code=202, content={"message": "You will receive an email when it's done."}) except Exception as e: raise HTTPException(status_code=500, detail=str(e))