Inhaltsverzeichnis

PDF entschlüsseln

und in Dokuwiki übertragen

Warum?

Wir erhalten unsere Gehaltsabrechnungen von einem externen Anbieter und der verschickt sie mit einem Passwort verschlüsselt.
Leider kann paperless damit nichts anfangen und die Date wird nicht automatisch eingelesen, wie ich es gerne hätte.

Jetzt wird die E-Mail einfach weitergeleitet an z.B. paperless-crypted@domain.tld

Das Skript hat mir ChatGPT zurecht gebaut und kann mit Sicherheit auch um mehrere Passwörter erweitert werden.

Voraussetzung

Ablauf

Das Skript holt die Mail mit dem Passwort geschützten PDF vom Mailserver ab (z.B. paperless-crypted@domain.tld). Extrahiert das PDF, entschlüsselt es und schickt es an die andere E-Mail-Adresse weiter (z.B. adresse_die_paperless_abruft@domain.tld).
Dort kann paperless die Mail wie gewohnt abholen und den Anhang verarbeiten.

Disclaimer

Wie immer, was ihr macht, passiert auf eigene Gefahr.
Ich empfehle, dass das ganze auf ein und demselben Server passiert, da eure Datei sonst unverschlüsselt über das Internet wandern könnte.

Setup

Installation der benötigten Tools

apt update
apt install getmail6 mpack qpdf file sendmail-base

E-Mail Abarbeitung einrichten

mkdir .getmail
nano .getmail/getmailrc

Inhalt einfügen

[retriever]
type = SimpleIMAPSSLRetriever
server = imap.domain.tld
username = paperless-crypted@domain.tld
password = password
mailboxes = ("INBOX",)

[destination]
type = Maildir
#Pfad anpassen
path = /path/to/.getmail/Maildir/

[options]
delete = true

Empfang testen

getmail --getmaildir /path/to/.getmail/

Versand testen

echo "Test" | mail -s "Sendmail-Test" adresse_die_paperless_abruft@domain.tld

Der Versand hängt stark von euren Mail-Server-Settings ab, dazu gibt es aber diverse Tutorials ;-)

Das Skript

#!/bin/bash

set -euo pipefail

# === Konfiguration ===
MAILDIR="/path/to/.getmail/Maildir"
GETMAILRC="/path/to/.getmail/"
WORKDIR="/path/to/paperless_process"
DECRYPTED="$WORKDIR/decrypted"
ATTACHMENTS="$WORKDIR/attachments"
PDF_PASSWORD="geheimes Passwort"

#Adresse die Paperless abruft
FORWARD_TO="adresse_die_paperless_abruft@domain.tld"

#Adresse, die das Passwort geschützte PDF bereitstellt
SENDER="paperless-crypted@domain.tld"

# === Vorbereitung ===
mkdir -p "$WORKDIR" "$DECRYPTED" "$ATTACHMENTS"

# === 1. E-Mails abrufen ===
getmail --getmaildir "$GETMAILRC"

# === 2. Neue Mails parsen ===
shopt -s nullglob
cd "$MAILDIR/new" || exit 1

for mailpath in *; do
  [ -f "$mailpath" ] || continue
  fullpath="$MAILDIR/new/$mailpath"

  # MIME dekodieren & Anhänge extrahieren
  munpack -q -f -C "$ATTACHMENTS" "$fullpath"

  # Füge .pdf-Endung hinzu, wenn MIME-Typ PDF ist aber keine Endung existiert
  for f in "$ATTACHMENTS"/*; do
    [ -f "$f" ] || continue
    mimetype=$(file --mime-type -b "$f")
    if [[ "$mimetype" == "application/pdf" && "$f" != *.pdf |]]; then
      mv "$f" "$f.pdf"
    fi
  done

  # Maildatei verschieben nach erfolgreicher Verarbeitung
  mv "$fullpath" "$MAILDIR/cur/$mailpath"
done
shopt -u nullglob

# === 3. PDFs entschlüsseln ===
cd "$ATTACHMENTS"
for file in *.pdf; do
  [ -f "$file" ] || continue
  OUTFILE="$DECRYPTED/$(basename "$file" .pdf)_unlocked.pdf"
  qpdf --password="$PDF_PASSWORD" --decrypt "$file" "$OUTFILE"
done

# === 4. Weiterleiten per sendmail ===
cd "$DECRYPTED"
for pdf in *_unlocked.pdf; do
    [ -f "$pdf" ] || continue

    # Original-Dateiname ohne "_unlocked" (und mit .pdf)

    base=$(basename "$pdf" .pdf)
    filename="${base%_unlocked}.pdf"
    filename="${filename//\"/}"  # Anführungszeichen entfernen
    filename="${filename// /_}"

  (
    echo "From: $SENDER"
    echo "To: $FORWARD_TO"
    echo "Subject: Entschlüsseltes Dokument"
    echo "MIME-Version: 1.0"
    echo 'Content-Type: multipart/mixed; boundary="sep"'
    echo
    echo "--sep"
    echo "Content-Type: text/plain; charset=utf-8"
    echo
    echo "Dokument im Anhang"
    echo "--sep"
    echo "Content-Type: application/pdf"
#    echo "Content-Disposition: attachment; filename=\"$filename\""
printf 'Content-Disposition: attachment; filename="%s"\n' "$filename"

    echo "Content-Transfer-Encoding: base64"
    echo
    base64 "$pdf"
    echo "--sep--"
  ) | /usr/sbin/sendmail -f "$SENDER" -t
done

# Aufräumen
rm -rf "$ATTACHMENTS"/* "$DECRYPTED"/*

Skript ausführbar machen und testen.

chmod +x name_eures_skriptes.sh
./name_eures_skriptes.sh

Eine ähnliche Ausgabe sollte erfolgen (vorher natürlich eine Mail mit dem PDF an die Adresse schicken)

getmail version 6.18.13
Copyright (C) 1998-2023 Charles Cazabon and others. Licensed under GNU GPL version 2.
SimpleIMAPSSLRetriever:paperless-crypted@domain.tld:993:
  msg 1/1 (103964 bytes) delivered, deleted
  1 messages (103964 bytes) retrieved, 0 skipped
tempdesc.txt: File exists
image001.png (image/png)
DATEINAME_DER_PDF.pdf (application/octet-stream)

Danach sollte die Mail im Posteingang von „adresse_die_paperless_abruft@domain.tld“ von paperless abrufbar sein.

Viel Spaß!