Files
adminandClaude Opus 5.5 7a7450c829 Mailversand ueber Ausgangstabelle (ADR-0041)
mail.py reiht Mails in mail_ausgang ein (Migration 0009), eine
Versandschleife im Dienst liefert sie per SMTP mit Anmeldung ein und
wiederholt bei Fehlern. Voreinstellung ist Trockenlauf; das Passwort
kommt als systemd-Credential. Dazu scripts/testmail.py und Tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:43:25 +02:00

56 lines
1.8 KiB
Python

"""
Testmail über die Ausgangstabelle verschicken - prüft Konfiguration,
Zugangsdaten und Zustellbarkeit (SPF/DKIM/DMARC in den Kopfzeilen der
empfangenen Mail ansehen). Beispiel:
KUNDENPLATTFORM_DATABASE_URL=... KUNDENPLATTFORM_MAIL_MODUS=smtp ... \\
.venv/bin/python scripts/testmail.py --an jemand@example.org
Ohne KUNDENPLATTFORM_MAIL_MODUS=smtp läuft das als Trockenlauf.
"""
import argparse
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import mail # noqa: E402
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--an", required=True, help="Empfängeradresse")
args = parser.parse_args()
if not os.environ.get("KUNDENPLATTFORM_DATABASE_URL"):
sys.exit("KUNDENPLATTFORM_DATABASE_URL ist nicht gesetzt.")
try:
mail_id = mail.einreihen(
args.an,
"[Tuxflotte] Testmail",
"Dies ist eine Testmail der Tuxflotte-Kundenplattform.\n"
"Wenn sie ankommt, funktioniert der Mailversand.\n",
zweck="testmail",
)
except ValueError as fehler:
sys.exit(str(fehler))
# Läuft der Dienst, kann seine Versandschleife die Mail zuerst greifen -
# der Status unten stimmt in beiden Fällen.
mail.ausgang_abarbeiten()
status = mail.mail_status(mail_id)
print(f"Status: {status['status']} (Versuche: {status['versuche']})")
if status["letzter_fehler"]:
print(f"Fehler: {status['letzter_fehler']}")
if status["status"] == "wartet":
print("Die Mail bleibt in der Ausgangstabelle und wird von der Versandschleife erneut versucht.")
sys.exit(0 if status["status"] in ("gesendet", "trockenlauf") else 1)
if __name__ == "__main__":
main()