Domino 9 und frühere Versionen > ND6: Entwicklung
gleiche $File-Items bei unterschiedlichen Attachments
(1/1)
el_erik:
Hallo,
ich habe hier ein Problem, bei welchem ich am Verzweifeln bin.
Um Attachments einer Mail zu lösen, habe ich einen Agenten geschrieben, welcher ueber die $File-Items des Dokumentes iteriert. Die entsprechende Routine sieht etwa wie folgt aus:
--- Code: ---Sub Initialize
Dim session As New NotesSession
Dim cdb As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim object As Variant
Dim filename As String
Dim exp_path As String
exp_path = "c:\temp\"
Set cdb = session.CurrentDatabase
Set docs = cdb.UnprocessedDocuments
Set doc = docs.GetFirstDocument
If (doc.HasEmbedded) Then
Forall item In doc.Items
If ((Ucase (item.Name) = "$FILE") _
And item.Type = ATTACHMENT) Then
filename = item.Values ( 0 )
Set object = doc.GetAttachment ( filename )
filename = GetAttachmentFileName (exp_path, filename)
Call object.ExtractFile (filename)
End If
End Forall
End If
End Sub
Function GetAttachmentFileName (attpath As String, attname As String) As String
Dim i As Integer
Dim filename As String
i = 1
filename = attpath & "\" & attname
While Dir (filename) <> ""
filename = attpath & "\" & Right ("00" & Cstr (i), 3) & "_" + attname
i = i + 1
Wend
GetAttachmentFileName = filename
End Function
--- Ende Code ---
Bisher hat dies auch prima funktioniert. Nun liegt mit jedoch eine Mail-DB vor, bei welcher die Dokumente folgendes Phänomen aufweisen.
Die Dokumente der Mail-DB enthalten mehrere Attachments mit unterschiedlichen Namen. Im Debugger sehe ich jedoch das die $File-Items immer das gleiche Attachment enthalten. Betrachte ich die $File-Items ueber die Dokument-Eigenschaften, werden die Attachmentnamen angezeigt, die ich auch erwarte. Die Anzahl der $File-Items stimmt mit der Anzahl der Attachments ueberein. Fuer obiges Script wird daher das erste Attachment mehrmals exportiert.
Kopiere ich das Dokument in eine andere Mail-DB tritt das Problem nicht mehr auf.
Wenn ich das Script leicht modifiziere erhalte ich jedoch alle gewuenschten Attachments.
--- Code: ---Sub Initialize
Dim session As New NotesSession
Dim cdb As NotesDatabase
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim object As Variant
Dim filename As String
Dim exp_path As String
exp_path = "c:\temp\"
Set cdb = session.CurrentDatabase
Set docs = cdb.UnprocessedDocuments
Set doc = docs.GetFirstDocument
If (doc.HasEmbedded) Then
Dim found As Boolean
Do
found = False
Forall item In doc.Items
If ((Ucase (item.Name) = "$FILE") _
And item.Type = ATTACHMENT) Then
filename = item.Values ( 0 )
Set object = doc.GetAttachment ( filename )
filename = GetAttachmentFileName (exp_path, filename)
Call object.ExtractFile (filename)
item.Remove
found = True
Exit Forall
End If
End Forall
Loop While found = True
End If
End Sub
--- Ende Code ---
In jedem Durchlauf der Do-Schleife verweisen immer alle $File-Items auf das erste Attachment.
Meine Frage ist nun warum die $File-Items immer den gleichen Wert enthalten und ob ich dies eventuell abstellen kann. Wie gesagt, das Phaenomen ist mir neu. Zu erwaehnen waere noch, das der Notes-Client die Version 6.5.3 hat und die Mail-DB auf einer Schablone basiert, welche mehrsprachig ist (deutsch, englisch). Der Agent wird am Client ausgefuehrt.
Hat jemand eine Idee?
Bye Marco
koehlerbv:
Woher kommt in letzter Zeit nur diese Affinität zu $File-Items? Wer hat das verbreitet? Das ist Schwachfug. Du bist wohl auch ein Opfer geworden ...
Orientiere Dich nicht an $File-Items, Marco, denn diese sind Dokument-interne Container. Ein Attachment (oder auch ein Bild oder OLE-Object) können durchaus zig $File-Items erzeugen.
Was wichjig ist:
- NotesDocument.HasEmbedded
- Wenn Mail, dann brauchst Du Dich nur noch um das RTI "Body" zu kümmern (sowieso: Konzentriere Dich auf die RichTextItem und die EmbeddedObjects classes).
- Wenn "irgendein Dokument": Schleife durch die Items und konzentriere Dich dabei auf die, die als Type RT haben.
Aber: Finger weg von $File. Dieses Item ist Notes-intern und mit puren Bordmitteln nicht zu beherrschen (aus gutem Grund).
Bernhard
el_erik:
Hallo Bernhard,
zunaechst erstmal vielen Dank fuer Deinen Hinweis.
Liegt der Body der Mail als RT-Item vor, nutze ich auch die entsprechenden Methoden der NotesEmbeddedObject-Klasse. Allerdings kann der Body auch als MIME_PART vorliegen und in diesem Fall bin ich ueber die $File-Items gegangen. Das Property HasEmbedded ist fuer dieses Dokument auch True allerdings gibt es kein RT-Item.
Alternativ koennte man ueber die NotesMIMEEntity-Klasse gehen, was wohl aber auch nicht so einfach ist.
Bye Marco
el_erik:
Hallo,
so ich habe mich jetzt hingesetzt und den eine Routine geschrieben, welche die Attachments aus dem Mime-Part exportiert, wenn der Body vom entsprechendem Typ ist. Dies funktioniert nach den ersten Test's ganz gut.
Allerdings habe ich immer noch Mails, bei welchen bisher alles versagt (bis auf den Weg ueber die $File-Items).
HasEmbbeded ist True und der Body des Mail-Dokumentes liegt als RT-Item vor, aber das Property EmbbededObjects ist leer (ebenso wie doc.EmbbededObjects). Auch andere RT-Items gestatten keinen Zugriff.
Gibt es noch andere Moeglichkeiten an die Attachments zu kommen?
Bye Marco
el_erik:
Hallo,
ich muss jetzt nochmal genauer nachfragen. Ich habe nochmal in der Designer-Hilfe zur Methode NotesDocument.GetAttachment nachgelesen. Diese kann verwendet werden, um NotesEmbbededObject's zu erhalten, welche nicht über ein Richttextfeld erreichbar sind.
Given the name of a file attachment, returns a NotesEmbeddedObject representing the attachment. You can use this method to find file attachments which are not contained in a rich text item (such as an attachment in a Release 2 database), as well as file attachments that are contained in a rich text item.
Eigentlich muss ich nur noch an die Attachmentnamen kommen, um diese zu extrahieren. Was spricht dann gegen die $File-Items?
Bye Marco
Navigation
[0] Themen-Index
Zur normalen Ansicht wechseln