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.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert