Version: 1.0.0
Lizenz: MIT
Node.js-Anwendung, die ungelesene E-Mails per IMAP abruft, mit OpenAI zusammenfasst und das Ergebnis per SMTP versendet. Der Container startet die Zusammenfassung täglich um 08:00 Uhr (Zeitzone Europe/Berlin) über PM2-Cron.
- Features
- Umgebungsvariablen
- Deployment mit GHCR-Image
- Lokale Entwicklung
- CI/CD
- Abhängigkeiten
- Lizenz
- Ungelesene E-Mails per IMAP abrufen und zusammenfassen (OpenAI)
- Zusammenfassung per SMTP versenden
- Täglicher automatischer Lauf um 08:00 Uhr via PM2-Cron
- Multi-Arch-Docker-Image für amd64 (Mittwald) und arm64 (Raspberry Pi 4)
Kopiere .env.example nach .env und trage die Werte ein. Keine Secrets ins Repository committen.
| Variable | Beschreibung |
|---|---|
EMAIL_USER |
IMAP-Benutzername |
EMAIL_PASSWORD |
IMAP-Passwort |
EMAIL_HOST |
IMAP-Server |
EMAIL_PORT |
IMAP-Port (Standard: 993) |
EMAIL_TLS |
TLS aktivieren (true/false) |
OPENAI_API_KEY |
OpenAI API-Schlüssel |
SMTP_HOST |
SMTP-Server |
SMTP_PORT |
SMTP-Port (Standard: 587) |
SMTP_SECURE |
SMTP TLS (true/false) |
SMTP_USER |
SMTP-Benutzername |
SMTP_PASS |
SMTP-Passwort |
SMTP_FROM |
Absender-Adresse |
MAILTO |
Empfänger der Zusammenfassung |
SUMMARY_PROMPT_PATH |
Optional. Pfad zur Summarization-Prompt-Datei. Default: ./prompts/summary-prompt.txt (lokal) bzw. /app/prompts/summary-prompt.txt (Container). Fehlende oder leere Datei → Fehler beim Lauf. |
Der Summarization-Prompt liegt in prompts/summary-prompt.txt und kann ohne Image-Rebuild angepasst werden (per Volume-Mount im Container; Container-Neustart reicht).
Das produktionsfertige Image wird bei jedem Push auf main automatisch nach GitHub Container Registry (GHCR) gebaut und veröffentlicht:
ghcr.io/bernardteske/gpt-adminmail:latest
- Docker und Docker Compose auf dem Zielsystem
- Zugriff auf das GHCR-Image (öffentliches Package oder GitHub-Login für private Packages)
.env-Datei mit allen Variablen aus.env.exampleprompts/summary-prompt.txtauf dem Host (beim Klonen des Repos enthalten; sonst aus dem Repository kopieren). Fehlt die Datei, legt Docker beim Mount ggf. ein leeres Verzeichnis an — der Container startet dann nicht korrekt.
-
Repository klonen oder nur
docker-compose.ymlund.env.exampleauf den Server kopieren -
.envanlegen:cp .env.example .env # Werte in .env eintragen -
Container starten:
docker compose pull docker compose up -d
-
Logs prüfen:
docker compose logs -f gpt-adminmail
Der Container läuft dauerhaft; PM2 startet index.js täglich um 08:00 Uhr (Europe/Berlin).
Vorgehen identisch zum Mittwald-Server. Docker zieht automatisch das passende arm64-Image.
cp .env.example .env
# .env ausfüllen
docker compose pull
docker compose up -ddocker compose pull
docker compose up -dDer OpenAI-Prompt für die E-Mail-Zusammenfassung liegt in prompts/summary-prompt.txt. docker-compose.yml mountet diese Datei read-only nach /app/prompts/summary-prompt.txt im Container — der Inhalt aus dem Image wird dabei überschrieben.
Standard-Workflow (kein Image-Rebuild nötig):
-
Prompt auf dem Host bearbeiten:
nano prompts/summary-prompt.txt
-
Container neu starten, damit die App die geänderte Datei beim nächsten Lauf einliest:
docker compose restart gpt-adminmail
Ohne Volume-Mount (z. B. bei docker run ohne -v) nutzt die App den im Image gebündelten Default unter /app/prompts/summary-prompt.txt.
Eigener Prompt-Pfad auf dem Host
Wenn die Prompt-Datei an einem anderen Ort liegt, passe den Volume-Mount in docker-compose.yml an:
volumes:
- /pfad/auf/dem/host/mein-prompt.txt:/app/prompts/summary-prompt.txt:roAlternativ kann ein anderer Container-Pfad über SUMMARY_PROMPT_PATH gesetzt werden (in .env oder unter environment in docker-compose.yml):
environment:
SUMMARY_PROMPT_PATH: /app/prompts/custom-prompt.txt
volumes:
- /pfad/auf/dem/host/mein-prompt.txt:/app/prompts/custom-prompt.txt:rogit clone https://github.com/BernardTeske/GPT-AdminMail.git
cd GPT-AdminMail
cp .env.example .env
# .env ausfüllen
yarn install
node index.jsZum lokalen Image-Build (ohne GHCR):
docker build -t gpt-adminmail:local .
docker run --env-file .env gpt-adminmail:localDer Workflow .github/workflows/docker-publish.yml baut bei Push auf main ein Multi-Arch-Image (linux/amd64, linux/arm64) und pusht es nach ghcr.io/bernardteske/gpt-adminmail:latest. Authentifizierung erfolgt über GITHUB_TOKEN (packages: write).
- dotenv — Umgebungsvariablen laden
- imap-simple — IMAP-Zugriff
- mailparser — E-Mail-Parsing
- nodemailer — SMTP-Versand
- openai — OpenAI API
Details siehe package.json.
MIT — siehe LICENSE.