Hallo zusammen.
Der Tipp von Roland hat mich doch nochmal inspiriert :-)
Und man soll es nicht glauben es funktioniert nun.
Anstelle des BASE64 codierten Bildes (Konstante "LARRY" im Original"
habe ich nun einen VCALENDAR Text verwendet (Konstante VCALENDAR) und im den original Aufruf
Call stream.Writetext(LARRY)
cid = mime.attach(stream, ENC_BASE64, "", "image/gif")
ausgetauscht in
Call stream.Writetext(VCALENDAR)
cid = mime.attach(stream, ENC_NONE, "", |text/calendar; method=REQUEST; name="subject.ics"|)
ENC_NONE da wir nun puren Text haben.
Der Content Type bringt den Unterschied
text/calendar; method=REQUEST; name="subject.ics"
Jetzt wird die Mail direkt als Kalendereintrag angezeigt und kann über "Akzeptieren" eingetragen werden.
Was natürlich noch fehlt ist nun eine Funktion die den VCALENDAR Text entsprechend erstellt, aber dafür gibt es ja schon Lösungen
und wir wollen ja keine Langeweile aufkommen lassen :-)
Nochmals vielen dank an alle helfenden Hände
Viele Grüße
Andreas
%REM
Agent MimeTestRoland
Created 08.12.2011 by Andreas Wegener/D/Crawco-EU
Description: Comments for Agent
%END REM
Option Public
Option Declare
Private Const VCALENDAR = |BEGIN:VCALENDAR
X-LOTUS-CHARSET:UTF-8
VERSION:2.0
PRODID:-//Lotus Development Corporation//NONSGML Notes 7.0//EN
METHOD:REQUEST
BEGIN:VTIMEZONE
TZID:W. Europe
BEGIN:STANDARD
DTSTART:19501029T020000
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19500326T020000
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID="W. Europe":20111208T090000
DTEND;TZID="W. Europe":20111208T100000
TRANSP:OPAQUE
DTSTAMP:20111207T192505Z
SEQUENCE:0
ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED
;CN="Hans Wurst/D/Company";RSVP=FALSE
:mailto:hans.wurst@gmx.de
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
:mailto:hans.wurst@gmx.de
CLASS:PUBLIC
SUMMARY:Testerminh
ORGANIZER;CN="Bernhard Koehler/BKNotes/DE":mailto:ich@domain.de
UID:0DDCB88622E1298CC125795F006A9DA1-Lotus_Notes_Generated
X-LOTUS-BROADCAST:FALSE
X-LOTUS-UPDATE-SEQ:1
X-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1;$W:1;$O:1;$M:1
X-LOTUS-NOTESVERSION:2
X-LOTUS-NOTICETYPE:I
X-LOTUS-APPTTYPE:3
X-LOTUS-CHILD_UID:0DDCB88622E1298CC125795F006A9DA1
END:VEVENT
END:VCALENDAR
|
'/**
' * Diese Klasse dient zum Erstellen von Multipart-Related Mime-Items
' * @author: Roland Praml/01/int/FOCONIS
' */
Public Class MultipartRelatedMime
Private doc As NotesDocument
Private itemName As String
Private session As NotesSession
Private oldCvtMime As Integer
Private rootMime As NotesMIMEEntity
Private contentMime As NotesMIMEEntity
Private rootheader As NotesMIMEHeader
'/**
' * Erzeuge ein neues Objekt dieser Klasse. Im Anschluss können mittels
' * "attach" beliebig viele Attachments angelegt werden. Will man diese
' * im HTML anzeigen, so muss man sich den Rückgabewert von Attach merken
' * und als srv-URL im IMG-Tag verwenden (siehe Beispiel)
' * @param doc das Dokument, auf dem das MIME-Processing statt findet
' * @param itemName das MIME-Item (Normalerweise Body)
' * @return ein Objekt vom Typ MultipartRelatedMime
' */
Public Sub New(doc As NotesDocument, itemName As String)
Set me.doc = doc
Me.itemName = itemName
If doc.Hasitem(Itemname) Then ' Sicherheitsprüfung
Error 1000, "The Item " + itemName +" already exists."
End If
Set session = New NotesSession
oldCvtMime = session.convertMime ' alte Einstellung merken
session.convertMime = False ' Konvertierung abschalten
' -- Anlegegen des Root-Mimes
Dim stream As NotesStream
Set rootMime = doc.CreateMIMEEntity(itemName)
Set stream = session.CreateStream()
Call stream.WriteText("This is a multipart message in MIME format.")
Call rootMime.SetContentFromText(stream, "multipart/alternative", ENC_NONE )
' anlegen des root headers
Set rootheader = rootMime.CreateHeader("content-class")
Call rootheader.SetHeaderVal("urn:content-classes:calendarmessage")
' !! Es wird auch gleich ein Dummy-content angelegt, denn wenn man
' !! das Dokument jetzt speichert, dann wird es korrupt
Set contentMime = rootMime.Createchildentity()
Call stream.truncate()
Call stream.WriteText("empty")
Call contentMime.SetContentFromText(stream, "text/plain", ENC_NONE )
Call stream.Close()
End Sub
'/**
' * Destruktor, erledigt noch ein paar Aufräumarbeiten.
' * !! Achtung, danach ist die MIME-Konvertierung wieder aktiviert. !!
' */
Public Sub Delete
Call closeMime() ' sicherheitshalber nochmals close aufrufen
session.Convertmime = oldCvtMime '
End Sub
'/**
' * Diese Methode beendet die MIME-Verarbeitung, erst danach darf wieder
' * auf das Dokument zugegriffen werden.
' */
Public Function closeMime()
If Not doc Is Nothing Then
Set rootMime = Nothing
Set contentMime = Nothing
Call doc.Closemimeentities(True, itemName)
Set doc = Nothing
End If
End Function
'/**
' * "attach" hängt eine Datei an das MIME an. Die FileData werden idR.
' * binär oder base64-codiert übergeben. Gibt man einen Filenamen an,
' * so erscheint die Datei als Attachment, andernfalls erscheint bei
' * Bildern, welche im HTML referenziert werden, kein zusätzliches
' * Attachmentsymbol/"Büroklammer"
' * @param fileData Die Filedaten
' * @param encoding Das Enoding, z.B. ENC_BASE64
' * @param filename Der Dateiname, kann auch leer sein, s.o.
' * @param contentType z.B.: gif/jpeg
' * @return content-identifier
' */
Public Function attach(fileData As NotesStream, encoding As Integer, _
filename As String, ByVal contentType As String) As String
' -- es wird ein neues Kind angelegt
Dim mimePart As NotesMIMEEntity
Set mimePart = rootMime.CreateChildEntity()
If contentType = "" Then
contentType = "application/octet-stream" ' Default
End If
If filename <> "" Then
' Wichtig: Dateinamen sollten nicht doppelt vorkommene und
' dürfen keine Sonderzeichen enthalten. Dies wird hier aber
' nicht geprüft. Dateiname ggf. nach RFC2047 codieren.
Call mimePart.CreateHeader("Content-Disposition"). _
SetheaderValAndParams({attachment; filename="} +filename + {"})
End If
' -- eine zufällige Content-ID erzeugen
Dim cid As String
Dim randomGenerator As New NotesDocument(doc.Parentdatabase)
cid = randomGenerator.Universalid+"@mydomain"
Call mimePart.CreateHeader("Content-ID")._
SetheaderValAndParams("<" + cid + ">")
' -- und die Daten schreiben
Call mimePart.SetContentFromText(fileData, contentType, encoding)
attach = "cid:" + cid
End Function
End Class
'/**
' * Diese Prozedur erstellt ein neues Dokument, erzeugt mit obiger Klasse ein MIME-Item und versendet das Dokument dann
' */
Sub Initialize
Dim session As New NotesSession
Dim stream As NotesStream
Dim doc As New NotesDocument(session.Currentdatabase)
Dim cid As String
doc.Subject = "Dies ist ein Termin"
Dim mime As New MultipartRelatedMime(doc, "Body") ' Klasse anlegen
Set stream = session.createStream
Call stream.Writetext(VCALENDAR)
cid = mime.attach(stream, ENC_NONE, "", |text/calendar; method=REQUEST; name="subject.ics"|) ' Kalender anhängen und CID merken
Call stream.close()
Call mime.closeMime()
Call doc.send(False,"hans.wurst@gmx.de") ' Mail senden
End Sub