E-Mails mit Anlagen mit Outlook versenden

Das Versenden von E-Mails haben wir bereits ausführlich in Access im Unternehmen beschrieben. Dort kam auch gelegentlich das Thema auf, wie Sie Dateien an solche E-Mails anhängen. Allerdings gibt es bei genauerem Hinsehen Anforderungen, die wir noch nicht behandelt haben – zum Beispiel das Anhängen vieler Dateien auf einen Rutsch oder auch das Hinzufügen von Dateien, die nicht aus einem Verzeichnis stammen. Hierzu sind dann mehrere Aufrufe des jeweiligen Dialogs zum Auswählen der Dateien erforderlich. Auf diese Spezialfälle gehen wir im vorliegenden Beitrag ein.

Anforderungen an die Beispiellösung

Dieser Beitrag soll eine Beispiellösung mit folgenden Funktionen beschreiben:

  • Versenden einer E-Mail unter Angabe von Empfänger, Betreff und Inhalt
  • Hinzufügen von Anlagen über einen Dateiauswahldialog. Dabei sollen mehrere Anlagen aus einem Verzeichnis gleichzeitig selektiert werden können und beim Hinzufügen weiterer Anlagen aus einem weiteren Verzeichnis sollen die bereits hinzugefügten Anlagen erhalten bleiben.
  • Bereits hinzugefügte Anlagen sollen markiert und aus der E-Mail gelöscht werden können.

Vorbereitungen

Wir benötigen Verweise auf zwei VBA-Bibliotheken. Diese fügen Sie dem VBA-Projekt über den Verweise-Dialog hinzu, den Sie mit dem Menübefehl Extras|Verweise des VBA-Editors öffnen:

  • Microsoft Office x.0 Object LIbrary: Liefert das FileDialog-Objekt, mit dem wir den Dialog zum Auswählen der Anlagen anzeigen.
  • Microsoft Outlook x.0 Object Library: Stellt das Mail-Item-Objekt zum Versenden der E-Mail bereit.

Mit den beiden hinzugefügten Verweisen sieht der Verweise-Dialog wie in Bild 1 aus.

Verweise des VBA-Projekts

Bild 1: Verweise des VBA-Projekts

Formular zum Erstellen der E-Mail mit Anlage

Das Formular, von dem aus wir das Versenden von E-Mails mit Anlagen steuern wollen, heißt frmMailsMitAttachment und sieht in der Entwurfsansicht wie in Bild 2 aus. Das Formular verwendet die folgenden Steuerelemente:

Formular in der Entwurfsansicht

Bild 2: Formular in der Entwurfsansicht

  • txtAn: Dient der Erfassung des Empfängers der E-Mail.
  • txtBetreff: Nimmt den Betreff der E-Mail auf.
  • txtInhalt: Hier können Sie den Inhalt der E-Mail eingeben.
  • lstAnlagen: Listenfeld zur Anzeige der bereits hinzugefügten Anlagen. Das Listenfeld soll die Mehrfachauswahl erlauben, damit auch mehrere Anlagen gleichzeitig wieder aus der Liste entfernt werden können. Dazu legen wir für die Eigenschaft Mehrfachauswahl den Wert Erweitert fest. Außerdem stellen wir für dieses Listenfeld die Eigenschaften Horizontaler Anker und Vertikaler Anker auf Beide ein, damit das Listenfeld mit dem Formular vergrößert werden kann. Damit das dazugehörige Bezeichnungsfeld an Ort und Stelle bleibt, erhalten Horizontaler Anker und Vertikaler Anker hier die Werte Links und Oben. Damit wir die ausgewählten Dateien einzeln hinzufügen können, stellen wir außerdem die Eigenschaft Herkunftstyp auf Wertliste ein.
  • cmdHinzufuegen: Öffnet einen Dateiauswahldialog zum Auswählen der hinzuzufügenden Anlagen und fügt diese nach der Auswahl zum Listenfeld lstAnlagen hinzu.
  • cmdLoeschen: Löscht die aktuell markierten Einträge des Listenfeldes. Die Schaltfläche soll nur markiert sein, wenn im Listenfeld lstAnlagen mindestens ein Eintrag markiert ist.
  • cmdSenden: Sendet die E-Mail mit den Angaben der Felder txtAn, txtBetreff und txtInhalt und mit den im Listenfeld lstAnlagen angegebenen Dateien. Für diese Schaltfläche stellen wir die Eigenschaft Vertikaler Anker auf Unten ein, damit es beim Vergrößern des Formulars unten verankert ist.

Die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Bildlaufleisten und Trennlinien sollen den Wert Nein und die Eigenschaft Automatisch zentrieren den Wert Ja haben.

Anlagen zur Liste hinzufügen

Die Schaltfläche cmdHinzufuegen soll einen Dateiauswahldialog öffnen, mit dem der Benutzer eine oder mehrere Dateien aus einem Verzeichnis auswählen und zur Liste hinzufügen kann. Die Liste zeigt die Dateien dann mit dem vollständigen Pfad an. Dabei wollen wir das mehrfache Hinzufügen von Dateien unterbinden. Dies wäre möglich, da wir erlauben wollen, dass der Benutzer durch mehrfaches Anklicken der Hinzufügen-Schaltfläche auch mehrfach Dateien aus dem gleichen Verzeichnis hinzufügen könnte.

