Last Update: 2024 - 05 - 21 |
EinleitungMit 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 versendenEine 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 versendenZusä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 versendenBeim 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 MakroAuch 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. Voraussetzungen und Vor- / NachteileVoraussetzung für diese Art des Emailversands ist ein MAPI1-kompatibler Mailclient auf dem jeweiligen Rechner. Vorteile
Nachteile
Bekannte ProblemeHinweis: 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 Email mit Outlook-Automation erstellen und versendenEin 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 versendenDie 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 versendenEine 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 versendenWenn 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 erstellenEine 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 versendestFollow-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 Serienmails mit Microsoft Access, VBA und OutlookIn 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 Rekursion in VBA - Beispiel: Auslesen der Outlook OrdnerhierarchieRekursion ist eine mächtige Programmiertechnik. In diesem Artikel erkläre ich die grundlegenden Konzepte und zeige wie man Rekursion in VBA implementiert am Beispiel des Auslesens der Outlook Ordnerhierarchie. Zurück zur Übersicht
Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen. © 1999 - 2024 by Philipp Stiefel - Datenschutzerklärung |