Suchender80: E-Mail Parser Service per IMAP

Hallo zusammen,

ich lese hier schon seit einiger Zeit mit, habe aber noch nie einen Post verfasst. Jetzt habe ich aber kurz eine Frage und erlaube mir die hier zu stellen.

Ich war letzthin auf der Suche nach einem Tool/Service das ein IMAP-Postfach regelmässig nach Mustern (zum Bsp. Betreff) durchsucht und aus dem Mail (es stammt von einem Webformular) die relevanten Information extrahiert und in eine Tabelle (CSV-download würde schon reichen) transferiert. Alle gefunden Tools waren kommerziell, was bei diesem Projekt nicht möglich war.

Hattet ihr auch schon mal dieses Problem? Wie habt ihr es gelöst?

Ich freue mich auf Eure Antworten!

  1. Hallo,

    ich hatte mal eine Anmeldeseite, also ein HTML-Formular, das per PHP ausgewertet wurde und bei jeder Anmeldung eine E-Mail an mich geschickt hat. Da in diesem Formular alle Informationen schon aufgeschlüsselt vorlagen, hat das PHP-Script bei jeder Anmeldung auch noch die Daten in eine CSV-Datei geschrieben.

    Gruß
    Jürgen

  2. Lieber Suchender80,

    verstehe ich das richtig, dass Du eine CSV-Datei in regelmäßigen Abständen mit inhalten aus E-Mails aktualisieren möchtest, damit Du sie zu einem beliebigen Zeitpunkt herunterladen kannst?

    aus dem Mail (es stammt von einem Webformular)

    Warum wird nicht direkt bei der Verarbeitung des Webformulars die CSV-Datei aktualisiert?

    was bei diesem Projekt nicht möglich war.

    Wenn man jetzt wüsste, auf welcher Basis dieses Projekt aufgebaut ist... Welche serverseitige Sprache kommt zum Einsatz? Verwendet ihr eine Datenbank?

    Hattet ihr auch schon mal dieses Problem? Wie habt ihr es gelöst?

    In unserem Projekt wird alle fünf Minuten ein PHP-Script gestartet, dass sich in einem IMAP-Postfach anmeldet, um dort eingegangene Mails zu verarbeiten. Sie werden danach entweder gelöscht, oder in ein Archiv verschoben. Die ins Archiv verschobenen Mails haben Empfängeradressen, die zu einer Rundmail-Gruppe gehören, an deren Mitglieder diese Mails versendet werden. Den Betreff werten wir nicht speziell aus, auch nicht Dateianhänge, wohl aber die Absenderadresse, da wir die eventuell ersetzen müssen (wegen fremder Maildomains).

    Liebe Grüße

    Felix Riesterer

    1. Wenn man jetzt wüsste, auf welcher Basis dieses Projekt aufgebaut ist... Welche serverseitige Sprache kommt zum Einsatz? Verwendet ihr eine Datenbank?

      Hm. Ich glaube der TO sucht etwas Fertiges.

      Ich habe mal die Python-Imap-Tools getestet:

      (Installation unter Debian und Derivaten:)

      sudo apt install python3-imap-tools
      

      Test-Skript: (Ausdrücklich: Nicht produktiv verwenden! Warnungen folgen.)

      • Geht zwar, erzeugt aber, wenn viele Mails auf dem Server liegen, heftigen Datenverkehr (weil alle Mails abgerufen - und übrigens sonst nicht geändert werden) und braucht bei vielen Mails dementsprechend auch lange.
      • Zudem muss das Passwort für das Mailkonto im Programm angegeben werden. Das gilt „per se“ als gefährlich.
      • Es wird nicht mit gut gesicherten Mailservern (z.B. google-Mail) funktionieren (OAuth[2] müsste dazu eingebaut werden, dass ist es aber bei Weitem nicht mehr so trivial.)
      • ist nur „gegen“ einen Server mit TLS (Port 993) getestet.
      #!/usr/bin/python
      
      #############################################
      # Only for testing!                         #
      # NEVER use this in productiv environments! #
      #############################################
      
      
      ### Config:
      
      outFile    = '/tmp/mails.csv'
      mailServer = 'Dein-Imap-Server'
      mailFolder = 'INBOX'
      loginName  = 'Dein-Login-Name'
      loginPass  = 'Dein-Passwort'
      csvDialect = 'unix'
      
      ### Program:
      
      import csv
      from imap_tools import MailBox, AND
      
      with MailBox( mailServer ).login( loginName, loginPass, initial_folder=mailFolder ) as mailbox:
      	dates      = [ msg.date_str for msg in mailbox.fetch( AND( all=True ) ) ]
      	senders    = [ msg.from_    for msg in mailbox.fetch( AND( all=True ) ) ]
      	recipients = [ msg.to       for msg in mailbox.fetch( AND( all=True ) ) ]
      	subjects   = [ msg.subject  for msg in mailbox.fetch( AND( all=True ) ) ]
      
      mails = []
      for i in range( len( dates ) ):
      	mails.append( [ dates[i], senders[i], recipients[i], subjects[i] ])
      	
      with open( outFile, 'w', newline='\r\n', header = None ) as csvfile:
      	writer = csv.writer( csvfile, dialect=csvDialect )
      	for mail in mails:
      		writer.writerow( mail )
      
      1. Oh. Da ist mir bei der „Optimierung“ für das Forum etwas aus der falschen Version (mit anderem CSV-Generator) hineingeraten, die folgende Zeile ist falsch:

        with open( outFile, 'w', newline='\r\n', header = None ) as csvfile:
        

        Das „, header = None“ ist nicht etwa nur „hyperliquid“, dessen Gebrauch endet mit Beschwerden des Skriptinterpreters.

        Die betreffende Zeile im Testskript also wie folgt ändern:

        with open( outFile, 'w', newline='\r\n') as csvfile: