Autor Thema: Mime-Feld kopiern  (Gelesen 6538 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