Hi,
ich habe eine Notes-intern versendete Mail mit 2 Bildern im Textfeld (body). Normalerweise liest mein zuständiger Agent sämtliche Anhänge und Bilder aus (und speichert diese), nur in dem Fall nicht!
Bisher behandle ich Anhänge bzw. Bilder zum einen so: (Auszug)
If ( doc.HasEmbedded ) Then
If ( attachment.Type = RICHTEXT ) Then
Forall o In attachment.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
zum anderen über 'NotesMIMEEntity'. Das klappt auch 1a.
Bei dieser Mail jedoch greift keine Methode. Hier sehen außerdem vom Maildokument die body-Items so aus (mehr steht jeweils nicht drin):
Feldname: Body
Datentyp: Rich Text
Datenlänge: 44268 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 0
Feld-Flags: SIGN SEAL
Hiervon gibts 32 body-Items mit laufender Nr. bei 'Doppeleintrags-ID' und unterschiedlicher 'Datenlänge'!
Wie komme ich hier erstmal grundsätzlich an so ein Bild ran?
Danke und Gruß
Rico.
Hallo,
ich muss das Thema nochmal aufgreifen, da ich einfach nicht weiterkomme...
Mein Maildokument enthält Bilder direkt sichtbar im Mailtext.
Wenn ich nun, wie im 1.Post beschrieben die Attachments auslesen will:
If ( doc.HasEmbedded ) Then
...
...dann ist diese Bedingung hier schon false!!!
Wieso hat das Maildokument angeblich keine EmbeddedObjects, wenn ich die Bilder doch aber sehe?
Wie komme ich an diese blöden Bilder ran? Die Hilfe hat mich in dem Falle auch nicht schlauer gemacht, da ich lt. Hilfe bereits korrekt vorgehe!
Rico.
Meines Wissens, gibt es nur eine Methode die Bilder zu bekommen und die geht über DXL.
Der NotesDXLExporter wäre hierfür mein Ansprechpartner?!
Damit konvertiere ich ja aber das NotesDocument (mein Maildokument) erstmal komplett in ein XML-File! Habe dazu auch schon Code getestet - klappt erstmal, d.h. ich habe auf Platte jetzt ein XML-File meines Maildokuments.
Dim exporter As NotesDXLExporter
Dim streamDXL As NotesStream
Dim fname As String
fname = "D:\temp\DXLoutput.xml"
Set streamDXL = session.CreateStream
Call streamDXL.Open(fname)
Call streamDXL.Truncate
Set exporter = session.CreateDXLExporter(docMail)
Call exporter.SetOutput(streamDXL)
Call exporter.Process
Call streamDXL.Close
Ich will aber im Endeffekt NUR die evtl. enthaltenen Bilder auslesen und speichern.
Habt ihr hierfür Beispiele/Links/Lektüre etc. zur Hand?
Wie kann ich außerdem im Code außerdem eine Fallunterscheidung treffen, dass nur Dokumente abgearbeitet werden sollen, wo Bilder im RichText eingefügt sind?
Danke und Gruß
Rico.
bei Attachments ist ein <attachmentref> herum:
<attachmentref name="run.pdf" displayname="run.pdf">
<picture width="41px" height="47px">
<gif originalformat="notesbitmap">
R0lGODlhKQAvAOcAAP///wAAAOjo6LCwsODg4ODg6EgAAPjY2NjY2EhISMjI0KiosNjY4MDAwMDA
yNDQ0KioqNDQ2PDw8Li4wKCgoPgYGGBgYLCwuOjo8PAICPgIEPggKPgoKFBQUMjIyJiYmKCgqMgA
AOCAgOgACPgQGPgYIPgwMPh4ePiIiEBAQFhYWLi4uOioqOiwsOjg6PgQEPggIPgoMPgwOPhoaPiA
....
LJBCEjh0QcagKLvUVW02WnYuZpppOuUdZ50RYNK1hBduuOErEODn4ow3vqeeDVnHFnTW8UlddJdX
7hCda9XpOeV19snncnmO3vnpjYv+UkAAOw==
</gif>
</picture>
</attachmentref>
Ein Preprocessing mit XSLT sollte es ermöglichen, alle <attachmentref> und Unterelemente zu entfernen
Den Base64-Stream kann man übrigens mithilfe des NotesMimeEntity wieder in binär umwandeln
Gruß
Roland
So, hier mal ein Auszug aus der DXL (xml)... mit 'ConvertNotesBitmapsToGIF = False'. Somit sieht man erstmal die Tags in ihrer eigentlichen Form.
1. Ein BMP, welches inline im Mailtext sichtbar ist:
<par def='2'><picture height='768px' width='1024px'><notesbitmap>
<!-- hier der Base64-Stream des BMP -->
</notesbitmap></picture></par>
2. Ein Icon eines Attachments:
<attachmentref name='BMP-Test.bmp' displayname='BMP-Test.bmp'>
<picture height='47px' width='78px'><notesbitmap>
<!-- hier der Base64-Stream des Icon -->
</notesbitmap></picture></attachmentref>
Rico.
Die DB von openntf.org verwendet genau die Technik die ich skizziert habe:
- uses internal DXL and MIME classes for extracting the images and decode base64 data
ich hab mal den Code überflogen, die "schnipseln" die Image-Tags mit String-Operationen raus, ich würde das eher über einen SAX-Parser machen (xslt ist hier wohl overkill), man kann dann den DXL-Exporter und den SAX-Parser kaskadieren:
Der Sax-Parser hat als Eingabestrom den NotesDXLExporter.
der SAX-Parser hat dabei 3 relevante Events: Sax_Start_Element, Sax_End_Element, Sax_characters.
dann baust dir eine "State-Machine":
dim gif%, jpg%, attachment%
sub Sax_start_element (source, elName, attr)
select case lcase(elName)
case "attachmentref": attachment = attachment + 1 ' Attachment-Tag betreten
case "gif": gif = gif + 1 ' gif-tag betreten
end select
end sub
sub Sax_end_element (source, elName)
select case lcase(elName)
case "attachmentref": attachment = attachment - 1 ' Attachment-Tag verlassen
case "gif": gif = gif - 1 ' gif-tag verlassen
end select
end sub
sub Sax_characters(...)
if attachmentref = 0 and gif = 1 then ' keinen Attachmentref-Tag betreten, aber einen GIF-Tag
... exportiere GIF
end if
end sub
soweit in etwa klar?
analog dazu kannst du auch noch die Fileattachments extrahieren
Gruß
Roland
Ich konnte mein Problem nun endlich lösen! ;D
Summary:
Ich wollte RichText-Pictures aus einer Mail extrahieren und speichern.
Dazu habe ich als Codegrundlage die Datenbank von Openntf genommen - die 'ExportPictures'-Funktion aus der Scriptbibliothek 'ExportPicturesLib'.
Hierbei wird aus einem Dokument mittels DXLExporter ein XML-String erzeugt (inkl. aller Inline-Pictures). Aus diesem XML-String werden dann alle Inline-Pictures auf Platte gespeichert. Funktioniert soweit erstmal prima, aber...
mein Problem hierbei:
Es wurden auch alle Attachment-Icons von Nicht-RichText-Bildern mit ausgeleitet/gespeichert. Das soll in meinem Fall (und ich denke auch allgemein) eigentlich nicht sein!
Lösung:
Nach etlichen Versuchen mittels NotesSAXParser die Attachment-Icons aus dem XML-String rauszuparsen und alles wieder irgendwie in DXL bzw. XML-String "zusammenzubauen", bin ich dann auf eine sehr einfache Lösung gestoßen!!! ;) Ich frag mich jetzt noch, warum nicht gleich so! :-:
Der Anfang der benutzten 'ExportPicture'-Funktion aus der Datenbank von Openntf.org sieht so aus:
...
Set thisDB = session.CurrentDatabase
Set exporter = session.CreateDXLExporter
exporter.ConvertNotesBitmapsToGIF = True
...
Lediglich durch einfügen einer Zeile ergibt sich folgender Code, wobei hier alle Pictures, welche zwischen den Tags <attachmentref...>...</attachmentref> stehen und Attachment-Icons repräsentieren, nicht mit in den XML-String übernommen werden!!! Das wars dann auch schon - so einfach kanns manchmal laufen!
Set thisDB = session.CurrentDatabase
Set exporter = session.CreateDXLExporter
exporter.ConvertNotesBitmapsToGIF = True
' NEU: auslassen von Attachment-Icons im XML-String
exporter.OmitRichtextAttachments = True
...
Allerdings ist diese Property erst ab Release 8 verfügbar.
Ich danke euch für eure Hilfe/Unterstützung/Tips!!!
Danke und Gruß
Rico.