Motivation
Vor einiger Zeit habe ich gelernt wie ich das Passwort eines pdfs entfernen kann, mithilfe von Stirling pdf. Diesen Job habe ich in Node-Red implementiert.
Neuerdings wandern alle meine automatischen Jobs in eine zetralisierte Python Management Plattform, die ich hier in einem späteren Blog Post besprechen werde. Jetzt war dieser Job dran; und dafür waren einige Anpassungen notwendig. Daher möchte ich diesen Workflow noch einmal besprechen.
Meine Lösung
Zuallererst wurde das Suchen der Nachrichten flexibler: Nodered konnte nur Nachrichten ziehen und direkt löschen (oder unangetastet lassen). Fehler Handling war dann schwierig möglich; das hat sich mit Python beeindruckend erleichtert! Mithilfe der imap_tools
Bibliothek schaut das Suchen der Nachrichten jetzt so aus:
|
|
Das ist nicht allzu kompliziert, und es passiert auch nicht allzu viel. Die Magie passiert dann in der process_message
Methode.
Process message
Hier habe ich einige wichtige Schritte.
Das richtige Attachment finden
Attachments durchsuchen macht imap_tools
recht einfach: Alle Attachments sind über msg.attachments
auffindbar, und dann gibt es Attribute wie attachment.filename
, attachment.content_type
(für meinen Use Case suche ich die mit Content Type application/pdf
) und ein paar weitere. Schlussendlich gibt es noch attachment.payload
, das ist der Inhalt der Datei als Byte String.
Das Passwort per Stirling pdf entfernen
Die grundsätzliche Lösung hierzu hatte ich ja bereits im ursprünglichen Post via Node-Red diskutiert. Für Python waren aber noch Änderungen notwendig, die ich gerne diskutieren würde, weil sie mich überrascht haben.
Der abschließende Request schaut folgendermaßen aus:
|
|
Zwei Änderungen zur Node-Red Version:
- Der Dateiname ist jetzt korrekt gesetzt. Nicht dass das einen wesentlichen Unterschied macht…
- In Node-Red musste ich den Header
Content-Type: multipart/form-data
setzen. Wenn ich den in Python setze, geht der Request nicht! Ich habe noch nicht herausgefunden, woran das liegt, und freue mich per Kommentar über Inputs dazu.
Den Content des unverschlüsselten pdfs bekommt man dann leicht aus dem Request: unencrypted_pdf_bytes = requests.post(...).content
.
Eine Mail senden
Hier passiert noch einmal eine beeindruckend simple Logik in Python:
|
|
Das wars!
Resultat
Ich bin beeindruckt, warum ich mir Node-Red so lange angetan habe, und warum ich so viel Zeit darin investiert habe. Python macht Dinge doch um einiges einfacher.