126 lines
3.4 KiB
Python
126 lines
3.4 KiB
Python
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"""
|
|
<html>
|
|
<body>
|
|
<h3>New contact form submission:</h3>
|
|
<p><strong>Name:</strong> {form.name}</p>
|
|
<p><strong>Email:</strong> {form.email}</p>
|
|
<p><strong>Company:</strong> {form.company}</p>
|
|
<p><strong>Message:</strong></p>
|
|
<pre>{form.message}</pre>
|
|
<hr>
|
|
<p><em>Submitted from Hanmo Contact Form</em></p>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
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)
|