Anzeige

Mail via Lotus Notes versenden


B

bullayer

#1
Hallo,
ich suche eine Möglichkeit, via VB 6.0 und Lotus Notes eine Mail mit Anhang zu versenden. Hat jemand Beispielcodes, wie man sowas bewerkstelligen kann?
 

Jacka

Erfahrenes Mitglied
#2
Hi!

Hier ist mein Code den ich verwende (Client muss geöffnet sein):
Code:
Public Sub SendNotesMail()

Dim Subject As String, attachment As String, bodytext As String, saveit As Boolean
Dim ToAdressen(10) as String

'Achtung! Der Notes Client muss auf dem System installiert sein!

    Dim Maildb As Object 'Die Datenbank
    Dim UserName As String 'Der Benutzername
    Dim MailDbName As String 'Der Datenbankname
    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 Recip(2) As Variant
    Dim LinkME As Object
    Dim testlink As String
     
    Subject = xpText4.Text
    bodytext = xpText5.Text
    attachment = AppPfad & "\Links.xls"
            
    'Die Session starten
    Set Session = CreateObject("Notes.NotesSession")

 On Error GoTo Fehler:
    'Den Benutzernamen auslesen und den Dateinamen
    'der MailDB errechnen
    'Dies wird nicht überall benötigt. Auf manchen
    'Systemen kann auch ein leerer String übergeben werden
    UserName = Session.UserName
    MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf"
    
    'Datenbank öffnen
    Set Maildb = Session.GetDatabase("", MailDbName)
     If Maildb.IsOpen = True Then
     Else
         Maildb.OPENMAIL
     End If
     
    'Ein neues Maildokument erstellen
    Set MailDoc = Maildb.CreateDocument
    MailDoc.Form = "Memo"
    MailDoc.sendto = Recip
    MailDoc.Subject = Subject
    MailDoc.body = bodytext
    MailDoc.SaveMessageOnSend = True
       
    '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()

If ToAdressen(1) = "" Then
    MsgBox "Please enter recipients!"
    GoTo Fehler2
Else
    MailDoc.Send 0, ToAdressen
    MsgBox "Message transmitted"
    GoTo Fehler2
End If
    
    'Aufräumen
    Set Maildb = Nothing
    Set MailDoc = Nothing
    Set AttachME = Nothing
    Set Session = Nothing
    Set EmbedObj = Nothing
        
Fehler:
    MsgBox "Please open your Lotus Notes client!"
    Exit Sub

Fehler2:
    Exit Sub
        
End Sub
Oder unter den folgende Link schauen:
http://www.activevb.de/tipps/vb6tipps/tipp0544.html

Viele Grüße,
Jacka
 
B

bullayer

#3
Danke @Jacka, funktioniert.

Kennst Du auch ne Möglichkeit, ne Mail zu versenden, ohne dass ein Mailclient installiert ist, z. Bsp. via WEB.DE
 
Zuletzt bearbeitet von einem Moderator:

Alex F.

Erfahrenes Mitglied
#4
es gibt die möglichkeit mails mittels ie (hierzu kann man die adressenleiste irgendwie misbrauchen) zu versenden oder auch mit der vbsendmail von activevb.

Bei der Möglichkeit über den ie ist es wohl nicht möglich anhänge mit zu senden. Deswegen ist die VBsendmail eleganter
 
#7
Frage an Jacka:

Hallo und guten Tag,
bin unter den Laien einer der Größten. Ich kupfere immer nur ab, was andere irgendwie veröffentlicht haben, wenn ich es gebrauchen kann. Habe aber kaum Ahnung mit diesen ganzen Programmierbefehlen: Kurz um: Habe diesen Link aus einem Excel-Forum bekommen: Wir haben auf der Maloche Excel2003 und LotusNotes 6.5.5

Habe naiv das Programm von Jacka in VBA Excel-Datei eingesetzt. Leider läuft es gar nicht. Muss ich irgendwo für Platzhalter, die im Programm vielleicht stehen, etwas anderes einsetzen'?

Wenn ich das Makro starten will dann kommt gleich der Fehler:
Fehler beim Kompilieren: Variable nicht definiert. Angezeigt wird dann z.B. text1 hinter dem Untermakro SendNotesMail.

Ich hatte ja gehofft, dass den Code einfach bei mir einspiele und ich dann sofort in der Lage wäre, die entsprechende Excel-Seite als E-Mail versenden zu können.

Kann da einem Unbedarften wie mir noch geholfen werden. Oder ist das für mich nicht darstellbar?

