02.02.26
This commit is contained in:
89
app.py
89
app.py
@@ -1,4 +1,8 @@
|
|||||||
from fastapi import FastAPI, UploadFile, HTTPException, Body
|
from fastapi import FastAPI, UploadFile, HTTPException, Body, Request
|
||||||
|
import smtplib
|
||||||
|
import base64
|
||||||
|
from email.message import EmailMessage
|
||||||
|
import os
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
import pytesseract
|
import pytesseract
|
||||||
from doctr.models import ocr_predictor
|
from doctr.models import ocr_predictor
|
||||||
@@ -27,6 +31,12 @@ file_handler.setFormatter(logging.Formatter(
|
|||||||
"%(asctime)s - %(levelname)s - %(name)s - %(message)s"
|
"%(asctime)s - %(levelname)s - %(name)s - %(message)s"
|
||||||
))
|
))
|
||||||
|
|
||||||
|
SMTP_SERVER = "smtp.gmail.com"
|
||||||
|
SMTP_PORT = 587
|
||||||
|
|
||||||
|
EMAIL_ACCOUNT = "faircotbot@gmail.com"
|
||||||
|
EMAIL_PASSWORD = "zmaqjfrvjpyvcrlg"
|
||||||
|
|
||||||
import pyodbc
|
import pyodbc
|
||||||
|
|
||||||
def get_db_connection():
|
def get_db_connection():
|
||||||
@@ -981,4 +991,79 @@ def parse_report(text):
|
|||||||
# if template not in PARSERS:
|
# if template not in PARSERS:
|
||||||
# return {"template":"UNKNOWN"}
|
# return {"template":"UNKNOWN"}
|
||||||
# return PARSERS[template].parse(text)
|
# return PARSERS[template].parse(text)
|
||||||
return template
|
return template
|
||||||
|
|
||||||
|
@app.post("/mail")
|
||||||
|
async def send_mail(request: Request):
|
||||||
|
try:
|
||||||
|
payload = await request.json()
|
||||||
|
except Exception:
|
||||||
|
raise HTTPException(status_code=400, detail="Invalid JSON")
|
||||||
|
|
||||||
|
# Champs obligatoires
|
||||||
|
to = payload.get("to")
|
||||||
|
subject = payload.get("subject")
|
||||||
|
body = payload.get("body")
|
||||||
|
|
||||||
|
if not to or not subject or not body:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400,
|
||||||
|
detail="Missing required fields: to, subject, body"
|
||||||
|
)
|
||||||
|
|
||||||
|
cc = payload.get("cc", [])
|
||||||
|
attachments = payload.get("attachments", [])
|
||||||
|
|
||||||
|
# Création du message
|
||||||
|
msg = EmailMessage()
|
||||||
|
msg["From"] = EMAIL_ACCOUNT
|
||||||
|
msg["To"] = ", ".join(to)
|
||||||
|
if cc:
|
||||||
|
msg["Cc"] = ", ".join(cc)
|
||||||
|
|
||||||
|
msg["Subject"] = subject
|
||||||
|
msg.set_content(body)
|
||||||
|
|
||||||
|
# Pièces jointes (base64)
|
||||||
|
for att in attachments:
|
||||||
|
filename = att.get("filename")
|
||||||
|
content = att.get("content")
|
||||||
|
content_type = att.get("content_type", "application/octet-stream")
|
||||||
|
|
||||||
|
if not filename or not content:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400,
|
||||||
|
detail="Attachment must contain filename and content"
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
file_bytes = base64.b64decode(content)
|
||||||
|
except Exception:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=400,
|
||||||
|
detail=f"Invalid base64 for attachment {filename}"
|
||||||
|
)
|
||||||
|
|
||||||
|
maintype, subtype = content_type.split("/", 1)
|
||||||
|
msg.add_attachment(
|
||||||
|
file_bytes,
|
||||||
|
maintype=maintype,
|
||||||
|
subtype=subtype,
|
||||||
|
filename=filename
|
||||||
|
)
|
||||||
|
|
||||||
|
# Envoi SMTP
|
||||||
|
try:
|
||||||
|
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
|
||||||
|
server.starttls()
|
||||||
|
server.login(EMAIL_ACCOUNT, EMAIL_PASSWORD)
|
||||||
|
server.send_message(msg)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "sent",
|
||||||
|
"to": to,
|
||||||
|
"attachments": len(attachments)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user