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
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
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
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?
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"
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
Desweiteren vermeide ich durch meine Variante dieses unsägliche "GoTo Fehler2"-Gedöns.
Kommentare hierzu?
Zuletzt bearbeitet: