Warum Du das brauchst
Du willst Rechnungen, Serienmails oder Statusmeldungen direkt aus Access rausschicken?
Geht. Und zwar zuverlässig – auch mit Anhang.
Voraussetzung: Outlook ist installiert und läuft lokal.
Variante 1: Schnell und schmutzig – DoCmd.SendObject
Für einfache Textmails reicht das.
DoCmd.SendObject _
ObjectType:=acSendNoObject, _
OutputFormat:=acFormatTXT, _
To:="kunde@example.com", _
Subject:="Deine Rechnung", _
MessageText:="Hallo, anbei die Rechnung als PDF.", _
EditMessage:=False
Nachteile:
- keine HTML-Formatierung
- kein direkter Anhang (nur mit Objekten)
- kein CC/BCC zuverlässig steuerbar
Variante 2: Sauber per Outlook (classic) Automation
Hier hast Du volle Kontrolle über Format, Anhang, Signatur, Priorität.
1. Ohne Anhang – nur Text oder HTML
Public Sub MailSendenOhneAnhang()
Dim olApp As Object
Dim olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)
With olMail
.To = "kunde@example.com"
.Subject = "Willkommen"
.BodyFormat = 2 ' 2 = HTML
.HTMLBody = "<p>Moin,</p><p>Willkommen bei uns im System.</p><p>Gruß<br>Dein Team</p>"
.Send
End With
End Sub
2. Mit Anhang (PDF, Excel, was auch immer)
Public Sub MailSendenMitAnhang()
Dim olApp As Object
Dim olMail As Object
Dim pfad As String
pfad = "C:\Temp\Rechnung_12345.pdf"
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0)
With olMail
.To = "kunde@example.com"
.Subject = "Deine Rechnung"
.Body = "Hallo, im Anhang findest Du die aktuelle Rechnung."
.Attachments.Add pfad
.Send
End With
End Sub
Alternative: Als Entwurf speichern
Wenn Du erst prüfen willst, bevor die Mail rausgeht:
.Send ' ersetzt durch
.Display
Fehlerbehandlung nicht vergessen
On Error GoTo Fehler
' ...
.Send
Exit Sub
Fehler:
MsgBox "Fehler beim Senden: " & Err.Description
Tipps aus der Praxis
- Outlook-Sicherheitswarnung? → Trust Center prüfen oder mit einem zertifizierten Add-In arbeiten
- Signatur verwenden? →
.HTMLBody = DeineHTML & .HTMLBody
- Viele Mails auf einmal? → Abstände einbauen, z. B.
Sleep 500
zwischen.Send
Also
Du brauchst keine externe Bibliothek, keinen SMTP-Client.
Wenn Outlook läuft, kannst Du direkt loslegen.
Und wenn Du willst, baust Du Dir ein ganzes Serienmail-System – mit Logging, Retry und Anhang nach ID.
Wenn Du willst, zeig ich Dir auch das.
Profi-Variante: Outlook-Automation mit Redemption
Wenn Du Outlook-Sicherheitswarnungen umgehen willst (z. B. bei .Send
, .To
, .Body
), führt kaum ein Weg an Redemption vorbei.
Redemption ist eine COM-Bibliothek, die direkten Zugriff auf MAPI bietet – ohne dass Outlook „bimmelt“.
Vorteile:
- Kein Sicherheits-Prompt bei
.Send
- Zugriff auf gespeicherte Mails, Anhänge, Kontakte
- Auch für automatisierte Prozesse im Hintergrund nutzbar
Beispiel mit Redemption (verkürzt)
Dim olApp As Object
Dim mailItem As Object
Dim safeMail As Object
Set olApp = CreateObject("Outlook.Application")
Set mailItem = olApp.CreateItem(0)
Set safeMail = CreateObject("Redemption.SafeMailItem")
safeMail.Item = mailItem
With safeMail
.To = "kunde@example.com"
.Subject = "Automatisierte Mail"
.Body = "Moin – ganz ohne Prompt."
.Send
End With
Wichtig:
- Die DLL muss registriert sein (
redemption.dll
) - Kommerzielle Lizenz für produktiven Einsatz erforderlich
- Ideal für Batch-Mails, stille Verarbeitung, Hintergrundjobs
Wenn Du regelmäßig größere Mailmengen versendest, ist Redemption Dein Werkzeug.
Sauber, schnell, sicher – und Outlook sagt kein Wort.
Hinweis: Automatisierung funktioniert nur mit Outlook Classic (Win32)
Die gesamte Outlook-Automatisierung per VBA – ob mit oder ohne Redemption – setzt zwingend Outlook in der klassischen Desktop-Version (Win32) voraus.
Outlook (neu), also die moderne UWP/WebView-basierte Version, die Microsoft aktuell verteilt, unterstützt keine COM-Automatisierung mehr.
Wenn Du dort versuchst, über VBA oder CreateObject("Outlook.Application")
Mails zu erzeugen, bekommst Du nur Fehlermeldungen – oder gar nichts.
Empfehlung:
- In der Office-Installation „Outlook (Classic)“ aktiv halten
- Die neue Version in den Optionen deaktivieren (oder via Gruppenrichtlinie)
- Bei neuen PCs prüfen, was installiert ist – sonst geht Dein Access-Mailversand baden
Wenn Du die Automatisierung stabil brauchst, gilt: Kein Classic – kein Code.
Alternative: Mailversand direkt aus dem SQL Server
Wenn Du ohnehin mit SQL Server arbeitest und auf Outlook verzichten willst, kannst Du E-Mails auch direkt aus dem SQL Server versenden – per sp_send_dbmail
.
Dazu musst Du Database Mail aktivieren und ein passendes SMTP-Konto einrichten.
Das funktioniert unabhängig von Outlook und auch automatisiert aus Jobs oder Triggern.
Beispiel (T-SQL):
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'StandardMailProfil',
@recipients = 'kunde@example.com',
@subject = 'Statusmeldung',
@body = 'Dein Import war erfolgreich.',
@body_format = 'HTML';
Vorteile:
- Kein Outlook notwendig
- Läuft auf dem Server, auch ohne Benutzeranmeldung
- Ideal für Reports, Alarme, Nachtverarbeitung
Voraussetzungen:
- SQL Server Agent aktiv
- SMTP-Verbindung konfiguriert
- passendes Mail-Profil (einmalig einrichten)
Wenn Du Access und SQL kombinierst, kannst Du die E-Mail-Erstellung in Access machen – und den Versand dem SQL Server überlassen.
Robust, planbar und unabhängig vom Client.
Alternative: E-Mails aus Access direkt per SMTP verschicken
Wenn Du unabhängig von Outlook und SQL Server bleiben willst, kannst Du Mails auch direkt per SMTP aus Access über VBA versenden.
Dazu brauchst Du eine Bibliothek oder ein ActiveX-Objekt – z. B. CDO (Collaboration Data Objects), das in Windows oft schon vorinstalliert ist.
Damit sendest Du Mails direkt über einen SMTP-Server – wie z. B. smtp.office365.com oder smtp.gmail.com.
Beispiel mit CDO:
Public Sub SendeMailPerSMTP()
Dim msg As Object
Set msg = CreateObject("CDO.Message")
With msg
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "dein@mail.de"
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "deinPasswort"
.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Configuration.Fields.Update
.To = "kunde@example.com"
.From = "dein@mail.de"
.Subject = "Test per SMTP"
.TextBody = "Diese Mail wurde direkt aus Access per SMTP verschickt."
.Send
End With
End Sub
Vorteile:
- Outlook-unabhängig
- Läuft auch auf Terminalservern oder Headless-Systemen
- Ideal für einfache, automatische Mailbenachrichtigungen
Beachten:
- Absender muss SMTP-Login besitzen
- Viele Provider (z. B. Google, Microsoft) verlangen App-Passwörter oder OAuth2
- Kein Zugriff auf Outlook-Signatur oder Kalender
Wenn Du volle Kontrolle willst und keine Outlook-Abhängigkeit brauchst, ist SMTP per CDO eine schlanke Lösung – besonders für automatische Prozesse aus Access.
No responses yet