Also prüfen wir vor dem Hinzufügen einer Datei zum Listenfeld lstAnlagen, ob diese bereits in der Liste enthalten ist.

Die durch die Schaltfläche cmdHinzufuegen ausgelöste Prozedur finden Sie in Listing 1. Hier deklarieren wir zwei Laufvariablen sowie das FileDialog-Objekt und eine Boolean-Variable. Die Variable objFileDialog füllen wir mit einem Objekt der Klasse FileDialog mit dem Typ msoFileDialogPicker – mehr Informationen über diese Klasse finden Sie im Beitrag Dateien und Verzeichnisse auswählen mit FileDialog (www.access-im-unternehmen.de/****).

Private Sub cmdHinzufuegen_Click()
     Dim objFileDialog As FileDialog
     Dim l As Long
     Dim m As Long
     Dim bolVorhanden As Boolean
     Set objFileDialog = FileDialog(msoFileDialogFilePicker)
     With objFileDialog
         .AllowMultiSelect = True
         .Title = "Anlagen auswählen"
         .Filters.Clear
         .Filters.Add "Alle Dateien", "*.*"
         .ButtonName = "Hinzufügen"
         If .Show = True Then
             For l = 1 To .SelectedItems.Count
                 If Not Len(Me!lstAnlagen.RowSource + .SelectedItems(l)) > 32750 Then
                     bolVorhanden = False
                     For m = 1 To Me!lstAnlagen.ListCount
                         If Me!lstAnlagen.ItemData(m) = .SelectedItems(l) Then
                             bolVorhanden = True
                             Exit For
                         End If
                     Next m
                     If Not bolVorhanden Then
                         Me!lstAnlagen.AddItem .SelectedItems(l)
                     End If
                 Else
                     MsgBox "Es können keine weiteren Dateien zur Liste hinzugefügt werden."
                     Exit Sub
                 End If
             Next l
         End If
     End With
End Sub

Listing 1: Prozedur zum Auswählen von Dateien

Wir stellen mit der Eigenschaft AllowMultiSelect ein, dass der Benutzer mehrere Dateien gleichzeitig auswählen kann. Mit Title legen wir den Titel fest, dann leeren wir mit Filters.Clear die vorhandenen Filter und fügen mit Add den Filter für alle Dateitypen hinzu. Die Bezeichnung der Schaltfläche zum Übernehmen der Auswahl stellen wir auf ButtonName ein.

Danach folgt der Aufruf des Dialogs mit der Show-Methode, was wie in Bild 3 aussieht. Nach der Auswahl mit der Schaltfläche Hinzufügen wird der If-Teil der If…Then-Abfrage ausgeführt. Würde der Benutzer auf Abbrechen klicken, liefert die Show-Methode den Wert False und die Prozedur läuft nach der If…Then-Bedingung weiter.

Auswahl der anzuhängenden Dateien

Bild 3: Auswahl der anzuhängenden Dateien

Bevor es richtig losgeht, gehen wir auf eine Beschränkung des Listenfeldes ein: Die Datensatzherkunft kann nämlich maximal 32.750 Zeichen erfassen. Daher prüfen wir vor dem Einlesen der hinzuzufügenden Dateien, ob die aktuelle Länge des Inhalts der Eigenschaft RowSource plus der Länge des hinzuzufügenden Eintrags innerhalb dieses Limits bleibt. Ist das der Fall, fügen die folgenden Anweisungen die Datei zum Listenfeld hinzu, anderenfalls erscheint eine entsprechende Meldung. So viele Dateien werden Sie aber in der Regel auch nicht zu einer E-Mail hinzufügen. Sollte dies dennoch einmal erforderlich sein, können Sie die hinzuzufügenden Dateien zuvor beispielsweise zu einem Zip-Archiv hinzufügen.

Innerhalb der If…Then-Bedingung folgt zunächst eine For…Next-Schleife über alle im Dateiauswahldialog gewählten Dateien. Deren Anzahl ermitteln wir dabei mit der Eigenschaft SelectedItems.Count des Objekts aus objFileDialog. Der Index von SelectedItems ist 1-basiert, daher läuft die Schleife von 1 bis zur Anzahl der selektierten Einträge.

Für jede in dieser Schleife durchlaufene, im Dialog ausgewählte Datei setzt die Prozedur zunächst die Variable bolVorhanden auf den Wert False. Dann durchläuft sie alle bereits im Listenfeld lstAnlagen vorhandenen Einträge in der inneren For…Next-Schleife. Diese läuft ebenfalls von 1 bis zur mit ListCount ermittelten Anzahl der Listeneinträge. Innerhalb der zweiten Schleife vergleicht die Prozedur den Wert des aktuellen Listeneintrags aus Me!lstAnlagen.ItemData(m) und der aktuell untersuchten, hinzuzufügenden Datei aus objFileDialog.Selected-Items(l). Sind beide gleich, ist die Datei bereits in der Liste enthalten. Dann stellt die Prozedur den Wert der Variablen bolVorhanden auf True ein und verlässt die innere For…Next-Schleife.

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

Schreibe einen Kommentar