124-webapp/mailer.py
2025-10-02 12:20:11 +02:00

93 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import asyncio
from io import BytesIO
from nio import AsyncClient, UploadResponse, RoomSendResponse
async def send_order(pdf_path: str, analysis: dict, room_id: str, name: str, comment: str = ""):
"""
Sends a print order summary + PDF to the specified Matrix room.
"""
matrix_user = os.environ.get("MATRIX_USER")
matrix_pass = os.environ.get("MATRIX_PASS")
homeserver = os.environ.get("MATRIX_HOMESERVER", "http://einszwovier.local:8008")
if not matrix_user or not matrix_pass:
raise RuntimeError("Missing MATRIX_USER or MATRIX_PASS in environment")
client = AsyncClient(homeserver, matrix_user)
try:
login_resp = await client.login(matrix_pass)
if getattr(login_resp, "access_token", None) is None:
raise RuntimeError(f"Failed to login to Matrix: {login_resp}")
# Build German summary text
summary_lines = [
f"📄 Datei: {analysis['filename']}",
f"👤 Name: {name}",
"",
f"💰 Gesamtkosten: {analysis['grand_total']:.2f}",
f" - S/W: {analysis['total_area_black']:.2f} m² = {analysis['total_cost_black']:.2f}",
f" - Farbe: {analysis['total_area_color']:.2f} m² = {analysis['total_cost_color']:.2f}",
"",
"📝 Seitenübersicht:"
]
for page in analysis["pages"]:
seitenart = "Farbe" if page["is_color"] else "S/W"
summary_lines.append(
f"Seite {page['page']}: {page['width_m']*1000:.0f}×{page['height_m']*1000:.0f} mm, "
f"{seitenart}, Kosten {page['cost']:.2f}"
)
if comment.strip():
summary_lines.append("\n💬 Nutzerkommentar:\n" + comment.strip())
summary_text = "\n".join(summary_lines)
# Send summary message
text_resp = await client.room_send(
room_id=room_id,
message_type="m.room.message",
content={"msgtype": "m.text", "body": summary_text},
)
if not (isinstance(text_resp, RoomSendResponse) and text_resp.event_id):
raise RuntimeError(f"Failed to send order summary: {text_resp}")
# Upload PDF
with open(pdf_path, "rb") as f:
pdf_bytes = f.read()
upload_resp, upload_err = await client.upload(
data_provider=BytesIO(pdf_bytes),
content_type="application/pdf",
filename=os.path.basename(pdf_path),
filesize=len(pdf_bytes),
)
if upload_err or not (isinstance(upload_resp, UploadResponse) and upload_resp.content_uri):
raise RuntimeError(f"Failed to upload PDF: {upload_err or upload_resp}")
# Send PDF as file message
file_resp = await client.room_send(
room_id=room_id,
message_type="m.room.message",
content={
"msgtype": "m.file",
"body": os.path.basename(pdf_path),
"url": upload_resp.content_uri,
},
)
if not (isinstance(file_resp, RoomSendResponse) and file_resp.event_id):
raise RuntimeError(f"Failed to send PDF message: {file_resp}")
print(f"✅ Text summary and PDF sent to room {room_id}")
finally:
await client.logout()
await client.close()
def send_order_sync(pdf_path: str, analysis: dict, room_id: str, name: str, comment: str = ""):
asyncio.run(send_order(pdf_path, analysis, room_id, name, comment))