Autor Thema: iPhone Mail mit Inlines, Inlines sichtbar, aber programmatisch nicht  (Gelesen 8192 mal)

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
Beim versenden von Bildern mit dem iPhone werden diese als Inline der Mail gehängt.
Wenn ich die Mail öffne, sehe ich diese Bilder auch.

Ich muss aber eine Agent schreiben, der die Bilder auf der Festplatte ablegt.
Versuche ich aber über javascript an diese Bilder zu kommen oder überhaupt nur zu erkennen, dass die Mail welche enthält, dafür habe ich bisher keine Lösung gefunden.

doc.Hasembedded gibt false zurück.
Alle Items durchgehen und bei Richtextitem Isempty(rtitem.EmbeddedObjects) abgefragt, ergibt immer true
Kann man irgendwie den itemtype RFC822Text so auslesen, dass man die Bilder erhält?
Oder gibt es irgend eine andere Lösung. Ich benötige sie wirklich dringend.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Hallo Renate - und willkommen im Forum!

Um Dir zu helfen, vorab folgendes: Dass Du "eine" Agent schreiben musst und dass das "wirklich dringend", ist ja wirklich spannend, hilft aber weder Dir noch uns.
Daher: Was hast Du denn schon unternommen? Gibt es einen konkreten Punkt, an dem Du jetzt scheiterst? HJast Du schon die Suche dieses Forums bemüht? Weisst Du, dass Inline Images in der Regel in einen "image"-Tag eingebunden sind und Base64-kodiert sind? Hast Du danach schon gesucht?

Je konkreter Deine Fragen, desto einfacher ist es für Hilfswillige und desto besser können diese sich auf Deine Erfordernisse einstellen.

Bernhard

PS: Die oben genannten Suchbegriffe sollten schon zielführend sein. Wenn nicht - dann besteht noch ein ganz anderes Problem. Die "muss!"-Forderung an Dich wäre dann obsolet.

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Hallo Renate,
willkommen im Forum!

"Dringend"? Oh... es ist nur dringend. Ich dachte schon, es brennt irgendwo und die Welt geht unter.  ;)

DEINE ATTACHMENTS SIND DA!
Da ich weiß, daß man im Streß manchmal den Wald vor lauter Bäumen nicht sieht, folgender Tip.
Laß Dich nicht hetzen und schau Dir im Notes Client die Items an, die in solch einem Mail-Dokument enthalten sind. Du solltest mehrere "Body" Items finden. Nein, das ist kein Bug, das gehört so. Schau Dir den Inhalt der einzelnen Items an. Ich gehe davon aus, daß Du Deine Attachments dort jetzt gefunden hast.

UND WIE WEITER?
Falls Du dich überhaupt noch nie mit dem Begriff "MIME" auseinandergesetzt hast --> jetzt wäre der richtige Augenblick, damit anzufangen. Falls Dir das Thema schon was sagt: lies Dir Deine Fragen und die Problembeschreibung in Deinem ersten Posting nochmal durch.

Und dann mach bitte das, was Bernhard gesagt hat.

Viel Erfolg,
Th.

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
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.

Code
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

Code
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

Offline Keydins

  • Aktives Mitglied
  • ***
  • Beiträge: 163
  • Geschlecht: Männlich
Versuch es mal mit

vEval = Evaluate("@AttachmentNames(0)", doc)


Aus der Notes Hilfe:

Zitat
@AttachmentNames( excludeMIMEBody )

Parameters
excludeMIMEBody
Boolean. Optional.
Specify True (1) to exclude large MIME parts that are stored as attachments (but displayed in-line). This is the default.
Specify False (0) to include large MIME parts that are stored as attachments (but displayed in-line).

Gruß Dirk
Gruß Dirk

Aktuelle Notesumgebung
~800 BasicClients 9.0.1 FP9 SHF55
  10 FullClients 9.0.1 FP7 SHF143
    7 DominoServer 9.0.1 FP9 HF 139 / 64 Bit

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
Code
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 {""}

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
@Renate
Also bei mir steht in einem Body-Item mit "Bild" z.B. sowas drin:

Code
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
Code
        ' 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.
