Lektionen/Automation

E-Mails mit Outlook versenden

Fortgeschritten10 Min. Lesezeit

Rechnungen als PDF verschicken, Erinnerungen an säumige Kunden, eine Mail nach dem Speichern eines Datensatzes — all das kannst du direkt aus Access anstoßen. Zwei Wege führen zum Ziel: die schnelle DoCmd.SendObject-Methode und die volle Automation über das Outlook-Objektmodell. Diese Lektion zeigt beide, mit dem Schwerpunkt auf Outlook, weil du damit HTML, mehrere Anhänge und individuelle Empfänger kontrollierst.

Das Outlook-Objektmodell

Wie bei Excel steuerst du Outlook über sein Objektmodell. An der Spitze steht die Outlook.Application, darunter erzeugt CreateItem einzelne Elemente — für eine E-Mail ein MailItem. Dieses MailItem hat Eigenschaften wie To, Subject und Body und Methoden wie Send oder Display.

Early Binding vs. Late Binding

Auch hier gibt es die zwei bekannten Wege. Mit Early Binding setzt du im VBE unter Extras → Verweise die Microsoft Outlook xx.x Object Library und bekommst IntelliSense sowie die Konstante olMailItem:

Dim olApp As Outlook.Application
Set olApp = New Outlook.Application
Dim mail As Outlook.MailItem
Set mail = olApp.CreateItem(olMailItem)

Mit Late Binding brauchst du keinen Verweis. Der Datentyp ist Object, und olMailItem musst du durch seinen Zahlenwert 0 ersetzen:

Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
Dim mail As Object
Set mail = olApp.CreateItem(0)   ' 0 = olMailItem

Empfehlung: Entwickle mit Early Binding (IntelliSense, Konstanten) und stelle für die Auslieferung auf Late Binding um, wenn deine Nutzer unterschiedliche Outlook-Versionen haben. Bei Late Binding merkst du dir olMailItem = 0.

Eine Mail erzeugen und anzeigen

Das folgende Beispiel nutzt Late Binding, setzt die wichtigsten Felder und öffnet die Mail zur Kontrolle mit Display — der Nutzer klickt dann selbst auf Senden.

Public Sub MailAnzeigen()
    Dim olApp As Object
    Dim mail As Object

    Set olApp = CreateObject("Outlook.Application")
    Set mail = olApp.CreateItem(0)          ' olMailItem

    With mail
        .To = "kunde@example.com"
        .CC = "buchhaltung@meinefirma.de"
        .Subject = "Ihre Rechnung Nr. 2026-042"
        .Body = "Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf & _
                "anbei erhalten Sie Ihre Rechnung." & vbCrLf & _
                "Mit freundlichen Grüßen"
        .Display                            ' Fenster öffnen, nicht senden
    End With

    Set mail = Nothing
    Set olApp = Nothing
End Sub

Mehrere Empfänger trennst du mit Semikolon: .To = "a@x.de; b@y.de".

HTML-Body und Anhänge

Für formatierte Mails nutzt du HTMLBody statt Body. Setze immer nur eines von beiden — der zuletzt gesetzte Wert gewinnt. Anhänge fügst du über Attachments.Add mit einem Dateipfad hinzu:

Public Sub MailMitAnhang()
    Dim olApp As Object
    Dim mail As Object

    Set olApp = CreateObject("Outlook.Application")
    Set mail = olApp.CreateItem(0)

    With mail
        .To = "kunde@example.com"
        .Subject = "Rechnung 2026-042"
        .HTMLBody = "<p>Guten Tag,</p>" & _
                    "<p>anbei Ihre Rechnung als <b>PDF</b>.</p>" & _
                    "<p>Freundliche Grüße<br>Muster GmbH</p>"
        .Attachments.Add "C:\Rechnungen\2026-042.pdf"
        .Display
    End With

    Set mail = Nothing
    Set olApp = Nothing
End Sub

Attachments.Add erwartet einen gültigen, vollständigen Dateipfad — existiert die Datei nicht, gibt es einen Laufzeitfehler. Prüfe bei generierten Dateien vorher mit Dir(), ob sie da ist.

Display vs. Send

Der entscheidende Unterschied für die Praxis:

MethodeVerhaltenWann nutzen
.Displayöffnet das Mailfenster, Nutzer sendet selbstwenn ein Mensch prüfen soll
.Sendverschickt sofort ohne Rückfragefür Massenversand / Automatik
.Send          ' geht sofort raus

Send legt die Mail in den Postausgang; ob sie sofort übertragen wird, hängt von Outlooks Sende-/Empfangseinstellungen ab. Für unbeaufsichtigte Läufe ist Send richtig, für alles mit Kontrollbedarf Display.

Das Sicherheits-Popup

Beim programmatischen Zugriff auf .To, .Body oder besonders beim .Send kann Outlook ein Sicherheitswarnung-Popup zeigen („Ein Programm versucht, eine E-Mail-Nachricht in Ihrem Namen zu senden"). Das ist der sogenannte Outlook Object Model Guard und soll Makroviren bremsen.

Wichtig: In modernen Outlook-Versionen mit aktivem, aktuellem Virenscanner erscheint das Popup meist nicht mehr. Umgehen lässt es sich nicht sauber aus VBA — verlässliche Wege sind ein aktueller Virenscanner, Ausführung im vertrauenswürdigen Kontext oder der Umstieg auf reines SMTP (z. B. per CDO), das ganz ohne Outlook auskommt.

Die einfache Alternative: DoCmd.SendObject

Wenn du keinen HTML-Body und keine externen Anhänge brauchst — oder genau ein Access-Objekt (Bericht, Tabelle, Abfrage) mitschicken willst —, reicht DoCmd.SendObject ganz ohne Automation:

DoCmd.SendObject _
    ObjectType:=acSendReport, _
    ObjectName:="rptRechnung", _
    OutputFormat:=acFormatPDF, _
    To:="kunde@example.com", _
    Subject:="Ihre Rechnung", _
    MessageText:="Anbei Ihre Rechnung als PDF.", _
    EditMessage:=True

Der Parameter EditMessage:=True öffnet die Mail zur Kontrolle (wie Display), False sendet direkt. Der große Vorteil: SendObject exportiert einen Bericht automatisch als PDF und hängt ihn an — das ist für Rechnungen oft der kürzeste Weg.

Die Grenzen von SendObject: nur ein Anhang (das Access-Objekt), kein HTML, keine freie Wahl beliebiger Dateien als Anhang. Sobald du das brauchst, ist die Outlook-Automation der richtige Weg.

Zusammengefasst

  • Outlook-Automation läuft über Outlook.ApplicationCreateItem(olMailItem) bzw. CreateItem(0) bei Late Binding.
  • Setze To, Subject und entweder Body (Text) oder HTMLBody (formatiert); Anhänge über Attachments.Add "Pfad".
  • .Display zeigt die Mail zur Kontrolle, .Send verschickt sofort — für Automatik Send, für Prüfung Display.
  • Beim programmatischen Senden kann das Outlook-Sicherheits-Popup erscheinen; sauber umgehen lässt es sich nur über Virenscanner oder reines SMTP/CDO.
  • Für einfache Fälle mit genau einem Access-Objekt als PDF ist DoCmd.SendObject der kürzeste Weg ganz ohne Automation.
Nächste Lektion
Word aus Access: Serienbriefe