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 500zwischen.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.