« Letzte Änderung: 26.01.16 - 15:56:10 von thkn777 »

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
Code
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:
Code
Feldname: Body
Datentyp: Rich Text
Datenlänge: 20500 Byte (das differiert schon mal)
Seq.-Num.: 1
Doppeleintrags-ID: 0-53
Feld-Flags: SIGN SEAL 
Code
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:
Code
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?

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Hallo Renate,
meine Vermutung: Du hast die originalen Mail-Dokumente im Notes gespeichert. Also einen weiteren "Save" ausgeführt.

Experiment - Mach mal folgendes:
- sende eine neue Mail vom iPhone, mit Anhängen
- wenn diese Mail im Eingang angekommen ist, kopiere sie und füge sie nochmal in Deine Mail-DB ein
- Du hast jetzt zwei Mail-Dokumente, die "gleich" sind
- dann öffne das Original-Mail-Dokument
- wechsle in den Bearbeitungsmodus
- Speichere das Dokument

Nun schau Dir beide Dokumente an. Am besten direkt aus dem Ordner "Posteingang" heraus die Dokumenteigenschaften öffnen.

Erwartetes Resultat:
Die Body-Felder im gespeicherten Original-Dokument sollten jetzt "Rich Text" sein, die in der kopierten Mail immer noch "Mime-Element". Nur in der kopierten Mail ist die Funktion Ansicht-->Anzeigen-->Seitenquelltext noch nutzbar und liefert ein sinnvolles Resultat.

Wenn Du die Anhänge detachen willst, mußt Du dem Typ des Body-Feldes Rechnung tragen. Wenn Du den "MIME"-Weg einschlägst, dann belasse die Dokumente in der Ursprungsform und speichere sie nicht nochmal. Dann sollte auch alles klappen.

Viel Erfolg,
Th.

Offline it898ur

  • Senior Mitglied
  • ****
  • Beiträge: 478
Hallo,

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).

Gruß

André

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
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.

Code
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


Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
@Renate
Öhhhm... wenn die Attachments schnöde im Notes-Dokument abgelegt sind (also nach dem Save), wie wäre es dann mit einem klassischen

Code
Set notesEmbeddedObject = notesDocument.GetAttachment( fileName$ )

und danach dann

Code
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.

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
Code
Ö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.


Offline it898ur

  • Senior Mitglied
  • ****
  • Beiträge: 478
Hallo,

schau Dir mal diesen Code als Beispiel an: http://atnotes.de/index.php/topic,55904.msg360470.html#msg360470

Viele Grüße

André

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Moin Renate,
ich kann Dein Problem bei mir leider nicht nachstellen. Wenn ich empfangene Mail-Nachrichten speichere, dann geht's immer nur bis:

doc.Hasembedded --> true
Evaluate (|@AttachmentNames(0)|,doc) --> liefert die Liste der $FILE Attachment Namen

Kannst Du reproduzieren, wie Du von einem normalen "Mime"-Dokument zu einem derart modifizierten ("kaputten") Notes-Dokument kommst? Weder durch Speichern im UI, noch im Backend bekomme ich das hier hin... Notes Version ist 8.5.3 bei mir.

So ganz ohne was "handfestes" würde ich an der Stelle nicht gern weitermachen, sorry. Nochmal zur Sicherheit nachgefragt: die $FILE Items mit den Attachments siehst Du aber, ja?

Vorschlag:
Verrat' mir, wie ich normale "Mime" Mails in den Zustand bekomme, den Du da grad hast.
Oder schick' mir was, damit ich mir's ansehen kann. Bei Interesse weiterer Kontakt über PM. Vorher bitte über das Thema Datenschutz nachdenken - wenn Du die Daten nicht aus der Hand geben darfst/kannst - DANN LASS ES.  ;)
« Letzte Änderung: 04.02.16 - 09:56:43 von thkn777 »

Offline Renate

  • Frischling
  • *
  • Beiträge: 13
@it898ur: Super vielen Dank, dass ist meine Lösung.
Ich musste nur noch bei
Code
If Not stream.Open(path & "Base64.tmp" ,	"binary") Then

und
Code
Kill path & "Base64.tmp"
path durch destinationpath ersetzen, dann funktioniert alles wie ich es brauche.

@thkn777: Vielen Dank für der Angebot, aber habe jetzt die Lösung

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz