from fastapi import FastAPI, HTTPException from pydantic import BaseModel, EmailStr, validator from fastapi.middleware.cors import CORSMiddleware import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import os from typing import Optional app = FastAPI() # CORS 설정 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) class ContactForm(BaseModel): name: str email: EmailStr company: str message: str @validator('name') def name_not_empty(cls, v): if not v or len(v.strip()) == 0: raise ValueError('Full Name is required') return v.strip() @validator('company') def company_not_empty(cls, v): if not v or len(v.strip()) == 0: raise ValueError('Company Name is required') return v.strip() @validator('message') def message_valid(cls, v): if not v or len(v.strip()) == 0: raise ValueError('Project description is required') if len(v) > 5000: raise ValueError('Message is too long (max 5000 characters)') return v.strip() @app.post("/api/contact") async def send_contact_email(form: ContactForm): """Contact form email handler""" try: # SMTP 설정 smtp_server = "mailcowdockerized_postfix-mailcow_1" # Docker 네트워크 내 호스트명 smtp_port = 25 # 일반 포트 (요청할 때) # 메시지 구성 msg = MIMEMultipart('alternative') msg['Subject'] = f"[Contact Form] {form.name} - {form.company}" msg['From'] = form.email msg['To'] = "windpacer@hanmocnn.co.kr" # 텍스트 본문 text_body = f""" New contact form submission: Name: {form.name} Email: {form.email} Company: {form.company} Message: {form.message} --- Submitted from Contact Form """ # HTML 본문 html_body = f"""

New contact form submission:

Name: {form.name}

Email: {form.email}

Company: {form.company}

Message:

{form.message}

Submitted from Hanmo Contact Form

""" part1 = MIMEText(text_body, 'plain') part2 = MIMEText(html_body, 'html') msg.attach(part1) msg.attach(part2) # SMTP 연결 및 메일 전송 with smtplib.SMTP(smtp_server, smtp_port, timeout=10) as server: server.sendmail( form.email, "windpacer@hanmocnn.co.kr", msg.as_string() ) return { "success": True, "message": "Your message has been sent successfully. We will get back to you soon." } except Exception as e: import traceback print(f"Error sending email: {str(e)}") print(traceback.format_exc()) raise HTTPException( status_code=500, detail="Failed to send email. Please try again later." ) @app.get("/health") async def health_check(): """Health check endpoint""" return {"status": "ok"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8001)