E-Mails direkt aus Access versenden – mit und ohne Anhang

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.

Schlagwörter: