Language: Deutsch English















Last Update: 2017 - 07 - 09





Access & Email

Inhalt

  • Einleitung
  • Email mit Docmd.SendObject bzw. SendenObjekt / EMailDatenbankobjekt versenden
  • Email mit Outlook-Automation erstellen und versenden
  • HTML-Emails mit Microsoft Access, VBA und Outlook-Automation versenden
  • Emails mit VBA und der CDO Bibliothek versenden
  • Eine Email mit VBA über Outlook mit einen bestimmten Account versenden
  • Email mit einem mailto-Hyperlink erstellen
  • Wie du Outlook Emails mit Follow-Up und Erinnerung mit VBA versendest
  • Datensatzherkunft eines Access 2010 PivotChart-Formulars mit VBA aendern
  • Serienmails mit Microsoft Access, VBA und Outlook



  • Einleitung

    Mit der Anbindung an das Internet, die inzwischen fast an jedem Arbeitsplatz selbstverständlich geworden ist, steigen auch die Anforderungen an Datenbank-Applikationen, von denen immer häufiger erwartet wird, dass sie direkt Schnittstellen zu verschiedenen Internetdienste bieten können.

    Wenn auch das Abrufen von Informationen aus Websites über HTTP oder das Bereitstellen von Daten über FTP bisher noch verhältnismäßig selten vorkommt, so ist der Versand von Emails inzwischen schon zu einer sehr häufig definierten Anforderung an Datenbank-Applikationen geworden.

    So vielfältig wie die Datenbankapplikation selbst sind auch die genauen Anforderungen an die Implementation einer Email-Schnittstelle. So reicht das Spektrum von dem gelegentlichen Versand einer Email an den Enwickler oder Administrator der Applikation, um Fehler zu melden oder technischen Support anzufordern, über den Versand von personalisierten Mailings bis hin zum vollautomatiserten Versand (und Empfang) von Emails zum Zweck des Datenaustauschs und/oder Reportings.

    Auf dieser Webseite möchte ich nun einen kurzen Überblick gewähren, welche Möglichkeiten man als Entwickler hat Email-Funktionalität in MS Access zu implementieren. Und welche Vor- und welche Nachteile die einzelnen Ansätze bieten.



    Zurück zur Übersicht

    Email mit Docmd.SendObject bzw. SendenObjekt / EMailDatenbankobjekt versenden

    Eine sehr einfache, aber dennoch effektive Möglichkeit um Emails aus Access heraus zu versenden, ist die Verwendung der SendObject-Methode des DoCmd-Objektes in der VBA-Programmierung. Diese Methode ermöglicht es, eine Email direkt in Access zu erstellen und die fertige Email im Standard-Mailclient des Rechners zu öffnen oder direkt in dessen Postausgang zum Senden zu platzieren.

    Auch mehrere Email-Empfänger können direkt im „An“ oder auch im „CC“ bzw. „BCC“ adressiert werden. Dazu einfach alle Empfänger-Adressen, mit Semikolon getrennt, hintereinander schreiben.

    Ein einfaches Beispiel:

    DoCmd.SendObject acSendNoObject, , , "jemand@irgendwo.invalid; andere.person@anderswo.invalid", , , _ "Email ohne Anhang", "Dies ist der Text der Email.", True

    Access-Objekte versenden

    Zusätzlich können beliebige Access-Objekte an die Email als Anlage angehängt werden. Dabei werden nicht die Access-eigenen Formate für die angehängten Access-Objekte verwendet, sondern die Objekte können in andere gängige Formate exportiert werden.

    Für den Versand von grafischen Access-Objekten (Formulare, Berichte) können zwar in älteren Access Versionen bis Access 2007 verbreitete Formate, wie HTML und RTF verwendet werden, aber dabei geht das Layout der Access Objekte weitgehend verloren. Erst ab Access 2010 wird auch das PDF-Format unterstützt, mit dem sich besonders Berichte mit ansprechender Optik versenden lassen.

    Das sollte in Access 2007 ebenfalls funktionieren, wenn man das Speichern unter – PDF Add-In von Microsoft installiert. - Ich selbst habe das aber nie probiert.

    Beispiel:

    DoCmd.SendObject acSendReport, "einBericht", acFormatPDF, "jemand@irgendwo.invalid", , , _ "Email mit Bericht", "Dies ist der Text der Email.", True

    Daten versenden

    Beim Versand von Daten (Tabellen und Abfragen) werden diese selbst im Plain-Text-Format als "optische" Tabellen exportiert. Dadurch wird es praktisch unmöglich gemacht, mit diesem Feature erstellte Dateien in andere Applikation zu importieren. Nur die Ausgabe von Tabellen und Abfragen in eine Excel-Datei ist dazu geeignet, um auf diesem Weg Daten für die maschinelle Weiterbearbeitung zu versenden. Seit Access 2007 werden dabei sowohl das klassische .xls-Format, als auch die mit Excel 2007 eingeführten, neuen Formate .xlsx (XML) und .xlsb (Binary) unterstützt.

    Beispiel:

    DoCmd.SendObject acSendQuery, "eineAbfrage", acFormatXLS, "jemand@irgendwo.invalid", , , _ "Email mit Abfrage als Excel-Datei", "Dies ist der Text der Email.", True

    Umsetzung in einem Makro

    Auch für VBA-Unkundige bietet sich dieses Feature als Lösung an, da es, wie alle DoCmd-Methoden, mit ähnlichem Funktionsumfang auch in einem Makro verwendet werden kann. In deutschen Access-Versionen heißt die Makro-Aktion SendenObjekt bzw. ab Access 2010 EMailDatenbankobjekt. Screenshot der EMailDatenbankobjekt Makro-Aktion

    Voraussetzungen und Vor- / Nachteile

    Voraussetzung für diese Art des Emailversands ist ein MAPI1-kompatibler Mailclient auf dem jeweiligen Rechner.

    Vorteile

    • Sehr einfache Umsetzung. Nur eine Zeile Code ist erforderlich.
    • Nur sehr geringe Abhängigkeit von weiterer Software (Mail-Client)

    Nachteile

    • Der Emailtext kann maximal 255 Zeichen lang sein und wird zwingend im Plain-Text-Format dargestellt.
    • Wenn die E-Mail direkt gesendet wird, muss bei einigen Mail-Clients (z.B. Outlook) der Zugriff in einer Sicherheitsmeldung explizit bestätigt werden.
    • Es kann nur ein einzelnes Access-Objekt mit einer Email versendet werden. Es ist nicht möglich andere Dateien zu versenden.

    Bekannte Probleme

    Hinweis: In Access 2000 ist durch einen Bug die Funktionalität der SendObject-Methode stark eingeschränkt. So ist es dort häufig nicht möglich, die SendObject-Methode mehrfach in einer Prozedur aufzurufen oder einen längeren Nachrichtentext zu versenden. Eine genauere Beschreibung des Problems, sowie möglicher Workarounds sind im Artikel Q260819 der MS Knowledgebase dokumentiert.

    Fussnoten: 1. MAPI - Messaging Application Programming Interface



    Zurück zur Übersicht


    Email mit Outlook-Automation erstellen und versenden

    Ein andere Möglichkeit Email-Funktionalität in eine Access-Anwendung zu integrieren ist es, MS Outlook über die MS Outlook Objektbibliothek zu automatisieren.

    Das folgende Codebeispiel soll darstellen, wie einfach eine Email über MS Outlook versendet werden kann.

    Public Sub sendMail()
    
        Dim myMail      As Outlook.MailItem
        Dim myOutlApp   As Outlook.Application
    
        ' Ein neue Outlook-Instanz und ein neues Mailitem erstellen
        Set myOutlApp = New Outlook.Application
        Set myMail = myOutlApp.CreateItem(olMailItem)
    
        With myMail
            ' Den Empfänger der Mail festlegen
            .To = "recipient@somewhere.invalid"
            ' Einen CC-Empfänger hinzufügen
            .CC = "other.recipient@somewhere.else.invalid"
            ' Den Betreff der Mail festlegen
            .Subject = "My first mail sent with Outlook-Automation"
            ' Text in die Mail einfügen
            .Body = "Hello dear friend, " & vbCrLf & vbCrLf & _
                    "This is my first mail produced and sent via Outlook-Automation." & _
                    vbCrLf & vbCrLf & "And now I will try add an attachment."
            ' Ein Attachment aus dem Dateisystem anhängen
            .Attachments.Add "c:\path\to\a\file.dat"
    
            ' Die Email abschicken
            .Send
            ' Anstatt die Email sofort zu senden, kann man auch die Display-Methode des
            ' Mailitems verwenden, um die Email anzuzeigen und sie vom Benutzer manuell
            ' verschicken zu lassen. 
    
        End With
    
        ' Die Outlook-Instanz beenden
        myOutlApp.Quit
    
        ' Objektvariablen zerstören und Speicher freigeben
        Set myMail = Nothing
        Set myOutlApp = Nothing
    
    End Sub
    

    Damit dieses Beispiel funktioniert, muss ein Verweis auf die Outlook Objektbibliothek gesetzt sein.

    Diese Methode der Emailintegration ist sehr einfach umzusetzen und verleiht dem Entwickler beinahe vollständige Kontrolle über nahezu alle gängigen Eigenschaften einer zu erstellenden Email, ohne dass er sich um die genaue Konfiguration der Emaileinstellungen in der Zielumgebung seiner Applikation kümmern muss.

    Ganz offensichtlich hat dieser Ansatz zur Emailintegration einen gewaltigen Nachteil. Es ist erforderlich, dass auf jeder Arbeitsstation, auf der die Emailfunktionalität genutzt werden soll MS Outlook installiert ist. - Nein, MS Outlook Express läßt sich nicht als Alternative verwenden.

    Mit ähnlichem Code, wie dem im Beispiel oben, haben sich zahlreiche bösartige Internet-Würmer und Viren quer durch das Web verbreitet und die Daten vieler naiver und unvorsichtiger User vernichtet. Um dem zukünftig vorzubeugen, hat Microsoft die Automationsfeatures von MS Outlook durch "Security-Fixes" beinahe bis zur totalen Nutzlosigkeit reduziert. Wenn diese "Security-Fixes" installiert sind, muss der User jeden Zugriff auf sein Adressbuch und jeden Versuch eine Email zu versenden durch einen Automationsprozess explizit bestätigen. Nach einer Bestätigung, darf ein Prozess für kurze Zeit auf diese Automationsfeatures zugreifen.



    Zurück zur Übersicht

    HTML-Emails mit Microsoft Access, VBA und Outlook-Automation versenden

    Die ausführliche Beschreibung, wie Du eine HTML-Email mit Access, VBA und Outlook-Automation erzeugen und versenden kannst findest Du unter dem Link. Der Artikel ist so umfangreich, dass er nicht in das Format dieser Seite hier passt.



    Zurück zur Übersicht

    Emails mit VBA und der CDO Bibliothek versenden

    Eine weitere Möglichkeit um Emails aus Access zu versenden, ist es mit VBA Code gegen die CDO-Bibliothek (Collaboration Data Objects) zu programmieren. Unter diesem Link findest du einen ausführlichen Artikel, der beschreibt wie man mit VBA und der CDO Bibliothek Emails versendet.



    Zurück zur Übersicht

    Eine Email mit VBA über Outlook mit einen bestimmten Account versenden

    Wenn Du eine Email mit VBA über Outlook versendest, wird immer der Standard-Email-Account verwendet. Manchmal ist es aber erforderlich diese Email über einen bestimmten Email-Account zu versenden.

    Das Outlook Mailitem hat zu diesem Zweck die Eigenschaft SendUsingAccount, der man ein Outlook Account Objekt zuweisen kann. Den richtigen Account möchte man üblicherweise anhand der Absender-Emailadresse ermitteln.

    Es ist wichtig zu verstehen, dass über diese Eigenschaft nicht einfach nur die Absenderadresse gesetzt wird, sondern dass alle Einstellungen zum Senden der Email von diesem Account verwendet werden, wie z.B. der Mailserver und der lokale Ordner um die Email zu speichern. Natürlich setzt es voraus, dass ein Account mit der gewünschten Absenderadresse vorher in Outlook konfiguriert wurde.

    Diese Funktion hier zeigt, wie man das einfach erreichen kann.

    Public Function GetAccountByEmail(ByRef outlApp As Outlook.Application, ByVal strSenderEmail As String) As Outlook.Account Dim acc As Outlook.Account Dim retVal As Outlook.Account For Each acc In outlApp.Session.Accounts If acc.SmtpAddress = strSenderEmail Then Set retVal = acc Exit For End If Next acc Set GetAccountByEmail = retVal End Function

    Diese Funktion kann man dann einfach mit den Code, um die Email zu erstellen und zu versenden, kombinieren. Ein kleines Beispiel dafür ist diese Prozedur.

    Public Sub SendMail() Dim myMail As Outlook.MailItem Dim myOutlApp As Outlook.Application ' Ein neue Outlook-Instanz und ein neues Mailitem erstellen Set myOutlApp = New Outlook.Application Set myMail = myOutlApp.CreateItem(olMailItem) With myMail ' Hier wird der Absender Account zugewiesen. myMail.SendUsingAccount = GetAccountByEmail(myOutlApp, "phil@codekabinett.com") ' Es ist zu beachten, dass man, obwohl man einen Objektverweise setzt, nicht ' das Set Schlüsselwort verwenden darf. - Warum ist mir allerdings ein Rästsel! ' Den Empfänger der Mail festlegen .To = "recipient@somewhere.invalid" ' Hier den Betreff, weitere Empfänger und den Text definieren ' Die Email abschicken .Send End With ' Die Outlook-Instanz beenden myOutlApp.Quit ' Objektvariablen zerstören und Speicher freigeben Set myMail = Nothing Set myOutlApp = Nothing End Sub

    Diese Prozedur ist ein verkürzter Auszug aus dem etwas umfangreicheren Beispiel, Email mit Outlook-Automation erstellen und versenden, dass du auch auf dieser Seite findest.

    Wenn Du ein wenig Erfahrung mit VBA Programmierung hast, sollte dir auffallen, dass in dem obigen Beispiel die Zeile zur Zuweisung des Accounts nicht lautet

    Set myMail.SendUsingAccount = GetAccountByEmail(myOutlApp, "phil@codekabinett.com")

    , wie es eigentlich richtig wäre. Es wird in dieser Zeile ein Objektverweise gesetzt. Dies bedingt in VBA eigentlich zwingend das Schlüsselwort Set. Warum dies hier nicht verwenden werden darf (es würde zu einem Laufzeitfehler führen), ist mir selbst leider auch nicht klar.



    Zurück zur Übersicht

    Email mit einem mailto-Hyperlink erstellen

    Eine weitere, sehr einfache, aber auch limitierte Methode, um aus Access heraus Emails zu erstellen, ist einen mailto-Hyperlink mit FollowHyperlink aufzurufen. Zwar sind die Möglichkeiten sehr eingeschränkt, aber dafür funktioniert dies selbst dann, wenn kein MAPI-kompatibler Mailclientinstalliert ist.



    Zurück zur Übersicht

    Wie du Outlook Emails mit Follow-Up und Erinnerung mit VBA versendest

    Follow-Up informationen für den Empfänger einer Email hinzuzufügen und eine Aufgabe für den Absender zu erstellen, kann einen Workflow mit automatisch erstellten Emails signifikant verbessern. Dieser Artikel zeigt wie du Email-Flags und Erinnerungen mit VBA-Code setzen kannst.



    Zurück zur Übersicht

    Datensatzherkunft eines Access 2010 PivotChart-Formulars mit VBA aendern

    Kurze Einführung wie du ein Formular in PivotChart-Ansicht zur Laufzeit mit VBA-Code steuern kannst. Inbesondere wie du die Datensatzherkunft eines Access-2010-PivotCharts zur Laufzeit mit VBA änderst.



    Zurück zur Übersicht

    Serienmails mit Microsoft Access, VBA und Outlook

    In diesem Artikel beschreibe ich die Funktionalität, um eine Serienemail aus Access mit Outlook zu versenden von Anfang bis Ende. Angefangen mit dem Speichern der Emailadressen in der Datenbank, über das Abfragen der Adressen und weiterer Daten bis zum Erstellen von individuellen Email-Texten und dem Versenden der Emails über deinen Outlook Email-Account, wird alles behandelt.



    Zurück zur Übersicht

    Abonniere meinen Newsletter

    *

    Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen.



    © 1999 - 2017 by Philipp Stiefel