Implement Contact Form with Python FastAPI backend and mailcow SMTP integration
This commit is contained in:
125
mail_contact.py
Normal file
125
mail_contact.py
Normal file
@@ -0,0 +1,125 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user