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.

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

Voraussetzung

eigener Mail Server

Linux Server

2 Mail-Adressen bevorzugt

Passwort ist bekannt

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ß!