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>
This commit is contained in:
108
README.md
Normal file
108
README.md
Normal file
@ -0,0 +1,108 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user