Einen schönen Tag noch
wünscht der
Rhinowsurfer
 

Jacka

Erfahrenes Mitglied
#9
Hi!

Hab die Frage erst jetzt gesehen :D

Also:

Du benötigst für die Ausführung des Codes noch etwas:
In Excel:
Code:
    .....   
    Subject = Textbox1.Text   '  ist der Inhalt aus einer Textbox und ergibt den Betreff
    bodytext = Textbox2.Text  '  ist der Inhalt aus einer weiteren Textbox und ergibt den   
                                             email-Text
    attachment = "C:\Liste.xls"  '  Die Excelliste die mit verschickt werden soll
    .....
    MailDoc.Send 0, ToAdressen  '  ToAdressen ist ein Array und enthält eben die  
                                                  Empfänger-Adressen
Du kannst auch einfach Subject = "Dies ist der Betreff" schreiben
Und:
ToAdressen(0) = "abc@emailadresse.com"
ToAdressen(1) = "xyz@emailadresse.com"

Du hast sicher AppPfad nicht definiert. Ist bei mir eine public variable und
definiert den Pfad, wo sich dann die EXE befinden.
Das könnte deine Fehlermeldung erklären.

Hoffe das hilft!
Sonst schreib nochmal! :)

Viele Grüße,
Jacka
 
#10
Hallo Jacka,

habe Probleme!
Habe Code, wie unten, eingegeben. Code läuft über Fehlerroutine aus.
Das System erkennt Lotus nicht.
Laienfrage von mir:
Muss ich beim Start der Session
Set session=createObject("Notes.NotesSession") :confused:
in der Klammer 'was anderes eingeben?
Beim schrittweisen Ablauf wird schon nichts in SESSION hineingeschrieben!

Der UserName ist aber richtig gefüllt.(!)
----------
ICh hatte mich ja als Laie und Abkupferer geoutet, also nicht böse sein, wenn die Frage auf unterem Niveau ist. ICh würde mich aber trotzdem freuen, wenn ich das mit Hilfe anderer hinbekommen würde. Denn nichts ist schöner, als hilfreiche Technik am Arbeitsplatz. Schönen Maifeiertag wünscht der Rhinowsurfer!



Public Sub SendNotesMail()

Dim Subject As String, attachment As String, bodytext As String, saveit As Boolean
Dim ToAdressen(10) As String

'Achtung! Der Notes Client muss auf dem System installiert sein!

Dim Maildb As Object 'Die Datenbank
Dim UserName As String 'Der Benutzername
Dim MailDbName As String 'Der Datenbankname
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 Recip(2) As Variant
Dim LinkME As Object
Dim testlink As String

' Subject = xpText4.Text
' bodytext = xpText5.Text
' attachment = AppPfad & "\Links.xls"
Subject = "Dies ist der Betreff"
bodytext = "E-Mail-Text"
attachment = "U:\ABLAGE\BOC1\BOC15\4455\HV\WVS-Listen.xls"


'Die Session starten
Set Session = CreateObject("Notes.NotesSession")

On Error GoTo Fehler:
'Den Benutzernamen auslesen und den Dateinamen
'der MailDB errechnen
'Dies wird nicht überall benötigt. Auf manchen
'Systemen kann auch ein leerer String übergeben werden
UserName = Session.UserName
MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf"

'Datenbank öffnen
Set Maildb = Session.GetDatabase("", MailDbName)
If Maildb.IsOpen = True Then
Else
Maildb.OPENMAIL
End If

'Ein neues Maildokument erstellen
Set MailDoc = Maildb.CreateDocument
MailDoc.Form = "Memo"
MailDoc.sendto = Recip
MailDoc.Subject = Subject
MailDoc.body = bodytext
MailDoc.SaveMessageOnSend = True

'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()

If ToAdressen(1) = "" Then
MsgBox "Please enter recipients!"
GoTo Fehler2
Else
MailDoc.Send 0, ToAdressen
MsgBox "Message transmitted"
GoTo Fehler2
End If

'Aufräumen
Set Maildb = Nothing
Set MailDoc = Nothing
Set AttachME = Nothing
Set Session = Nothing
Set EmbedObj = Nothing

Fehler:
MsgBox "Please open your Lotus Notes client!"
Exit Sub

Fehler2:
Exit Sub

End Sub
 

Zvoni

Erfahrenes Mitglied
#11
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:
#13
@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
#14
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
#15
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*
 
#16
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
#17
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)
 
#18
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
#19
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.
 
#20
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
 
Anzeige

Neue Beiträge

Anzeige