Autor Thema: Mime-Feld kopiern  (Gelesen 6463 mal)

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Mime-Feld kopiern
« am: 26.11.10 - 14:53:15 »
Hallo Forum,

und noch eine Frage zum Thema MIME Mails.

Ich versuche aktuell, ein Dokument mit einem MIME/HTML Feld in ein neues
Dokument zu kopieren.

Lieder gehen beim "normalen" Kopieren die Mime-Attribute verloren. Es sieht dann wieder
aus wie ein normales Richtextfeld aus.

Hier der Codauszug:

   s.ConvertMIME = False
   Set maildoc = db.CreateDocument

   maildoc.form = "Memo"
   maildoc.sendto =  empfaenger
   maildoc.subject = mailsubject

   Set item = sourceDoc.Getfirstitem("AbsenderBody")
   Call item.Copyitemtodocument(maildoc, "Body")
   Call maildoc.Send(False)
   s.ConvertMIME = True


Nun meine Fragen hierzu:
1) Ist das überhaupt möglich, einfach ein Mime-Feld in ein anderes Dokument zu kopieren so dass die Mime-Formatierung erhalten bleibt?
2) Oder muss ich den Weg gehen, dass ich aus Dokument 1 den MIME-Inhalt komplett auslese und dann in das Body Feld des Zieldokuments einfüge?

Gibt es hier ein best practice Weg?
Wie verhält sich das Ganze bei Multipart MIME-Mails?


Grüße
Bernd

Arbeite klug, nicht hart.

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Mime-Feld kopiern
« Antwort #1 am: 27.11.10 - 08:40:25 »
Hi Bernd,

Du willst es echt wissen  ;D
Wenn du das Feld nicht umbenennen musst, gehts noch relativ einfach. Da hilft dir ein CopyAllItems um ein temp-Doc zu erzeugen. Anschließend iterierst du über doc.items und löscht alle Felder bis auf das Mime-Feld und $FILE

Ansonsten musst du Mime-Part für Mime-Part kopieren. Ich hab dafür auch ein Codeschnipsel.

Ich habe aber hier eine Bitte. Untenstehender Code hat Kollegen und mich viel Arbeit gekostet und wir müssen immer wieder mal fest stellen, dass sich noch der ein oder andere Fehler eingeschlichen hat. (z.B. bei der Filterung, welche Mime-Header wir kopieren und welche nicht)
Solltest du Verbesserungen im Code machen, oder noch eine andere Möglichkeit finden wie man diese widerspenstigen Mime-Items kopiert, so wäre ich dir sehr dankbar wenn du diese im Foum wieder mitteilst.

Gruß
Roland

Code
	'/**
	' * Kopiert den Inhalt einer Mime-Entity und alle untergeordneten Entitäten in eine Ziel-Entität
	' * @param srcMime Mime-Quellobjekt
	' * @param dstMime Mime-Zielobjekt
	' * @return 
	' */
	Private Function copyMimeWithChildren(srcMime As NotesMIMEEntity, dstMime As NotesMIMEEntity)
		On Error GoTo rethrow
		If False Then
rethrow:	rethrow			
		End If
	'--- Errorhandling Ende -----
		Dim	session 	As New NotesSession
		Dim	dstHdr	As NotesMIMEHeader
		Dim	stream	As NotesStream
		Set	stream	=  session.createStream
		' also wenn mir irgenwder mal zeigen kann wie man diese $%&§§$" Mime-items einfacher kopieren kann
		' dann wäre ich darüber SEHR dankbar
		Dim filter(0), contentType$
		filter(0)="Content-Type"
		contentType = Trim(StrRight(srcMime.GetSomeHeaders(filter, True), "Content-Type:"))
		' header kopieren
		ForAll header In srcMime.HeaderObjects
			'Msgbox header.HeaderName + ": " + header.GetHeaderValAndParams()
			If header.HeaderName = "Content-Transfer-Encoding" 	Then
				' nop
			ElseIf header.HeaderName = "Content-Type" 			Then
				' nop
			ElseIf header.HeaderName Like "X-*" 				Then
				' nop
'			ElseIf header.HeaderName = "Content-ID"				Then
'				' nop

			Else
'				If srcMime.GetParentEntity Is Nothing Then
'					' CHECKME: hier noch eine Skip-Methode einbauen bei Root-Mimes oder reicht X-*
'				End If
	
				Dim hdr As NotesMIMEHeader
				Set hdr = dstMime.CreateHeader(header.HeaderName)
'				MsgBox header.HeaderName + " = "+ header.GetHeaderValAndParams()
				If Not hdr Is Nothing Then Call hdr.SetHeaderValAndParams( header.GetHeaderValAndParams() )
			End If
		End ForAll
		' content kopieren
		Call srcMime.getContentAsBytes( stream, False )
		Call dstMime.setContentFromBytes( stream, contentType, srcMime.encoding )
		
		Dim	dstChild	As NotesMIMEEntity
		Dim	srcChild	As NotesMIMEEntity
		Set	srcChild	=  srcMime.GetFirstChildEntity
		
		Do Until srcChild Is Nothing
			Set	dstChild	= dstMime.createChildEntity()
			Call copyMimeWithChildren( srcChild, dstChild )
			Set	srcChild	= srcChild.GetNextSibling
		Loop
		
	End Function


Aufgerufen wird das dann so:
set src = srcDoc.getMimeEntity("AbsenderBody")
set dst = dstDoc.createMimeEntity("Body")
call copyMimeWithChildren(src,dst)
Call srcDoc.CloseMIMEEntities(False,"AbsenderBody")
Call dstDoc.CloseMIMEEntities(True,"Body")
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Legolas

  • Senior Mitglied
  • ****
  • Beiträge: 446
  • Geschlecht: Männlich
Re: Mime-Feld kopiern
« Antwort #2 am: 29.11.10 - 10:47:50 »
Danke Roland,

das werde ich tun!

Grüße
Bernd
Arbeite klug, nicht hart.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz