Domino 9 und frühere Versionen > ND9: Entwicklung
PDF/TIF-Attachments extrahieren
typeOneg:
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
--- Ende Zitat ---
Peter Klett:
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.
Klafu:
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.
--- Ende Code ---
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.
--- Ende Code ---
Gruß
Chris
umi:
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.
Peter Klett:
--- Zitat von: umi am 18.09.13 - 08:27:36 ---...
@Peter punkt 3 anstatt StrLeft würde ich ein StrRightBack() verwenden um die Dateiendung auszulesen.
--- Ende Zitat ---
Du hast ja so Recht ... :)
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln