Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 4/2005.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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)

E-Mails versenden mit VBA und Outlook

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 Abb. 1 den Outlook-Dialog zur Anzeige einer E-Mail und füllen die wichtigsten Felder der E-Mail automatisch aus (s. Abb. 2).

Abb. 1: Beispielformular zum Aufrufen des Outlookschen E-Mail-Dialogs

Abb. 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

AccessUndOutlook2000.mdb

E-Mails aus Outlook auswählen

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 (s. Abb. 1).

Der zweite zeigt schließlich die in dem Ordner enthaltenen E-Mails an (s. Abb. 2). Mit der auf diese Weise ausgewählten E-Mail kann man anschließend jede Menge Dinge erledigen - dazu aber später mehr.

Abb. 1: Auswählen eines Outlook-Ordners

Abb. 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.

Abb. 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. Abb. 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

Option Compare Database

Option Explicit

Dim cnn As ADODB.Connection

Dim objOutlook As Outlook.Application

Dim objNamespace As Outlook.NameSpace

Dim objFolder As Outlook.MAPIFolder

Private Sub Form_Open(Cancel As Integer)

    On Error GoTo Form_Open_Err

    Set objOutlook = New Outlook.Application

    Set objNamespace = objOutlook.GetNamespace("MAPI")

    Set cnn = CurrentProject.Connection

    Set objFolder = ChooseFolder

    If objFolder Is Nothing Then

        Cancel = True

        Exit Sub

    Else

        Me!txtOutlookordner = objFolder.Name

        If Not CurrentData.AllTables("tblMailsTemp").Name = "tblMailsTemp" Then

            cnn.Execute "CREATE TABLE tblMailsTemp(MailID COUNTER CONSTRAINT Primaerschluessel " _
                & "PRIMARY KEY, EntryID STRING(255), DateSent DATETIME, Subject STRING(255), " _
                & "Recipitient STRING(50))"

        End If

        MailsToTable objFolder

        Me!lstMails.RowSource = "tblMailsTemp"

        Me!lstMails.Requery

    End If

Form_Open_Exit:

    Exit Sub

Form_Open_Err:

    If Err = 2467 Then

        Resume Next

    Else

        GoTo Form_Open_Exit

    End If

End Sub

Quellcode 2: Anzeigen der Ordnerliste von Outlook

Private Function ChooseFolder() As Outlook.MAPIFolder

    Set objFolder = objNamespace.PickFolder

    Set ChooseFolder = objFolder

End Function

Um dies zu erreichen, schreibt die Prozedur einige Informationen zu den einzelnen E-Mails in eine temporäre Tabelle und stellt dann die Datensatzherkunft des Listenfeldes auf diese ein.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Verwandte Beiträge:

Outlook und Access - Import und Export von Access-Daten

Serien-E-Mails mit Access und Outlook

Mail verwenden ohne Outlook

Datenbanken als Outlook 2002-Anhang öffnen

Vertikale Menüleisten

Verleihen und Entleihen mit Access und Outlook

Adressverwaltung mit Outlookschnittstelle

Adressverwaltung mit Outlook-Schnittstelle, Teil 2

Google Earth ferngesteuert, Teil II

© 2003-2015 André Minhorst Alle Rechte vorbehalten.