Zusammenfassung
Sie erfahren, wie Sie mit VBA und Outlook E-Mails von Access aus versenden können.
Techniken
Access, VBA, Formulare, Outlook
Voraussetzungen
Access 2000 oder höher, Outlook 2000 oder höher
Beispieldateien
AccessUndOutlook2000.mdb (ab Access 2000)
André Minhorst, Duisburg
Dieser und die folgenden Beiträge zeigen einige Möglichkeiten, um von Access aus Outlook per VBA fernzusteuern und E-Mails zu versenden, anzuzeigen oder zu löschen. In diesem Beitrag starten Sie mit den wichtigsten Voraussetzungen und dem Versenden von E-Mails.
Voraussetzungen
In den folgenden Kapiteln werden Sie des öfteren per VBA-Code auf Outlook zugreifen. Dazu ist es natürlich notwendig, dass sich Outlook überhaupt auf dem Rechner befindet.
Außerdem benötigen Sie einen Verweis auf die Bibliothek Microsoft Outlook 11.0 Object Library. Diesen wählen Sie über den Dialog Verweise der VBA-Entwicklungsumgebung aus. Den Dialog öffnen Sie über den Menüeintrag Extras/Verweise.
E-Mails versenden
Das direkte Versenden von E-Mails aus einer Access-Anwendung heraus, ohne Outlook öffnen zu müssen, ist eine komfortable Geschichte – erst recht, wenn die Mail anschließend wie bei einer auf herkömmlichem Wege versendeten E-Mail im entsprechenden Outlook-Ordner landet.
Mit dem nachfolgend vorgestellten Quellcode öffnen Sie mit dem Formular aus Bild 1 den Outlook-Dialog zur Anzeige einer E-Mail und füllen die wichtigsten Felder der E-Mail automatisch aus (siehe Bild 2).
Bild 1: Beispielformular zum Aufrufen des Outlookschen E-Mail-Dialogs
Bild 2: Von Outlook bereitgestellter Dialog zum Versenden einer E-Mail
Das Formular ist als Beispiel bewusst einfach gehalten – es ist nicht an eine Tabelle gebunden und enthält nur die wichtigsten Informationen zum Versenden einer E-Mail.
Der interessanteste Teil des Formulars ist die Funktionalität der Schaltfläche cmdMailErstellen. Sie ruft die Prozedur aus Quellcode 1 auf.
Zum Fernsteuern von Outlook bedarf es dort gar nicht viel: Sie benötigen zwei Objektvariablen, um eine Outlook-Instanz und das zu erstellende Mail-Objekt zu referenzieren, und einige Eigenschaften und Methoden des Outlook-Objektmodells.
Quellcode 1: Anzeigen und füllen des E-Mail-Dialogs von Outlook
Private Sub cmdMailErstellen_Click() Dim objOutlook As Outlook.Application Dim objMail As Outlook.MailItem Set objOutlook = New Outlook.Application Set objMail = objOutlook.CreateItem(olMailItem) With objMail .To = Nz(Me.txtEMail, "") .Subject = Nz(Me.txtBetreff, "") .Body = Nz(Me.txtInhalt, "") .Display True End With objOutlook.Quit Set objOutlook = Nothing End Sub
Quellcode 2: Anlegen einer benutzerdefinierten Eigenschaft und suchen nach einer Mail mit dieser Eigenschaft im Ordner „Gesendete Objekte“
''Anlegen einer benutzerdefinierten Eigenschaft objMail.ItemProperties.Add _ "BenutzerdefinierteEigenschaft", olText objMail.ItemProperties("BenutzerdefinierteEigenschaft").Value _ = "Wert" ''Suchen nach einer E-Mail mit dieser benutzerdefinierten ''Eigenschaft For Each objMail In objFolder.Items On Error Resume Next If objMail.ItemProperties("BenutzerdefinierteEigenschaft") _ = "Wert") Then Debug.Print objMail.EntryID Exit For End If On Error GoTo 0 Next objMail
Das Mail-Objekt bietet Eigenschaften wie To, Subject oder Body, die Sie mit den Informationen aus dem Formular füllen können, und Methoden wie Display, die zur Anzeige des E-Mail-Dialogs führen.
Letztere bietet einen Parameter namens Modal, mit dem Sie angeben können, ob der Dialog modal geöffnet werden soll – dadurch wird der Ablauf der aufrufenden Prozedur unterbrochen, bis der Dialog wieder geschlossen wird.
Den Aufruf des Dialogs kann man sich natürlich auch sparen – zumindest wenn ohnehin schon alle wichtigen Informationen vorliegen. In diesem Fall verwendet man einfach die Methode Send des Mail-Objekts, um die E-Mail direkt abzusenden.
Auf EntryID gesendeter E-Mails zugreifen
Das eindeutige Merkmal einer E-Mail in Outlook ist ihre EntryID. Dabei handelt es sich um eine Kombination aus Zahlen und Buchstaben, die nur einen Nachteil hat: Sie ändert sich, wenn eine E-Mail den Outlook-Ordner wechselt.
Und da eine E-Mail nach dem Absenden zunächst in den Postausgang wandert und erst mit der nächsten Auslieferung in den Ordner Gesendete Objekte, ist es nicht so einfach, eine E-Mail via VBA und Outlook zu versenden und direkt die EntryID zu ermitteln, um das erneute Anzeigen dieser E-Mail zu ermöglichen.
Das Hauptproblem ist, dass man nicht sicher sein kann, dass die E-Mail auch direkt versendet wird – der Zeitpunkt, an dem sie in den Ordner Gesendete Objekte gelangt, ist also nicht exakt festzulegen.
Sie lernen zwar im folgenden Beitrag E-Mails aus Outlook auswählen, wie Sie eine E-Mail aus einem Outlook-Ordner herausfischen können, aber dies sollte schon automatisiert geschehen.
Dafür gibt es mehrere Möglichkeiten: Entweder Sie suchen eine Weile nach dem Versenden nach einer Mail, deren Subject und CreationTime
mit in der Datenbank gespeicherten Werten übereinstimmen, oder Sie legen für die gesendete E-Mail eine benutzerdefinierte Eigenschaft an, die Sie mit einem eindeutigen Wert belegen, und suchen anschließend nach diesem Wert. Das Hinzufügen und Festlegen einer solchen Eigenschaft sieht wie in Quellcode 2 aus.
Zusammenfassung
Sie erfahren, wie Sie mit VBA und Outlook die EntryID einer E-Mail von Access aus ermitteln und speichern können, um den späteren Zugriff auf diese E-Mail zu ermöglichen.
Techniken
Access, VBA, Listenfelder, temporäre Tabellen, Outlook
Voraussetzungen
Access 2000 oder höher, Outlook 2000 oder höher
Beispieldateien
André Minhorst, Duisburg
Im Beitrag „E-Mails versenden mit VBA und Outlook“ haben Sie erfahren, wie Sie von Access aus E-Mails versenden und deren EntryID ermitteln können, um später auf diese zuzugreifen. Letzteres macht natürlich auch für bestehende E-Mails Sinn: Vielleicht versenden Sie einmal eine E-Mail und möchten Sie später im CRM einem bestimmten Kunden zuweisen. Wie Sie die EntryID von E-Mails herausfinden, erfahren Sie in diesem Beitrag.
Wer Mails via Outlook verschickt, möchte vielleicht auch später einmal von Access aus auf diese zugreifen. Die erste hier vorgestellte Möglichkeit erfordert zuvor das Auswählen der gewünschten E-Mail und zeigt diese erst dann an.
Für die Auswahl einer E-Mail sind zwei Dialoge erforderlich: Mit dem ersten legt man den Outlook-Ordner fest, aus dem die auszuwählende E-Mail stammt (siehe Bild 1).
Der zweite zeigt schließlich die in dem Ordner enthaltenen E-Mails an (siehe Bild 2). Mit der auf diese Weise ausgewählten E-Mail kann man anschließend jede Menge Dinge erledigen – dazu aber später mehr.
Bild 1: Auswählen eines Outlook-Ordners
Bild 2: Anzeige der in einem Ordner enthaltenen E-Mails
Formular zum Anzeigen von E-Mails
Bevor es an den Quellcode geht, legen Sie das Gerüst in Form des Formulars frmMailAuswaehlen an.
Bild 3: Daten der temporären Tabelle tblMailsTemp
Das Formular enthält ein Listenfeld zur Anzeige der Mails, ein Textfeld zur Anzeige des Ordners, in dem sich die E-Mails befinden, und eine Schaltfläche zum Auswählen eines anderen Ordners.
Des Weiteren dienen die zwei Schaltflächen cmdAuswaehlen und cmdAbbrechen zum Schließen des Formulars – den Unterschied zwischen den beiden erfahren Sie später.
Das Listenfeld bezieht seine Daten aus einer temporären Tabelle, die nur zum Zwischenspeichern der angezeigten E-Mail-Daten dient. Da diese Tabelle erst beim öffnen des Formulars erstellt wird, dürfen Sie die Eigenschaft Datensatzherkunft noch nicht auf diese Tabelle einstellen – anderenfalls würde dies beim öffnen einen Fehler auslösen.
Sie können das Listenfeld aber dennoch schon auf die anzuzeigenden Daten vorbereiten. Bild 3 zeigt, wie die Daten der Tabelle aussehen. Das erste Feld ist der Primärindex der Tabelle, das zweite enthält die EntryID als eindeutiges Merkmal jeder E-Mail.
Die übrigen Felder soll das Listenfeld anzeigen. Dazu stellen Sie die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 5 und 0cm;0cm;3,2cm;6cm ein.
Das Listenfeld blendet dann die ersten beiden Felder aus und zeigt die übrigen in entsprechender Breite an.
Funktionalität des Formulars
Die verwendete Technik benötigt einige Zeilen Code. Zunächst soll vor dem Anzeigen des Formulars zum Auswählen der E-Mails der Dialog mit den Ordnern angezeigt werden.
Um die Lösung modular zu halten – es soll die komplette Funktionalität in einem Formular und dessen Klassenmodul beherbergt sein -, erfolgt auch der Aufruf dieses Dialogs vom Formular aus.
Der beste Zeitpunkt hierfür ist jener, an dem das Formular noch nicht angezeigt wird – ein passender Kandidat ist das Ereignis Beim öffnen.
Quellcode 2 zeigt die entsprechende Ereignisprozedur, die nicht nur den Dialog aufruft, sondern anschließend direkt die enthaltenen Mails ausliest und verarbeitet. Außerdem enthält Quellcode 1 die Deklaration der Objektvariablen für Outlook, den Namespace und den Mailfolder sowie eine Datenbankverbindung.
Diese sollen modulweit gültig sein, da mehrere Routinen auf die Objekte zugreifen und diese nicht jedes Mal neu erzeugt werden sollen.
Die Prozedur Form_Open erzeugt zunächst die benötigten Objekte. Anschließend tritt direkt der Dialog zum Auswählen von Mailordnern in Aktion. Mit der Funktion ChooseFolder weist die Prozedur der Variablen objFolder den im Dialog ausgewählten Ordner zu.
Die Funktion ChooseFolder ist in Quellcode 2 zu begutachten. Sie verwendet die PickFolder-Methode des Namespace-Objekts, um den Dialog aus Abb. anzuzeigen, und gibt anschließend den ausgewählten Ordner zurück. Dessen Name wird dann im Textfeld txtOutlookordner angezeigt.
Damit ist der erste Schritt getan, der leider der einfachere war. Nun müssen die in dem Ordner enthaltenen Mails im Listenfeld lstMails des Formulars frmMailAuswaehlen angezeigt werden.
Quellcode 1: Deklaration formularweiter Variablen und das Beim öffnen-Ereignis
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo