Autor Thema: PDF/TIF-Attachments extrahieren  (Gelesen 6839 mal)

Offline typeOneg

  • Aktives Mitglied
  • ***
  • Beiträge: 204
  • Geschlecht: Männlich
    • My Band
PDF/TIF-Attachments extrahieren
« am: 18.09.13 - 07:42:17 »
Wunderschönen Guten Morgen liebe Notes-Kollegen.

Ich hätte da mal ein Frage :-)

Die Anforderung ist, dass bei eingehenden Mail-Rechnungen Anhänge extrahiert werden und auf ein Netzshare gelegt werden. Jetzt bin ich ja nicht der erste mit dieser Anforderung und ich hab' mir auch aus alten Datenbanken und aus den Suchergebnissen hier schon was "zusammengeschustert", das in Grundzügen auch schon klappt. Leider gibt es noch ein paar Punkte, die meinen Admin-Horizont übersteigen.

1.) es sollten nur pdf & tif - Attachments extrahiert werden. Mails mit anderen Attachements (od. ohne Att.) sollten unberührt in der Mail-DB verbleiben, um sie später manuelle kontrollieren zu können.

2.) Mails die bereits verarbeitet wurden sollen gelöscht werden ==> geht das nur, wenn ich die SoftDeletions in der DB deaktiviere? Mein Agent findet nämlich bei jedem Durchlauf auch jene Mails, die im Papierkorb liegen und verarbeitet die nochmal.

Hier Code, der bisher von mir zusammengebastelt wurde. Wie gesagt, das extrahieren klappt schon, vielleicht könnt ihr mir ja bei den beiden obigen Punkten noch weiterhelfen.  Bitte habt Nachsicht, ich bin Admin :-) Vielen Dank schon mal.

lg
Hans

================================

Zitat
Option Public
Sub Initialize
   
   server$ = "server/domain"
   pathName$ = "\\server\share$\verzeichnis\"
   
   Dim subj As Variant
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim doc, reply, doc2 As NotesDocument
   Dim obj As NotesEmbeddedObject
   Dim clog As New NotesLog("Rechnung eingegangen")
   
   Call clog.OpenNotesLog(server$, "mailin/mailinlog.nsf")
   
   Set db = session.currentDatabase
   Set dc = db.alldocuments
   Set doc =dc.GetFirstDocument
   nr = 1
   ext =".pdf"
   
   While Not(doc Is Nothing)
      
      Call clog.LogAction(  "[" + CStr(nr) + "] Processing mail from: " & doc.from(0) & " | Subject: " & doc.subject(0) )
      subj = doc.getItemValue( "$File" )
      Set obj = doc.getattachment( subj (0) )
      
      If obj Is Nothing Then
         Call clog.LogError(  999, "[" + CStr(nr) + "] Es wurde kein Attachment gefunden." )
         saved = False
         GoTo nextDoc
      End If

      'check, if attachment exists on file system
      pattern$ = pathName$ + UCase(subj(0))
      fileName$ = Dir$(pattern$, 0)
      If fileName$ = "" Then
         found=False
      Else
         found = True
      End If
      
      If Not(found) Then
         Call obj.ExtractFile(pathName$ & CStr(Nr) & CStr(ext))
         Call clog.LogAction( "[" + CStr(nr) + "] File " + subj(0) + " (" + UCase(subj(0)) + ") " + " saved in " + pathName$ + " on server " + server$)
         saved = True
      Else
         Call clog.LogAction( "[" + CStr(nr) + "] File " + subj(0) + " (" + UCase(subj(0)) + ") " + " exists in " + pathName$ + " on server " + server$)
         saved = False
      End If
      
nextDoc:
      Set doc2 = doc 'save current doc for later remove
      Set doc = dc.GetNextDocument(doc)
      nr = nr + 1
            
      'delete doc in mailin db   
      If doc2.remove(True) Then
      
      Else
         Call clog.LogError(  999, "[" + Cstr(nr) + "] Dokument nicht aus DB gelöscht." )   
      End If
'   End If   

   Wend
      
End Sub
==============
~ 13 Domino-Server (9.0.1)
~ ca. 1.400 Notes-Clients (8.5.3 FP4)
~ ca. 600 Traveler Devices (iOS & Android)
~ dzt. 40 IBM-Connections-User
==============

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PDF/TIF-Attachments extrahieren
« Antwort #1 am: 18.09.13 - 08:19:18 »
Was mir auf die Schnelle auf- bzw. einfällt:

1. Ich würde die Dokumente nicht löschen, sondern mit einem Flag versehen

Was passiert, wenn mit der Routine irgendetwas klemmt, so dass der Anhang nicht sauber gespeichert aber das Dokument gelöscht wurde? Gibt es Aufbewahrungspflichten für die eingegangenen Mails?

Also m.E. besser nicht löschen, sondern ein Feld hineinschreiben und dann speichern.

z.B.

doc.FlagBearbeitet = Now
Call doc.Save (True, True)

Wenn Du einen Zeitstempel als Flag verwendest, kannst Du später auch immer sehen, wann das Dokument verarbeitet wurde

2. Nicht über alle Dokumente laufen

Mit dc = db.AllDokuments holst Du immer alle Dokumente, unabhängig davon, ob die überhaupt einen Dateianhang haben. Unter Berücksichtigung des o.g. Flags hole die Dokumente über ein Search

Set dc = db.Search ({@IsAvailable ($FILE) & @Text (FlagBearbeitet) = ""}, Nothing, 0)

3. Du gehst nur über den ersten Anhang

Was passiert, wenn Du mehrere Dateianhänge hast? Die schicken zwei Rechnungen, die erste extrahierst Du (und dann löschst Du das Dokument, womit der o.g. Fehler schon eintritt). Oder (musste ich schmerzhaft erfahren) der Absender beginnt mit irgendwelchen tollen Tools schicke Disclaimer mit Bildchen seiner eigenen Großartigkeit anzuhängen, die dann auch noch vor dem eigentlichen Anhang liegen. Lass das noch als .tiff angehängt sein, dann interpretierst Du das Teil als Rechnung.

Also gehe über das Item Body und durchlaufe alle Anhänge

Dim rtitem As NotesRichtextItem
Set rtitem = doc.GetFirstItem ("Body")
If IsArray (rtitem.EmbeddedObjects) Then
   Forall obj In rtitem.EmbeddedObjects
      Select Case Lcase (StrRightBack (obj.Source, "."))
      Case "tif", "pdf"
          -> Datei extrahieren
      End Select
   End Forall
End If

In die Routine habe ich Dir auch gleich eine Möglichkeit der Dateitypenprüfung eingebaut. Die Befehle müssen nicht 100 %ig korrekt sein, sind nur aus dem Kopf, also ggf. sinngemäß verwenden. obj.Source gibt Dir den Dateinamen des Anhangs.

4. Optional den Dateinamen beim Speichern individualisieren

Evtl. würde ich den Dateinamen beim Speichern mit einem Zeitstempel versehen, denn wenn jemand immer die Rechnung als Rechnung.pdf schickt, kollidiert dieser Dateiname mit der früher schon abgelegten Datei, falls diese nicht irgendwie anders weiterverarbeitet und verschoben/umbenannt werden.
« Letzte Änderung: 18.09.13 - 10:17:19 von Peter Klett »

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: PDF/TIF-Attachments extrahieren
« Antwort #2 am: 18.09.13 - 08:23:13 »
Hallo,

Zu 1.) eine Script, um eine Mail und deren Anhänge auf den Dateityp zu prüfen und dann weiterzuverarbeiten hab ich hier schon mal gesehen.
Such mal im Forum nach einem Post von Eknori (Ulrich) ich glaub das war zum Thema... Anhänge drucken oder so.
Da kannst du diese Anhang-prüfung bestimmt als If Schleife in dein Script einbauen.

Zu 2.) Musst du wissen ob dein Errorhandling dich dafür schützt, eine (noch)nicht verarbeitete E-Mail zu löschen. Ich hab es bei mir so gemacht, das ich 3 Ordner hab.
- Ausstehend
- Erledigt
- Fehler
Allerdings dürfen wir es auch aus Gründen der Revision nicht löschen.

Zu deinem Papierkorb thema...
Aus der Hilfe zu doc.Remove
Code
Usage
This method does a soft deletion if "Allow soft deletions" is enabled. See RemovePermanently to do a hard deletion.


Zum thema RemovePermanently aus der Hilfe
Code
Example
Permanently deletes a document from a database, doing a hard deletion even if soft deletions are enabled.
Note  This method is new with Release 6.
Defined in
NotesDocument
Syntax
flag = notesDocument.RemovePermanently( force )
Parameters
force
Boolean. If True, the document is deleted even if another user modifies the document after the script opens it. If False, the document is not deleted if another user modifies it.
Return value
True indicates that the document was successfully deleted.
False indicates that the document was not deleted, because another user modified it and the force parameter is set to False.
Usage
This method does a hard deletion even if "Allow soft deletions" is enabled. See Remove to do a soft deletion.


Gruß
Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Re: PDF/TIF-Attachments extrahieren
« Antwort #3 am: 18.09.13 - 08:27:36 »
Moin

Zu 2.  NotesDocument hat die Eigneschaft isDeleted =true / false

