VBA Tipp: Outlook

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

  • Ich möchte eine E-Mail aus Access mit Hilfe von Outlook versenden.
  • Die E-Mail wird standardmäßig in Outlook geöffnet. Alternativ kann sie auch sofort versandt werden, ohne sie vorher zu öffnen.
  • Alternativ kann ein Anhang angefügt werden. Mehrere Anhang-Dateipfade werden mit einem Strichpunkt getrennt.

Lösung

Das geht mit folgender Prozedur, die in einem globalen Modul hinterlegt wird.

Public Sub MailversandOutlook(Empfaenger As String, _
                              Betreff As String, _
                              Nachricht As String, _
                              Optional ByVal AlsHTML As Boolean, _
                              Optional ByVal SofortSenden As Boolean, _
                              Optional Anhaenge As String)
 
   'Late-Binding-Variante, kein Verweis auf Microsoft Outlook xx.x Object Library notwendig
 
   'Quelle: www.dbwiki.net oder www.dbwiki.de
 
   Const olMailItem    As Long = 0
   Const olFormatPlain As Long = 1
   Const olFormatHTML  As Long = 2
 
   Dim objApp          As Object   'Outlook Application
   Dim objItem         As Object   'Outlook.MailItem
   Dim strArr()        As String
   Dim varElement      As Variant
 
   On Error Resume Next
 
   Set objApp = GetObject(, "Outlook.Application")
   If Err.Number <> 0 Then
      Err.Clear
      'Erzeugen einer neuen Outlook-Instanz
      Set objApp = CreateObject("Outlook.Application")
   End If
 
   'Outlook ist nicht installiert
   If Err.Number <> 0 Then Err.Raise Err.Number
 
   'Erzeugen einer Mail-Nachricht
   Set objItem = objApp.CreateItem(olMailItem)
 
   'Empfänger
   objItem.To = Empfaenger
 
   'Betreff
   objItem.Subject = Betreff
 
   'Nachricht im HTML-Format
   If AlsHTML Then
      objItem.BodyFormat = olFormatHTML
      objItem.HTMLBody = Nachricht
 
   Else  'Nachricht im Plaintext-Format
      objItem.BodyFormat = olFormatPlain
      objItem.Body = Nachricht
   End If
 
   'Anhänge anfügen
   If Len(Anhaenge) > 0 Then
      strArr = Split(Anhaenge, ";")
      For Each varElement In strArr
         objItem.Attachments.Add varElement
      Next
   End If
 
   'Mail sofort versenden, ohne Outlook zu öffnen
   If SofortSenden Then
      objItem.Send
   Else   'Mail in Outlook anzeigen, anschließend manuell versenden
      objItem.Display
   End If
 
End Sub

Aufruf

   Dim strAnhang        As String
   Dim strEmpfänger     As String
   Dim strBetreff       As String
   Dim strNachricht     As String
   Dim strHTMLNachricht As String
 
   'Pfad und Name des Dateianhangs
   strAnhang = CurrentProject.Path & "\" & "Rechnung.pdf"
 
   'Alternativ: mehrere Dateianhänge, einzelne Pfade mit Trennzeichen ";" trennen
   'Beispiel:
   'strAnhang = CurrentProject.Path & "\ErsterAnhang.pdf"
   'strAnhang = strAnhang & ";" & CurrentProject.Path & "\ZweiterAnhang.txt"
 
   'Mailadresse des Empfängers (mehrere Mailadressen mit ; trennen)
   strEmpfänger = "hans.mustermann@t-online.de"
 
   'Mail-Betreff
   strBetreff = "Ihre Rechnung"
 
   'entweder Beispiel für normale Textnachricht
   strNachricht = "Sehr geehrter Kunde, " & vbCrLf & vbCrLf
   strNachricht = strNachricht & "anbei finden Sie die Rechnung zur Ihrer Bestellung." & vbCrLf & vbCrLf
   strNachricht = strNachricht & "Viele Grüße"
 
   'oder alternativ Beispiel für HTML-Textnachricht (ggf. mit einem HTML-Editor erzeugen)
   strHTMLNachricht = "<html>"
   strHTMLNachricht = strHTMLNachricht & "<p>Sehr geehrter Kunde, <br /><br />"
   strHTMLNachricht = strHTMLNachricht & "anbei finden Sie die Rechnung zur Ihrer Bestellung.<br /><br />"
   strHTMLNachricht = strHTMLNachricht & "Viele Grüße</p>"
   strHTMLNachricht = strHTMLNachricht & "</html>"
 
 
   'Versand-Beispiele:
   'Beispiel 1: Mail öffnen, mit normaler Textnachricht
   Call MailversandOutlook(strEmpfänger, strBetreff, strNachricht)
 
   'Beispiel 2: Mail mit Anhang öffnen, mit normaler Textnachricht
   Call MailversandOutlook(strEmpfänger, strBetreff, strNachricht, , , strAnhang)
 
   'Beispiel 3: Mail mit Anhang sofort versenden, mit normaler Textnachricht
   Call MailversandOutlook(strEmpfänger, strBetreff, strNachricht, , True, strAnhang)
 
   'Beispiel 4: Mail mit Anhang sofort versenden, mit HTML-Textnachricht 
   Call MailversandOutlook(strEmpfänger, strBetreff, strHTMLNachricht, True, True, strAnhang)


Wiki hinweis.png

Anmerkung: Einige Outlook-Versionen (vermutlich Outlook 2000 bis Outlook 2003), nämlich solche, die mit dem Security-Update ausgestattet wurden, lassen bei Zugriff mit diesem Code erst die Meldung erscheinen: "Soll der Zugriff durch ein externes Programm zugelassen werden?", was sich auch nicht abschalten lässt.

Es gibt mit dem Zusatztool ClickYes jedoch die Möglichkeit, dies zu unterbinden (siehe auch unter Weblinks: Umgehen der Sicherheitsabfrage in bestimmten Outlook-Versionen).


Alternative Lösung: SendObject-Methode

Versand einer E-Mail über das Standard-Mailprogramm mit der SendObject-Methode.
Definition der Parameter: siehe Aufruf oben

Einschränkungen bei der SendObject-Methode:

  • Der E-Mail-Text muss im Plain-Text-Format vorliegen. Das HTML-Format wird nicht unterstützt.
  • Als Anhang kann nur ein Access-Objekt, aber keine beliebige Datei versandt werden.

Aufruf

   'Beispiel 1: Mail im Mailprogramm öffnen
   'Falls der Mailversand abgebrochen wird, muss der Fehler 2501 abgefangen werden
   On Error GoTo Err_SendObject
 
   DoCmd.SendObject acSendNoObject, , , strEmpfänger, , , strBetreff, strNachricht, True
 
Exit_SendObject:
   Exit Sub
 
Err_SendObject:
   'Fehler 2501 abfangen, wird beim Abbrechen des Mailversands ausgelöst
   If Err.Number <> 2501 Then
      MsgBox "Laufzeitfehler '" & Err.Number & "':" & vbCrLf & vbCrLf & Err.Description
   End If
   Resume Exit_SendObject
 
 
   'Alternativ:
   'Beispiel 2: Mail sofort versenden
   'Nachteil beim sofortigen Versenden über Outlook:
   'Outlook blendet eine Sicherheitsmeldung ein, die vom Benutzer bestätigt werden muss.
   DoCmd.SendObject acSendNoObject, , , strEmpfänger, , , strBetreff, strNachricht, False


Wikilinks

Weblinks