E-Mail Anhänge nach ecoDMS importieren – mit Python 3

Im August 2020 veröffentlichte ich den Beitrag “E-Mail PDF-Anhang speichern – Python-Script für ecoDMS Übergabe” welcher sich mit dem Thema E-Mail Anhänge nach ecoDMS importieren beschäftigte. Als Basis für diesen Beitrag setzte ich damals auf Python in der Version 2. Nachdem ich in diesem Beitrag nun einige Kommentare erhalten habe dass das Script nicht mit Python 3 lauffähig ist habe ich hier nun endlich das Update.

Warum dieses Script?

Wie bereits aus anderen Beiträgen hier bekannt bin ich ein Freund des papierlosen Büros. Aus diesem Grund setze ich bei mir auf das DMS-System ecoDMS. Dies funktioniert auch wunderbar mit einer Ausnahme. EcoDMS bietet keinen Import von Mails an was für mich eine mittlere Katastrophe darstellt. Die meisten Rechnungen kommen inzwischen digital per PDF in meinen Posteingang. Diese möchte ich gerne an eine definierte E-Mail Adresse weiterleiten so dass der Import ins DMS automatisch erfolgen kann.

Wie funktioniert das Python 3 Script zum Downloaden von PDF-Anhängen?

Das Script selbst ist recht einfach. Es verbindet sich über die Python IMAP Library zu dem definierten Postfach. Dort wird in allen Mails geprüft, ob PDF-Anhänge vorliegen. Falls das der Fall ist wird der Anhang in das Zielverzeichnis von ecoDMS heruntergeladen. Anschliessend wird die Mail gelöscht.

In meinem Fall wird das Script mehrmals täglich über einen Cronjob ausgeführt. Die definierte Postfach-Adresse ist nur mir bekannt so kann ich Mails, welche einen Anhang beinhalten der ins DMS muss einfach dort hin weiterleiten.

E-Mail Anhänge nach ecoDMS importieren – das Script

Bevor das Script funktioniert muss noch die benötige Python-Library installiert werden. Dies erfolgt über den folgenden Befehl:

pip3 install imbox # alternativ auch pip install imbox

Anschliessen müssen noch die Parameter für den Hostname, Username und Passwort für das definierte Postfach hinterlegt werden. Schon kann das Script ausgeführt werden und tut was es soll (hoffentlich zumidnest).

#!/usr/bin/env python
"""
importDmsMailsPy3.py

Check emails at :const:`PROVIDER` for attachments and save them to
:const:`SAVEDIR`.
"""
import os
from imbox import Imbox #pip3 install imbox
import traceback

PROVIDER = 'XXXX'
USER = 'XXXX'
PASSWORD = 'XXXX'

SAVE_DIR = '/opt/ecodms/workdir/scaninput/'

def getNotExistingFileName(saveDir, srcFileName):
    counter = 1
    if (srcFileName.endswith("pdf?=")):
        srcFileName = "scanbymail.pdf"
    while (True):
        currentName = srcFileName
        if (counter > 1):
            currentName = str(counter) + "_" + srcFileName
        if (os.path.isfile(saveDir + currentName)):
            counter = counter + 1
        else:
            return currentName

def save_attachment(attachment):
    attachmentFileName = attachment.get('filename')
    print('Handle Attachment {0!r}.'.format(attachmentFileName))
    if attachmentFileName.endswith(("pdf", "PDF", "Pdf", "PDf", "pDF", "pdF", "PdF", "pdf?=")):
        targetName = attachmentFileName.replace("/", "_")
        targetName = getNotExistingFileName(SAVE_DIR, targetName)
        download_path = f"{SAVE_DIR}/{targetName}"
        with open(download_path, "wb") as download:
            download.write(attachment.get('content').read())
            print('Found and saved attachment {0!r}.'.format(targetName))

def main():
    try:
        mailBox = Imbox (PROVIDER, username=USER, password=PASSWORD, ssl=True, ssl_context=None, starttls=False)
        mailBoxContent = mailBox.messages()

        for (mailId, mail) in mailBoxContent:
            mailBox.mark_seen(mailId)

            for idx, attachment in enumerate(mail.attachments):
                try:
                    save_attachment(attachment)
                except:
                    print(traceback.print_exc())

            mailBox.delete(mailId)
    finally:
        mailBox.logout()

if __name__ == '__main__':
    main()

Anbei das Script noch als Download:

Vorsicht

Das Script löscht bei jedem Lauf ALLE Mails in dem Postfach. Bei der Verwendung bitte auf jeden Fall darauf achten, dass für den Import ein eigenes Postfach definiert ist in welchem nur die Mails vorliegen, welche ins DMS übergeben werden sollen.

Wer möchte kann das Script natürlich gerne verwenden und auf seine Bedürfnisse anpassen. Natürlich übernehme ich keine Garantie für die Funktion des Scriptes, die Verwendung erfolgt auf eigene Gefahr 🙂

Artikel teilen

This article was written by Thomas Schiffler

Alles was mit IT zu tun hat steht bei mir hoch im Kurs. Hierbei dreht sich vieles um Java, Python oder auch mal PHP. Unser Zuhause ist mit diversen Raspberry PIs ausgestattet mit welchen ich versuche unser Leben durch etwas Automatisierung ein wenig smarter zu gestalten. Hierbei möchte ich die Technik und die dahinter eingesetzten Tools / Frameworks verstehen und nicht einfach nur Anwenden. Ich selbst bezeichne mich als ITler aus Leidenschaft :) Seit 2020 ist das Thema Chatbot / Voicebot / Conversational.ai in meinen Focus gerückt. In diesem Bereich investiere ich gerade viel Zeit.

0 thoughts on “E-Mail Anhänge nach ecoDMS importieren – mit Python 3”

  1. Hi Thomas, danke dir für das Script – wirklich toll, da dies eine wichtige Funktion ist, die in ecodms leider bis dato immer noch fehlt… Eine wichtige Frage: ich habe einen eigenen Mailserver und würde das Script gerne auf einen speziellen Unterordner (nennen wir ihn “ecodms” eingrenzen. Wie müsste das aussehen? Danke dir

    1. Hi Markus,

      ich habe gerade mal kurz in die Docu von Imbox (https://pypi.org/project/imbox/) geschaut, die Anpassung ist recht einfach (ist nun aber ungetestet). Offensichtlich muss nur in der Zeile ‘mailBoxContent = mailBox.messages()’ der gewünschte Ordner-Name angegeben werden. Das würde in Deinem Beispiel dann also zu ‘mailBoxContent = mailBox.messages(folder=’ecodms’)’ werden.

      Kannst ja mal ein kurzes Feedback geben ob das wie erwartet funktioniert hat 🙂

      Beste Grüße
      Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert