Mail via Lotus Notes versenden

Zvoni

Erfahrenes Mitglied
Holladrio! Endlich mal ein gutes VB-Forum auf deutsch.
Bin nicht umhin gekommen, dieses Thema zu lesen, da ich im Moment genau das in der Firma coden muss!

Prinzipiell:
Gut: Der allgemeine Code von Jacka
Schlecht: In Mehrbenutzerumgebungen und zu starre Parametrisierung!!

Ich werde mal meine Variante hier reinsetzen. Ihr werdet ein paar deutliche Unterschiede bemerken. Hinweis: Habe den ganzen Code in ein Klasse gesetzt, mit nur "SendNotesMail" als öffentlicher Methode, deshalb auch der "Initialize"-Code

Code:
Private Declare Function GetPrivateProfileString Lib "kernel32" _
  Alias "GetPrivateProfileStringA" ( _
  ByVal lpApplicationName As String, _
  ByVal lpKeyName As Any, _
  ByVal lpDefault As String, _
  ByVal lpReturnedString As String, _
  ByVal nSize As Long, _
  ByVal lpFileName As String) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Const HKEY_CURRENT_USER = &H80000001
Private Const KEY_READ = &H20019
Private Const REG_SZ = 1

Private Pfad As String
Private MailFile As String

Private Function ReadReg() As String
Dim RetVal As Long
Dim hKey As Long
Dim TmpSNum As String * 1280

  ' Registryschlüssel öffnen
  RetVal = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Lotus\Notes\7.0", 0&, KEY_READ, hKey)
  
  If RetVal <> 0 Then
    
    RetVal = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Lotus\Notes\6.0", 0&, KEY_READ, hKey)
    
    If RetVal <> 0 Then
    
        MsgBox "Der Schlüssel konnte nicht geöffnet werden."
        Exit Function
        
    End If
    
  End If

  ' Wert auslesen
  RetVal = RegQueryValueEx(hKey, "NotesIniPath", 0, REG_SZ, _
    ByVal TmpSNum, Len(TmpSNum))
  If RetVal <> 0 Then
    MsgBox "Der Schlüsselwert konnte nicht gelesen oder gefunden werden."
    
    Exit Function
  End If
    
    ReadReg = Left$(TmpSNum, InStr(1, TmpSNum, vbNullChar) - 1)

  ' Schlüssel wieder schliessen
  RetVal = RegCloseKey(hKey)
End Function

Private Sub Class_Initialize()
Dim TmpRetStr As String * 1280
Dim RetVal As Long

    Pfad = ReadReg

    RetVal = GetPrivateProfileString("Notes", "MailFile", "Fehler", TmpRetStr, Len(TmpRetStr), Pfad)

    If RetVal > 0 Then MailFile = Left$(TmpRetStr, RetVal)

End Sub

Public Sub SendNotesMail(Subject As String, Attachment As String, BodyText As String, SaveIt As Boolean, ParamArray Recipient() As Variant)
'Variablen Dimensionieren, die benötigt werden, um das Mail zu senden
    Dim Maildb As Object  'Die Datenbank
    Dim UserName As String 'Der Benutzername
    Dim MailDoc As Object  'Das Maildokument selbst
    Dim AttachME As Object  'Der Anhang (Richtext)
    Dim Session As Object 'Die Notes Session
    Dim EmbedObj As Object  'Ein eingebettetes Objekt (Anhang)
    Dim Adressen() as Variant
    
    Adressen=Recipient

    'Die Session starten
    Set Session = CreateObject("Notes.NotesSession")
       
    'Datenbank öffnen
    Set Maildb = Session.GETDATABASE("", MailFile)
     If Maildb.IsOpen = True Then
          'Fertig zum mailen!
     Else
         Maildb.OPENMAIL
     End If
     
    'Ein neues Maildokument erstellen
    Set MailDoc = Maildb.CREATEDOCUMENT
    MailDoc.Form = "Memo"
    MailDoc.sendto = Recipient(0)
    MailDoc.Subject = Subject
    MailDoc.body = BodyText
    MailDoc.SAVEMESSAGEONSEND = SaveIt
    
    'Eingebettete Objekte und Anhänge hinzufügen
    If Attachment <> "" Then
        Set AttachME = MailDoc.CREATERICHTEXTITEM("Attachment")
        Set EmbedObj = AttachME.EMBEDOBJECT(1454, "", Attachment, "Attachment")
        'MailDoc.CREATERICHTEXTITEM ("Attachment")
    End If
    
    'Senden
    MailDoc.PostedDate = Now()
    MailDoc.SEND 0, Adressen
    
    'Aufräumen
    Set Maildb = Nothing
    Set MailDoc = Nothing
    Set AttachME = Nothing
    Set Session = Nothing
    Set EmbedObj = Nothing
End Sub

Warum so umständlich? Ganz einfach: Lotus speichert in der Registry den Pfad zur Benutzerdefinierten INI-Datei, in welcher der korrekte Pfad zur NSF steht, und das ist eigentlich das, was ich brauche, deshalb: Erst in Registry gucken, wo die INI sitzt (ReadReg-Sub), dann hole den Pfad zur NSF aus der INI raus (RetVal = GetPrivateProfileString-Zeile in "Initialize"). (Fragt mich jetzt nicht, warum Lotus den Pfad zur NSF nicht in der Registry unter HKEY_CURRENT_USER speichert, weil da gehört das eigentlich hin!!)

Die MailDBName-Berechnung mit
Code:
MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf"
ist NICHT gut!
Was passiert, wenn ein Benutzer "Fritz Mueller" heisst, ein anderer "Frank Mueller"?
In beiden Fällen käme mit der Formel "fmueller.nsf" heraus, was aber nicht eindeutig in einer Mehrbenutzer-Umgebung ist. Deshalb die Registry/INI-Klimmzüge


ParamArray Recipient deshalb als Parameter-Array, weil ich immer min. 1 Empfänger brauche (-->Recipient(0)), Hierzu brauche ich aber vor Aufruf meiner Klassen-Methode SendNotesMail eine Plausibilitätsprüfung, dass Recipients mind. 1 Eintrag enthält. Wenn Recipients keinen Einträg enthält, wird die Klassen-Methode erst gar nicht aufgerufen. Wenn ich mehr habe, werden diese automatisch mitgegeben.
Fragt mich jetzt aber nicht, warum ich
Code:
Adressen=Recipient
machen muss. Der Code weigert sich "MailDoc.SEND 0, Recipient" direkt auszuführen

Desweiteren vermeide ich durch meine Variante dieses unsägliche "GoTo Fehler2"-Gedöns.

Kommentare hierzu?
 
Zuletzt bearbeitet:

mindsuk

Grünschnabel
@Zvoni

ich wollte gerade deine Variante testen, aber wenn ich in Excel Alt+F8 drücke, wird mir ihr nichts als Auswahl angezeigt? Da müsste doch SendNotesMail erscheinen...

Hast Du einen Tipp?

LG mindsuk


P.S: Hintergrund ist auch, das ich das ganze als Makro einer Grafik zuordnen möchte!
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Hinweis: Habe den ganzen Code in ein Klasse gesetzt, mit nur "SendNotesMail" als öffentlicher Methode, deshalb auch der "Initialize"-Code

Das Zauberwort heisst KLASSE

P.S.: Mittlerweile muss man den obigen Code sogar erweitern um
Visual Basic:
 RetVal = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Lotus\Notes\8.0", 0&, KEY_READ, hKey)

... da wir ja mittlerweile bei Lotus 8.5 sind.....
 

Zvoni

Erfahrenes Mitglied
Nachtrag: Die ReadReg-Funktion würde ich mittlerweile ein wenig anderst coden, und zwar mit dem Aufruf

Visual Basic:
 RetVal = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Lotus\Notes", 0&, KEY_READ, hKey)

und sich dann weiter durch die Registry hangeln. Hab jetzt aber keinen Bock drauf *gg*
 

mindsuk

Grünschnabel
Guten Morgen und Danke für Deine Antwort. Ich muss dann noch einmal weiter ausholen.

Ich habe ein Excel Sheet, welches ich zukünftig für meine Kunden als eine Art Bestellformular entworfen habe. Dort möchte ich zwei Buttons zum direkten versenden der Arbeitsmappe ohne Macros am Ende anbieten. Den ersten, zum versenden über Outlook habe ich erfolgreich erstellt und getestet. Nun versuche ich seit Tagen diesen für Lotus Notes zu basteln. Wenn ich in Excel Alt+F11 drücke, sehe ich das VBA Projekt und dort das Modul 1 mit dem Code für Outlook. Diesen konnte ich auch als Macho dem Button zuordnen.
Wie und wo muss ich jetzt Deinen Code einfügen, damit ich das ganze dem Lotus Notes Butten zuordnen kann? Ein weiteres Modul anlegen und den Code dort einfügen?

wäre super, wenn mir jemand helfen könnte..

mindsuk
 

Zvoni

Erfahrenes Mitglied
Punkt 1: Die Excel-Mappe, in welcher dein Button und demzufolge das Makro ist, per Mail ohne Makros verschicken ist nicht******!

An deiner Stelle, würde ich eher per Makro die ganzen relevanten Bestelldaten in ne Text-Datei schreiben, welche einem gewissen Satzaufbau folgt, und diese dann per E-Mail versenden.

Auf der Empfängerseite brauchst du dann nur noch ein Makro, was die ganze Datei ausliest, und du hast die Bestellung in sauberer Form vorliegen.

Punkt 2: Du musst im VB-Editor ein Klassenmodul (!!) einfügen, meinen Code komplett dort rein, dann schreibst du in deinem Modul 1 das Marko für den Lotus-Button, und aus diesem Makro heraus rufst du dann meine Klasse auf (Instanzierung nicht vergessen)
 

mindsuk

Grünschnabel
Hallo Zvoni, dazu kenne ich mich zu wenig mit der Materie aus!

Notfalls kann die Mappe auch mit Macros gesendet werden, mich würde es nicht stören. Mir würde auch ein Textfile reichen, ein erneutes demodelieren müsste für meinen Geschmack gar nicht sein, Hauptsache ich kann die Positionen lesen.

Ich habe kein Macro für den "Lotusbutto"n...das ist einfach ein GIF Symbol, welches ich verknüpfen möchte. Oder verstehe ich jetzt etwas falsch?

LG
 

Zvoni

Erfahrenes Mitglied
Um ein Makro zu triggern brauchst du einen Auslöser, welchem man ein Makro zuordnen kann.
Das sind meistens Steuerelemente, welche ein Click-Ereignis haben.

Wenn du da nur so ein Bildchen hast, solltest du einfach mal prüfen, ob du diesem Bild ein Makro zuweisen kannst (Ich arbeite nunmal auch in Excel nur mit "echten" Steuerelementen)

Falls ja, kann ich dir dann die Routine schreiben inkl. Klassenmodul etc.

Oder ich mach dir ne Beispiel-Excel-Mappe mit allen Funktionen drin.
 

mindsuk

Grünschnabel
Hallo Zvoni, da es mit dem anderen Gif funktioniert hat, sollte es gehen. Wenn ich mit der rechten Maustaste auf das Gif gehe und auf Makro zuweisen, dann bekomme ich aber leider nur das Makro für die Mail über Outlook angeboten, welches ich bereits dem anderen Gif hinterlegt habe.

Ich wäre Dir sehr dankbar, wenn Du mir da helfen könntest!!

Liebe Grüße