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