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:
| Methode | Verhalten | Wann nutzen |
|---|---|---|
.Display | öffnet das Mailfenster, Nutzer sendet selbst | wenn ein Mensch prüfen soll |
.Send | verschickt sofort ohne Rückfrage | fü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.Application→CreateItem(olMailItem)bzw.CreateItem(0)bei Late Binding. - Setze
To,Subjectund entwederBody(Text) oderHTMLBody(formatiert); Anhänge überAttachments.Add "Pfad". .Displayzeigt die Mail zur Kontrolle,.Sendverschickt sofort — für AutomatikSend, für PrüfungDisplay.- 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.SendObjectder kürzeste Weg ganz ohne Automation.