@Peter punkt 3 anstatt StrLeft würde ich ein StrRightBack() verwenden um die Dateiendung auszulesen.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PDF/TIF-Attachments extrahieren
« Antwort #4 am: 18.09.13 - 08:53:12 »
...
@Peter punkt 3 anstatt StrLeft würde ich ein StrRightBack() verwenden um die Dateiendung auszulesen.
Du hast ja so Recht ... :)

Offline typeOneg

  • Aktives Mitglied
  • ***
  • Beiträge: 204
  • Geschlecht: Männlich
    • My Band
Re: PDF/TIF-Attachments extrahieren
« Antwort #5 am: 18.09.13 - 15:12:13 »
Und wieder mal hat sich gezeigt, wie cool die Notes-Community ist. Vielen Dank für Eure Inputs und ganz speziell an Peter, der für den "Feinschliff" gesorgt hat.

Schöne Grüße aus dem Salzburger Land.

Hans


Zitat
falls es wen interessiert, hier das fertige Script:

Option Public
Sub Initialize
   
   'Changes
   '   06-02-04 (TK)
   '      o check file: filename uppercase; save file as uppercase and compare with uppercase
   
   server$ = "server/domain"
   pathName$ = "\\server\share\verzeichnis\"

   Dim subj As Variant
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim doc, reply, doc2 As NotesDocument
   Dim embObj As NotesEmbeddedObject
   Dim clog As New NotesLog("Rechnung eingegangen")
   Dim rtitem As NotesRichTextItem
     
   Call clog.OpenNotesLog(server$, "mailin/mailinlog.nsf")
   
   Set db = session.currentDatabase
   Set dc = db.Search ({@IsAvailable ($FILE) & @Text (FlagBearbeitet) = ""}, Nothing, 0)
   Set doc = dc.GetFirstDocument

Do While Not doc Is Nothing

   Set rtitem = doc.GetFirstItem ("Body")   
   
   nr = 1
     
   If IsArray (rtitem.EmbeddedObjects) Then
      ForAll obj In rtitem.EmbeddedObjects
         Select Case LCase (StrRightBack (obj.Source, "."))   'StrRightBACK ist wichtig, denn es gibt ja Dateinamen wie "Rechnung31.12.2012.tiff"
         Case "pdf", "tif", "tiff"
            'check, if attachment exists on file system
            pattern$ = pathName$ + UCase(obj.Source) '-> obj.Source anstelle von subj (0)
            fileName$ = Dir$(pattern$, 0)
            If fileName$ = "" Then
               found=False
            Else
               found = True
            End If
                       
            If Not(found) Then
               Call obj.ExtractFile(pathName$ & CStr(Nr) & CStr(ext))
               Call clog.LogAction( "[" + CStr(nr) + "] File " + obj.Source + " (" + UCase(obj.Source) + ") " + " saved in " + pathName$ + " on server " + server$)
               doc.FlagBearbeitet = Now
               saved = True         
            Else
               Call clog.LogAction( "[" + CStr(nr) + "] File " + obj.Source + " (" + UCase(obj.Source) + ") " + " exists in " + pathName$ + " on server " + server$)
               saved = False
            End If
      End Select
nr = nr + 1
      End ForAll
   End If   
   

If CStr (doc.FlagBearbeitet (0)) <> "" Then
   Call doc.Save (True, True)
End If

Set doc = dc.GetNextDocument (doc)
Loop
   
   'Call clog.close
   
End Sub
==============
~ 13 Domino-Server (9.0.1)
~ ca. 1.400 Notes-Clients (8.5.3 FP4)
~ ca. 600 Traveler Devices (iOS & Android)
~ dzt. 40 IBM-Connections-User
==============

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PDF/TIF-Attachments extrahieren
« Antwort #6 am: 18.09.13 - 15:25:36 »
Und wieder mal hat sich gezeigt, wie cool die Notes-Community ist. Vielen Dank für Eure Inputs und ganz speziell an Peter, der für den "Feinschliff" gesorgt hat.
Naja, eher "grob gehobelt" ...  ;)

Enthält eine Mail mehrere zu speichernde Anhänge, und eine davon kann nicht abgelegt werden, weil die schon auf der Platte liegt, wird die Mail dennoch als bearbeitet gekennzeichnet und nie wieder angefasst.

Das funktioniert nur, wenn sichergestellt ist, dass vom Absender niemals verschiedene Dateien mit gleichem Dateinamen gesendet werden.

In Deinem Umfeld mag das funktionieren, wenn die Mails aus einem Prozess kommen, der eindeutige Dateinamen vergibt, für alle anderen, die glauben dieses Script so einsetzen zu können, sei dieser Hinweis unbedingt zu beachten.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz