Files
Holzleitner-Mail-Client/README.md
Dennis Nemec 3774a378f3 Initial: Holzleitner Mail-Client (Rust, Windows-Service)
Polling-Client, der beim Backend die noch nicht versendeten ausgelieferten
Belege abfragt (GET /admin/delivered-belegnummern), ERPframe per CLI zum
Mailversand anstößt (_SV_MAIL_VERSAND) und die Belege anschließend als
versendet markiert (POST /admin/mark-mail-sent). Authentifizierung gegen
das Backend per X-Admin-Api-Key.

Enthält: Config-Laden (config.json, Vorlage config.example.json), Logging,
Windows-Service-Wrapper (install-/uninstall-service.ps1).

Nicht im Repo (.gitignore): config.json (Secrets: Admin-Key + ERPframe-
Passwort), target/, logs/. config.example.json trägt nur Platzhalter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 18:02:07 +02:00

109 lines
4.4 KiB
Markdown

# Holzleitner Mail-Versende-Client
Langlaufender Windows-Client. Pollt alle 5 Minuten die noch **nicht versendeten**
Belegnummern vom Backend und stößt **ERPFRAME.EXE** an, das die Mails verschickt.
## Ablauf je Tick (Default alle 300 s)
1. `GET {backend}/admin/delivered-belegnummern` — Header `X-Admin-Api-Key`.
Liefert nur Belege, deren Liefermail noch offen ist (`mail_sent_at IS NULL`).
2. Sind welche offen: **ein** Aufruf
`ERPFRAME.EXE <mode> <app_name> <user> <password> <command> <belege_csv>`
(alle Belegnummern kommagetrennt als ein Argument) und auf Ende warten.
3. **Nur bei ExitCode 0**: `POST {backend}/admin/mark-mail-sent` mit den
Belegnummern → markiert sie server-seitig als versendet (Dedup).
Reihenfolge **erst ERPframe, dann markieren**: schlägt ERPframe fehl, bleiben
die Belege offen und werden beim nächsten Tick erneut versucht. Alle Fehler
werden geloggt, die Schleife läuft weiter.
## Konfiguration
`config.json` **neben der EXE** (Vorlage: `config.example.json`). Enthält
Secrets → nicht ins Git (siehe `.gitignore`).
| Feld | Bedeutung |
|---|---|
| `backend_base_url` | z. B. `http://10.168.10.2:3000` (ohne `/admin`) |
| `admin_api_key` | Wert für Header `X-Admin-Api-Key` |
| `poll_interval_secs` | Poll-Intervall (Default 300) |
| `request_timeout_secs` | HTTP-Timeout je Request (Default 30) |
| `erp_timeout_secs` | Timeout für den ERPframe-Prozess; 0 = unbegrenzt (Default 600) |
| `belegnummer_separator` | Trennzeichen für das Belege-Argument (Default `,`) |
| `log_dir` | Log-Verzeichnis (relativ ⇒ relativ zur EXE; Default `logs`) |
| `erpframe.exe_path` | voller Pfad zu `ERPFRAME.EXE` |
| `erpframe.mode` | erstes Argument (Default `AUTOSTARTUP`) |
| `erpframe.app_name` / `user` / `password` / `command` | wie im PowerShell-Skript |
| `erpframe.working_dir` | Arbeitsverzeichnis (`null` ⇒ EXE-Verzeichnis) |
Logs: `<log_dir>/mailclient_YYYY-MM-DD.log` (+ stdout).
## Build
Das Programm nutzt **rustls** (kein OpenSSL) → keine C-Abhängigkeiten.
### Auf einem Windows-Rechner (empfohlen, MSVC)
```
cargo build --release
```
`target\release\holzleitner-mailclient.exe`
### Cross-Compile vom Mac/Linux (GNU-Target)
```
rustup target add x86_64-pc-windows-gnu
brew install mingw-w64 # macOS; Linux: apt install gcc-mingw-w64
cargo build --release --target x86_64-pc-windows-gnu
```
`target/x86_64-pc-windows-gnu/release/holzleitner-mailclient.exe`
### In einer Windows-VM auf Apple Silicon (ARM64)
Die VM ist **ARM64** — ein einfaches `cargo build` erzeugt eine ARM64-EXE, die
auf dem **x64**-Server NICHT läuft. Immer explizit x64 bauen:
```
rustup target add x86_64-pc-windows-msvc
cargo build --release --target x86_64-pc-windows-msvc
```
**Nicht auf einem Shared-Drive (`Z:`) bauen** (Build bricht mit `os error 87` ab,
weil das Shared-FS die Temp-Datei-Operationen nicht unterstützt) — die Quelle
darf dort liegen, aber `target/` auf lokales NTFS legen:
```
$env:CARGO_TARGET_DIR = "C:\cargo-target\mailclient"
```
## Deployment als Windows-Dienst
Die EXE ist **dienstfähig** — sie spricht direkt mit dem Service Control Manager
(sauberes Start/Stop, Autostart, Auto-Restart bei Absturz).
1. EXE + `config.json` in ein Verzeichnis legen, z. B. `C:\Holzleitner\Mailclient\`.
`config.json` muss **neben der EXE** liegen (der Dienst startet mit
Arbeitsverzeichnis `C:\Windows\System32`).
2. PowerShell **als Administrator** öffnen und registrieren:
```powershell
cd C:\Holzleitner\Mailclient
.\install-service.ps1
# optional unter einem bestimmten Konto (z. B. für ERPframe-DB-/Netzzugriff):
.\install-service.ps1 -Credential (Get-Credential)
```
Registriert den Dienst **„Holzleitner App Mails"** (interner Name
`HolzleitnerAppMails`), verzögerter Autostart, Auto-Restart, und startet ihn.
3. Verwalten — in `services.msc` erscheint er als **„Holzleitner App Mails"**:
```powershell
Get-Service HolzleitnerAppMails
Stop-Service HolzleitnerAppMails
Start-Service HolzleitnerAppMails
```
4. Entfernen:
```powershell
.\uninstall-service.ps1
```
### Konsolenmodus (zum Testen)
Direkter Start (Doppelklick / Konsole) läuft automatisch im Konsolenmodus
(der SCM-Dispatcher schlägt fehl → Fallback). Erzwingen mit:
```powershell
.\holzleitner-mailclient.exe --console
```
Beenden mit Ctrl-C (sauberer Shutdown). Da die Binary selbst alle 5 Min pollt,
**keinen** zusätzlichen 5-Minuten-Task einrichten — ein Dauerprozess genügt.