Hallo,
ich versuche seit geraumer Zeit mithilfe eines Excel-Makros, eine Mail-Vorlage in Lotus Notes (8.5.3FP6 SHF784) zu öffnen und nutze dazu folgenden Code:
Sub SendMail()
Dim Maildb As Object
Dim UserName As String
Dim MailDbName As String
Dim MailDoc As Object
Dim session As Object
Dim Recipient As String
Dim attachment As String
Set session = CreateObject("Notes.NotesSession")
Set Maildb = session.currentdatabase
Set MailDoc = Maildb.CreateDocument("", "", "Vorlage")
attachment = "<Pfad zum Anhang>"
MailDoc.Form = "Memo"
Recipient = "MaxMustermann@live.com"
MailDoc.sendto = Recipient
MailDoc.Subject = "Betreff"
MailDoc.body = "Nachrichtentext"
stAttachment = ActiveWorkbook.FullName
Set AttachME = MailDoc.CREATERICHTEXTITEM("stAttachment")
Set EmbedObj = AttachME.EMBEDOBJECT(1454, "", attachment, "stAttachment")
MailDoc.SAVEMESSAGEONSEND = True
MailDoc.SEND 0, Recipient
Set Maildb = Nothing
Set MailDoc = Nothing
Set AttachME = Nothing
Set session = Nothing
Set EmbedObj = Nothing
End Sub
Leider scheitere ich daran, dass Notes die Vorlage nicht aufrufen will. Habe schon diverse Lösungsansätze von Usern mit ähnlich gelagertem Problem ausprobiert, jedoch waren dort noch weitere andere Baustellen, sodass ich zu diesem konkreten Problem noch keine wirkliche Lösung finden konnte.
Muss die Vorlage (lokal im Client über "Werkzeuge->Vorlage->Neue Vorlage" erstellt) mit einem anderen Befehl angesteuert bzw. aufgerufen werden?
Btw: Agentenrechte nicht vorhanden.
Danke im Voraus.
Dein Code versendet die Mail, das muss ersetzt werden mit:
Dim ws As Object
Set ws = CreateObject("Notes.NotesUIWorkspace")
set mailUiDoc = ws.editDocument( true, mailDoc )
Du holst Dir die Ansicht mit allen Vorlagen mittels NotesDatabase.getView( "Stationery" ).
Dann holst Du die entsprechende Vorlage aus dieser Ansicht über NotesView.GetDocumentByKey( "Name der Vorlage") (geht nicht, weil Ansicht nicht sortiert nach Name)
einen NotesViewNavigator und einer While- Schleife, in der Du die NotesViewEntry- Elemente prüfst, ob Sie Deinen Vorlagennamen haben.
Dann benutzt Du den Code aus dem "QueryOpendocument"- Event der Ansicht (Stationary) um aus dieser Vorlage eine neue Mail zu generieren:
Dim note As New NotesDocument(db)
Call vorlagedoc.copyallitems(note)
Call note.ReplaceItemValue("Form",vorlagedoc.Form(0))
Call note.RemoveItem("$VersionOpt")
Call note.RemoveItem("$NoPurge")
Call note.RemoveItem("ProtectFromArchive")
Call note.RemoveItem("MailStationeryName")
Call note.RemoveItem("IsMailStationery")
Call note.ReplaceItemValue("tmpSkipSignature","1")
Dann füllst Du den Empfänger und ggf. andere Daten (wie Du es in Deinem Code schon machst) und versendest das Ding über note.Send
Okay, also mit dem NotesViewNavigator bin ich nun leicht überfordert. Wenn ich versuche, den Navigator via
Set NotesViewNavigator = NotesView.CreateViewNav
festzulegen, gibt er mir den Laufzeitfehler 91 (Objektvariable oder With-Blockvariable nicht festgelegt).
Wenn ich NotesView via
Set NotesView = NotesDatabase.getView("Stationary")
festlegen möchte, gibt er mir den Laufzeitfehler 438 (Objekt unterstützt diese Eigenschaft oder Methode nicht).
Irgendwie steh' ich auf dem Schlauch... ???
Also wenn Du die View schon nicht bekommst, wirst Du Dir von der nicht vorhandenen View auch keinen Navigator erstellen können.
Soweit logisch.
Leider fehlt der Rest vom Code, muss man dann halt raten.
Am besten mal den Testcode in einen Agent packen und den Debugger anwerfen.
sollte in etwa so etwas sein - fast zu 100% aus der Notes Designerhifle kopiert:
Dim session As NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim nav As NotesViewNavigator
set session = New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView("Stationary")
Set nav = view.CreateViewNav()
Also mit den Notes-Klassen kann das VBA hier leider nichts anfangen. Evtl. wurde die .dll auch noch gar nicht registriert. Aus einer Prüfung der regedit wir leider auch nichts, da keine Rechte vorhanden sind. :$
Im Folgenden dennoch mal der Code bis zur (geplanten) Erstellung des Navigators:
Dim session As Object
Dim db As Object
Dim view As Object
Dim nav As Object
set session = New NotesSession
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationary")
Set nav = view.CreateViewNav()
In der letzten Zeile gibt er nach wie vor den Laufzeitfehler 91. Vermutlich wegen der fehlenden library...
Nicht gleich verzweifeln... Einmal gebe ich Dir noch nen "Schubs" in die richtige Richtung:
found = False
Set ve = nav.GetFirstEntry()
While found = false and not ve is Nothing
Set vorlagedoc = ve.Document
If vorlagedoc.GetitemValue( "MailStationeryName" )(0) = "Name Deiner Vorlage" Then
found = True
End If
Set ve = nav.GetNextentry(ve)
Wend
if found = True then
'- hier kommt der code, um eine Kopie zu erstellen
End If
Aber vermutlich wäre es wirklich das beste, jemanden zu engagieren... Denn von ErrorHandling, Reaktion wenn die Vorlage nicht existiert, Dokument zum bearbeiten öffnen, etc. haben wir ja überhaupt noch nicht gesprochen...
In der Zeile
Set ve = nav.GetFirstEntry()
wird der Laufzeitfehler 438 gemeldet. Muss ve hier als was anderes als Object deklariert werden?
Sub SendMail()
Dim db As Object
Dim session As Object
Dim view As Object
Dim nav As Object
Dim vorlagedoc As Object
Dim ve As Object
Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set nav = view.CreateViewNav()
Set ve = nav.GetFirstEntry()
found = False
While found = False And Not ve Is Nothing
Set vorlagedoc = ve.Document
If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
found = True
End If
Set ve = nav.GetNextentry(ve)
Wend
OK, da eh auf das Backend-Dokument zugegriffen wird und nicht der NotesView-Index ausgewertet wird - kann man sich den NotesViewNavigator auch schenken und die Ansicht auf klassischer, einfachen Art durchlaufen, das ist bei den Mail-Vorlagen auch nicht falsch, der Code sieht dann so aus:
Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object
Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
If vorlagedoc.getItemValue("MailStationeryName")(0) = "<Vorlage>" Then Exit Do
Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop
If Not vorlagedoc Is Nothing Then MsgBox "Vorlage: " + vorlagedoc.getItemValue("MailStationeryName")(0)
Okay, also mit dem Code ohne Navigator
Sub SendMail()
Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object
Dim doc As Object
Dim note As Object
Dim ws As Object
Set session = CreateObject("Notes.NotesSession")
Set ws = CreateObject("Notes.NotesUIWorkspace")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
If vorlagedoc.getItemValue("MailStationeryName")(0) = "<Vorlage>" Then Exit Do
Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop
If Not vorlagedoc Is Nothing Then MsgBox "Vorlage: " + vorlagedoc.getItemValue("MailStationeryName")(0)
Call vorlagedoc.copyallitems(doc)
Set doc = vorlagedoc
With doc
.Form = "Memo"
Recipient = "MaxMustermann@live.com"
.sendto = Recipient
.Subject = "Betreff"
.body = "Nachrichtentext"
End With
Set doc = ws.EditDocument(True, doc)
Set db = Nothing
Set doc = Nothing
Set session = Nothing
End Sub
durchläuft er sämtliche Schritte, findet durch die Do-Loop-Schleife auch anscheinend die richtige Vorlage, erstellt auch im weiteren Verlauf eine Mail, nutzt hierbei jedoch die Vorlage nicht. :$
(Den Block mit den "Call note.[...]" nach
Call vorlagedoc.copyallitems(note)
musste ich rausnehmen, da er mir den Laufzeitfehler 458 ausgab).
Beim Code mit Navigator und mit "nav.GetFirst" anstatt "nav.GetFirstEntry"
Dim db As Object
Dim session As Object
Dim view As Object
Dim nav As Object
Dim vorlagedoc As Object
Dim ve As Object
Set session = CreateObject("Notes.NotesSession")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set nav = view.CreateViewNav()
Set ve = nav.GetFirst
found = False
While found = False And Not ve Is Nothing
Set vorlagedoc = ve.Document
If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
found = True
End If
Set ve = nav.GetNextentry(ve)
Wend
gibt er mir in der Zeile If vorlagedoc.GetitemValue("MailStationeryName")(0) = "<Vorlagenname>" Then
wieder den Laufzeitfehler 91. ???
Das war es was ich meinte: Du VERSTEHST den Code nicht, den Du einsetzt.
Im ersten Beispiel z.B. erstellst Du KEIN neues Dokument doc, sondern verweist auf das vorlagedoc... Und die Reihenfolge ist ausserdem falsch rum, weshalb natürlich ein CopyAllItems fehlschlägt...
Statt Call vorlagedoc.copyallitems(doc)
Set doc = vorlagedoc
müsstest Du schreiben:
Set doc = db.CreateDocument()
Call vorlagedoc.copyallitems(doc)
Im zweiten Beispiel ist es so, dass die Ansicht auch Kategorien enthält. Und diese bekommst Du mit getfirst... Diese Kategorien haben kein Dokument, es müsste also ein If ve.IsDocument then vor das Set vorlagedoc =...
Aber mir wird das Ganze jetzt hier zu aufwändig, ich bin raus.
Viel Glück weiterhin.
@torsten: man fängt immer klein an ;)
@drehstuhl: du hast es fast geschafft:
Dim db As Object
Dim session As Object
Dim view As Object
Dim vorlagedoc As Object
Dim docMail As Object
Dim note As Object
Dim ws As Object
Const vorlage = "<<Vorlage>>"
Set session = CreateObject("Notes.NotesSession")
Set ws = CreateObject("Notes.NotesUIWorkspace")
Set db = session.GetDatabase("", "")
Call db.OpenMail
Set view = db.GetView("Stationery")
Set vorlagedoc = view.getFirstDocument
Do Until vorlagedoc Is Nothing
If vorlagedoc.getItemValue("MailStationeryName")(0) = vorlage Then Exit Do
Set vorlagedoc = view.getNextDocument(vorlagedoc)
Loop
If vorlagedoc Is Nothing Then MsgBox "Vorlage ''" + vorlage + "'' wurde nicht gefunden": Exit Sub
Set docMail = db.createDocument
Call vorlagedoc.copyallitems(docMail)
docMail.Save True, False
Call ws.EditDocument(True, docMail)
Nein, so funktioniert es nur teilweise... Du musst unbedingt nach dem CopyAllItems die Vorlagen- spezifischen Felder entfernen, sonst hast Du sehr seltsame Nebenwirkungen, entweder beim Absender oder beim Empfänger (z.B. die neuen Mails werden alle als Vorlage angezeigt, diese Mails können nicht archiviert werden, etc.)...
Bitte ergänze nach dem CopyAllitems noch unbedingt die von mir geposteten Zeilen:
Call note.RemoveItem("$VersionOpt")
Call note.RemoveItem("$NoPurge")
Call note.RemoveItem("ProtectFromArchive")
Call note.RemoveItem("MailStationeryName")
Call note.RemoveItem("IsMailStationery")
'- diese Zeile kannst Du weglassen, wenn Du die Signatur angängen willst und nicht "Skippen"
Call note.ReplaceItemValue("tmpSkipSignature","1")