Hallo Bernhard und Th.
Vielen Dank für die Rückmeldung und Entschuldigung, war am Mittwoch nach 12 Stunden vor der Kiste völlig generved.
MIME ist mir nicht ganz unbekannt, habe schon rekursive MIME-Mailverarbeitung in Java geschrieben die funktioniert.
Das Beispieldokument hat 55 Bodyfelder Doppeleintrags-ID 0 bis 53 werden leer angezeigt, wenn ich über Dokumenteneigenschaften rein schaue 54 enthält den Text der Mail "Grüße ..."
(Im Anhang alle ausgelesenen Felder.)
In Lotusscript bekomme ich das Entity gar nicht zu fassen und finde auch nach diversen Suchen im Forum oder über Google keine Lösung.
Weisst Du, dass Inline Images in der Regel in einen "image"-Tag eingebunden sind und Base64-kodiert sind? Hast Du danach schon gesucht?
Wie komme ich an das "Image"-Tag?
doc.GetMIMEEntity ist nothing
doc.Hasembedded ist false
Isempty(rtitem.EmbeddedObjects) ist true für alle richtextitems
Evaluate("@AttachmentNames", doc) gibt auch nichts zurück
Gruß
Renate
Option Public
Option Declare
Sub Initialize
On Error Goto fehler
Print "iPhone Mail Test"
Dim session As New NotesSession
session.ConvertMime = False
Dim db As notesdatabase
Dim dc As notesdocumentcollection, doc As notesdocument, rtitem As notesrichtextitem
Dim fehler As Integer
fehler = 0
Dim docHasError As Boolean
Set db= session.currentdatabase
Dim agentLog As New NotesLog("Logbuch")
Call agentLog.Openmaillog(session.Username, "iPhone Mailtest in " + db.Title)
Call agentLog.LogAction("Start...")
Set dc = db.Unprocesseddocuments
Set doc = dc.getfirstdocument
Dim findEmbedded As Boolean
While Not doc Is Nothing
docHasError = false
findEmbedded = False
'Body
Dim hasEmbedded As Boolean
hasEmbedded = false
If doc.Hasembedded then
Call agentlog.Logaction(doc.subject(0) + " hat Embedded Objects")
hasEmbedded = True
else
Call agentlog.Logaction(doc.subject(0) + " hat keine Embedded Objects")
hasEmbedded = false
End If ' hasembedded
ForAll item In doc.Items
If ( item.Type = RICHTEXT ) Then
Call agentlog.Logaction( "item: " + item.name)
Call agentlog.Logaction( "is richtext")
Set rtitem = item
If rtitem Is Nothing Then
Call agentlog.Logaction( "rtitem Is Nothing")
Goto nextitem
End If
If Not( Isempty(rtitem.EmbeddedObjects)) Then
findEmbedded = true
Forall o In rtitem.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
Call agentlog.Logaction("Objectname:" + o.name)
End If
nextFile:
End Forall
Else
Call agentLog.LogAction("Kein Object enthalten.")
End If
End If
nextitem:
End ForAll
' nächter Versuch, wenn Attachment nicht am Richtext hängen
Dim vEval As Variant
Dim embObj As NotesEmbeddedObject
vEval = Evaluate("@AttachmentNames", doc)
Call agentLog.LogAction("check @AttachmentNames")
If IsArray(vEval) then
ForAll v In vEval
If v <> "" Then
If hasEmbedded And Not findEmbedded Then
Call agentLog.LogAction("Nicht bearbeitetes Attachment =" & v)
else
Call agentLog.LogAction("enthalten Attachment:" & v)
End If
Set embObj = doc.GetAttachment(v)
End If
End ForAll
Else
If vEval <> "" Then
If hasEmbedded And Not findEmbedded Then
Call agentLog.LogAction("Nicht bearbeitetes Attachment =" & vEval)
Else
Call agentLog.LogAction("enthalten Attachment:" & vEval)
End If
End If
End if
' Iterate through each of the document's items looking for attachments
Dim objAttachment As NotesEmbeddedObject
Dim icounter As Integer
icounter = 0
Call agentlog.Logaction("Check item.type Attachment")
ForAll item In doc.Items
Call agentlog.Logaction(item.name + " itemTyp" + CStr(item.Type))
If item.Type = RFC822Text Then
Call agentlog.Logaction("RFC822Text.Name" + item.Values(0))
End If
If item.Type = Attachment Then
' first in Values array is the name of the attachment.
Set objAttachment = doc.GetAttachment(item.Values(0))
iCounter = iCounter + 1
'get the attachment filename
Call agentlog.Logaction("objAttachment.Name" + CStr(icounter)+" " + objAttachment.Name)
End If
End forall
' %REM MIME Verarbeitung
' Dim s As New NotesSession
Dim mime As NotesMimeEntity
Dim parent As NotesMimeEntity
Dim stream As NotesStream
Dim header As NotesMIMEHeader
Dim filename As String
Dim basedir As String
basedir = "c:\temp\"
Set stream = session.CreateStream
Set mime = doc.GetMIMEEntity
if Not mime Is Nothing Then
Call agentLog.LogAction("is mime")
else
Call agentLog.LogAction("is NOT mime")
End If
While Not mime Is Nothing
'if a mime part contains an attachment the Content-Disposition header will contain the value of "attachment"
Set header = mime.GetNthHeader("Content-Disposition")
If (Not header Is Nothing) Then
Call agentLog.LogAction("Has header")
If (header.GetHeaderVal(True) = "attachment") Then
'if the Content-Disposition header exists then the filename parameter must be present
filename = header.GetParamVal("filename")
'strip off the quotation marks on the file name
filename = Strright(filename, {"})
filename = Strleft(filename, {"})
'open a file, get the content of the attachment, and write it to the file system
stream.Open baseDir + filename, "binary"
mime.GetContentAsBytes stream, True
stream.Close
End If
else
Call agentLog.LogAction("header Is Nothing")
End If
Set mime = mime.GetNextEntity(SEARCH_DEPTH)
Wend
session.ConvertMime = True
' %END REM
weiter:
Set doc = dc.getnextdocument(doc)
'Stop
Wend
Ende:
If fehler > 0 then
Messagebox "Shrink Images mit Fehlern beendet. Errorcount=" + CStr(fehler) + Chr(13) + "Siehe auch Logmail"
Call agentlog.Logaction("Generate Shrink Images ended. Errorcount=" + CStr(fehler))
else
Messagebox "Shrink Images ohne Fehler beendet." + Chr(13) + "Siehe auch Logmail"
Call agentlog.Logaction( "Generate Shrink Images successfully ended")
End if
Call agentLog.LogAction("Finish...")
Call agentlog.close
Exit Sub
fehler:
fehler = fehler +1
Print "ShrinkImages ERROR:" + Str(Err) + " " + Error$(ERR) + " in Zeile " + CStr(Erl)
Call agentlog.Logaction( "ShrinkImages ERROR:" + Str(Err) + " " + Error$(ERR) + " in Zeile " + CStr(Erl) )
Err = 0
Goto weiter
End Sub
Versuch es mal mit
vEval = Evaluate("@AttachmentNames(0)", doc)
war ein Versuch Wert, aber
Evaluate("@Attachments(0)", doc) ergibt {0} und
Evaluate("@AttachmentNames(0)", doc) ergibt {""}
@Renate
Also bei mir steht in einem Body-Item mit "Bild" z.B. sowas drin:
Feldname: Body
Datentyp: MIME-Element
Datenlänge: 227 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 15
Feld-Flags: SIGN SEAL
"
--=_related 003D7ED3C1257F41_=
Content-Transfer-Encoding: base64
Content-Type: image/gif
Content-ID: <_1_0D5894CD46A494AB3D7EA1257F41>
R0lGDlhAABAIKJHP//wUHZCH5B9653256L654321BAAEAAICRAEAOw=="
Wenn Du derlei Einträge bei Dir nicht hast, dann fände ich das schon merkwürdig. Im Content-Type könnte natürlich auch image/jpeg oder irgendwas anderes sinnvolles stehen...
Mit folgendem Schnipsel
' pathtemp = was auch immer für Dich Sinn macht
' i = Nummer des MIME-Elementes, Rest kann man sich denken ;)
If mime.ContentType = "image" And mime.ContentSubtype = "gif" Then
Set stream = s.CreateStream
pathname$ = pathtemp & doc.Universalid & "_" & CStr(i) & ".gif"
If Not stream.Open(pathname$, "binary") Then
' Fehlerbehandlung, z.B.
' MessageBox pathname$,, "Open failed"
End If
Call mime.GetContentAsBytes(stream)
Call stream.Close()
Else
müßte so ein GIF-Attachment dann auch auf Platte landen. Tut es bei mir zumindest.
Tip:
- Bau mal einen kleineren, nicht ganz so komplexen Agenten und setze ihn auf eine Mail an, die garantiert MIME kodiert ist. Ist einfach übersichtlicher... In der Notes Hilfe zu notesMIMEEntity.GetContentAsBytes findet sich ein kurzes Beispiel, das als Ausgangspunkt taugen kann. Das ganze "Drumherum" schreibst Du, nachdem der eigentliche Export läuft - ok? Aber nicht vergessen! ;)
- Arbeite nur mit Set mime = doc.GetMIMEEntity und Set mime = mime.Getnextentity(), um Dich in einem Dokument durch die Liste der Mime-Elemente zu hangeln. Das Body-Item an sich spielt eigentlich keine Rolle für den Agenten aus "Mime-Sicht".
Viel Erfolg,
Th.
Wenn Du derlei Einträge bei Dir nicht hast, dann fände ich das schon merkwürdig.
Ich finde das mehr als merkwürdig, aber es ist leider so.
Die von iPhones versendeten Mails haben zwar wie bereits erwähnt 55 body Felder, aber diese sehen so aus:
Feldname: Body
Datentyp: Rich Text
Datenlänge: 20500 Byte (das differiert schon mal)
Seq.-Num.: 1
Doppeleintrags-ID: 0-53
Feld-Flags: SIGN SEAL
Feldname: Body
Datentyp: Rich Text
Datenlänge: 23736 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 54
Feld-Flags: SIGN SEAL
Güße
S R
Dass es sich um eine MIME Message handelt, kann man nur erahnen, da es ein Feld MIME_Version gibt:
Feldname: MIME_Version
Datentyp: RFC822-Text
Datenlänge: 48 Byte
Seq.-Num.: 1
Doppeleintrags-ID: 0
Feld-Flags: SUMMARY
RFC822 Typ: TEXT
RFC822 Kennzeichen: STRICT
Nativer Wert:
"1.0 (1.0)"
RFC822 Header-Name:
"Mime-Version"
RFC822 Header-Begrenzer:
": "
RFC822 Header-Body:
31 2E 30 20 28 1.0 (
31 2E 30 29 0D 1.0).
0A .
Eine Mail, die ein Bodyfeld von typ MIME-Element hat, habe ich gerade getestet.
Wurde mit dem Algorithmus problemlos bearbeitet.
Noch eine Idee?
Hallo,
hatte ein wenig Urlaub, daher geht es erst jetzt weiter.
@thkn777 und @it898ur
Du hattest recht eine neue Mail vom iPhone kann ich problemlos über MiMeEntity verarbeiten, aber leider habe ich auch viele der gespeicherten und dadurch in RichText umgewandelten Dokumente.
nach der Konvertierung der MIME-Mail in RichText sind es eingebettete Bilder - diese bekommt man nicht als Anhang gegriffen, aber ggf. über den Umweg DXL-Export (dort i.d.R. als Base64 kodierter Binärtext).
Habe noch keine Erfahrung mit dxl, daher vielleicht einen Tip für mich, wie man das über den DXL-Export hin bekommt?
Das Body Feld als DXL File speichern ist ja kein Problem, aber wie bekomme ich dann die Bilder aus der DXL als Bilddatei (meistens jpeg) auf die Festplatte?
Gruß
Renate
@Renate
Öhhhm... wenn die Attachments schnöde im Notes-Dokument abgelegt sind (also nach dem Save), wie wäre es dann mit einem klassischen
Set notesEmbeddedObject = notesDocument.GetAttachment( fileName$ )
und danach dann
Call notesEmbeddedObject.ExtractFile( intelligentGewaehlterDateiname )
für alle Dich interessierenden Attachments?
Tip: "intelligentGewaehlterDateiname" steht da nicht grundlos... ggf. hast Du Attachments der Form "mime.jpg.001", "mime.jpg.002", "mime.jpg.003", ... in Deinen Dokumenten - da müßtest Du dann noch den Dateinamen sinnigerweise vor dem Export korrigieren.
Viel Erfolg,
Th.
Öhhhm... wenn die Attachments schnöde im Notes-Dokument abgelegt sind (also nach dem Save), wie wäre es dann mit einem klassischen
Leider nicht ganz so schnöde, wie bereits im Post am 25.1. erwähnt
doc.GetMIMEEntity ist nothing
doc.Hasembedded ist false
Isempty(rtitem.EmbeddedObjects) ist true für alle richtextitems
Evaluate("@AttachmentNames", doc) gibt auch nichts zurück
Mittlerweile habe ich auch mal mit notesrichtextnavigator den body untersucht und er findet weder Elemente vom Typ RTELEM_TYPE_DOCLINK (5), noch RTELEM_TYPE_FILEATTACHMENT (8), noch RTELEM_TYPE_OLE (9).
Wenn ich sie nicht sehen könnte würde ich behaupten, es sind keine drin.
In der exportierten DXL Datei sind aber tatsächlich in meinem Beispielfall <jpeg> Tags.
@it898ur: Super vielen Dank, dass ist meine Lösung.
Ich musste nur noch bei
If Not stream.Open(path & "Base64.tmp" , "binary") Then
und
path durch destinationpath ersetzen, dann funktioniert alles wie ich es brauche.
@thkn777: Vielen Dank für der Angebot, aber habe jetzt die Lösung