import os import re import smtplib from email.mime.text import MIMEText from xml.etree.ElementTree import Element, SubElement, tostring from fastapi import FastAPI, Form, HTTPException, Request, status from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates app = FastAPI() templates = Jinja2Templates(directory="app/templates") # Serve static files (CSS, images) app.mount("/static", StaticFiles(directory="app/static"), name="static") # add somewhere near the top-level constants EMAIL_REGEX = re.compile(r"^[^@\s]+@[^@\s]+\.[^@\s]+$") # SMTP / email configuration via environment SMTP_HOST = os.getenv("SMTP_HOST", "smtp") SMTP_PORT = int(os.getenv("SMTP_PORT", "25")) MAIL_FROM = os.getenv("MAIL_FROM", "noreply@example.com") MAIL_TO = os.getenv("MAIL_TO", "destination@example.com") @app.get("/", response_class=HTMLResponse) async def show_form(request: Request): return templates.TemplateResponse("form.html", {"request": request}) @app.post("/submit") async def handle_form( request: Request, name: str = Form(...), lastname: str = Form(...), title: str = Form(...), telno: str = Form(...), mail: str = Form(...), apparatsname: str = Form(...), subject: str = Form(...), semester_type: str = Form(...), # "summer" or "winter" semester_year: str = Form(...), authorname: list[str] = Form(...), year: list[str] = Form(...), booktitle: list[str] = Form(...), signature: list[str] = Form(...), ): # Build XML root = Element("form_submission") static_data = SubElement(root, "static") SubElement(static_data, "name").text = name SubElement(static_data, "lastname").text = lastname SubElement(static_data, "title").text = title SubElement(static_data, "telno").text = telno SubElement(static_data, "mail").text = mail SubElement(static_data, "apparatsname").text = apparatsname SubElement(static_data, "subject").text = subject SubElement(static_data, "semester").text = f"{semester_type} {semester_year}" # inside handle_form(), right after parameters are received, before building XML: # Basic email validation (server-side) if not EMAIL_REGEX.match(mail): raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid email address format.", ) books = SubElement(root, "books") for i in range(len(authorname)): book = SubElement(books, "book") SubElement(book, "authorname").text = authorname[i] SubElement(book, "year").text = year[i] SubElement(book, "title").text = booktitle[i] SubElement(book, "signature").text = signature[i] xml_data = tostring(root, encoding="unicode") # Send mail msg = MIMEText(xml_data, "xml") msg["Subject"] = "New Form Submission" msg["From"] = MAIL_FROM msg["To"] = MAIL_TO with smtplib.SMTP(SMTP_HOST, SMTP_PORT) as server: server.send_message(msg) return RedirectResponse("/", status_code=303)