Language: Deutsch English















Last Update: 2017 - 07 - 09





Emails aus Access mit VBA und CDO versenden

von Philipp Stiefel, ursprünglich veröffentlicht 15. November 2015


retro typewriter, article header image

Die zwei anderen Ansätze um Emails aus Microsoft Access zu versenden haben beiden ihre Stärken und Schwächen.

Emails mit der DoCmd.SendObject Anweisung zu versenden ist sehr einfach und unabhängig von dem installierten Email-Client, es hat aber auch nur eine sehr begrenzte Funktionalität.

Outlook Automation für den Email-Versand zu verwenden ist dagegen sehr mächtig und es gibt nur wenig, was man damit nicht erreichen kann. Allerdings ist dieser Ansatz komplett davon abhängig, dass auch Microsoft Outlook auf dem Rechner installiert ist, auf dem deine Access Anwendung läuft. Darüber hinaus wird der Ansatz dadurch behindert, dass Microsoft immer mehr Sicherheitsmaßnahmen implementiert um den Zugriff von anderen Anwendungen auf Outlook zu kontrollieren und einzuschränken.

Darf ich vorstellen, die CDO Bibliothek

Hier möchte ich Dir jetzt eine weitere Methode vorstellen um Emails über Visual Basic Code aus deiner Access Anwendung zu senden. Diese Methode basiert auf den Collaboration Data Objects (CDO). Die vollständige Bezeichnung der Bibliothek, die wir nutzen werden ist Microsoft CDO for Windows 2000. Diese Bibliothek ist nicht abhängig von dem installierten Email Client, denn die komplette Funktionalität um Emails zu versenden ist bereits in ihr integriert.

Ein großer Vorteil dieser Bibliothek ist, dass du davon ausgehen kannst, dass sie bereits auf dem Rechner auf dem deine Anwendung laufen wird, installiert ist. Sie ist in der Betriebssysteminstallation von Windows NT enthalten, seitdem Microsoft Windows 2000 veröffentlicht wurde. Dies ist zwar keine Garantie für die Zukunft, aber im Moment brauchen wir uns keine Gedanken darüber machen, ob diese Bibliothek vielleicht nicht vorhanden sein könnte.

Eine einfache Email versenden

Ok, ich zeige Dir jetzt, wie du eine einfache Email mit CDO versenden kannst.

Bevor wir loslegen können, musst Du einen Verweis auf die CDO-Bibliothek setzen. Dazu rufe das Menü Extras->Verweise im VBA-Editor auf. Wenn du die Bibliothek nicht in der Liste der Verweise findest, kannst du einfach über den Datei-Dialog danach suchen. Füge die Bibliothek cdosys.dll aus dem Windows System32 (SysWow64 auf 64-bit Systemen) hinzu.

Screenshot der VBA Verweise mit der hinzugefügten CDO Bibliothek

Dann kannst du diese Prozedur in einem neuen Modul in der VBA-Entwicklungsumgebung einfügen.

Public Sub SendSimpleCDOMail() Dim mail As CDO.MESSAGE Dim config As CDO.Configuration Set mail = CreateObject("CDO.Message") Set config = CreateObject("CDO.Configuration") config.Fields(cdoSendUsingMethod).Value = cdoSendUsingPort config.Fields(cdoSMTPServer).Value = "mail.mycompany.invalid" config.Fields(cdoSMTPServerPort).Value = 25 config.Fields.Update Set mail.Configuration = config With mail .To = "someone@somewhere.invalid" .From = "me@mycompany.invalid" .Subject = "First email with CDO" .TextBody = "This is the body of the first plain text email with CDO." .AddAttachment "C:\path\to\a\file.dat" .Send End With Set config = Nothing Set mail = Nothing End Sub

Als nächstes solltest du natürlich die Werte für den Mail Server Namen, die Email-Adressen und den Pfad zu dem Dateianhang mit Werten ersetzen, die in deiner Umgebung gültig sind. Wenn du im Moment noch keinen Dateianhang mitsenden willst, kannst du diese Zeile einfach auskommentieren.

Während du das tust, fällt dir vielleicht schon ein kleines Problem mit diesem Ansatz auf. – Du musst den Namen des Mail Servers wissen, den später die Benutzer der Anwendung verwenden werden.

Jetzt, nachdem du die Werte angepasst hast, führe den Code aus um eine Email zu versenden. – Funktioniert es?

Du solltest nicht zu sehr überrascht sein, wenn beim Aufruf der Send-Methode ein Laufzeitfehler auftritt und eine Fehlermeldung ähnlich dieser Auftritt.

Screenshot der Fehlermeldung '530 Authentication required'
The server rejected the sender address. The server response was: 530 Authentication required

Dies bedeutet, dass dein Mail Server die Email abgewiesen hat, die wir gerade versenden wollten. Dies ist eigentlich eine gute Sache, denn es zeigt, dass der Mailserver Spam verhindert und nicht zulässt, dass einfach irgendjemand eine Email versendet.

Authentifizierung

Um uns beim Mail Server zu authentifizieren müssen wir unser Zugangsdaten übermitteln. Um das zu tun, fügen wir einfach diese drei Zeilen mit dem Benutzernamen und Kennwort zu den Konfigurationseinstellungen in Code hinzu.

config.Fields(cdoSMTPAuthenticate).Value = cdoBasic config.Fields(cdoSendUserName).Value = "youUserName" config.Fields(cdoSendPassword).Value = "yourPassword"

Versuch jetzt noch einmal die Email mit durch Ausführen des VBA-Codes zu senden. – Jetzt sollte es funktionieren.

Nimm zur Kenntnis, dass dies zwei weitere Werte sind, die du in den Konfigurationseinstellungen deiner Access Anwendung speichern musst, oder du kannst sie jedes Mal vom Benutzer eingeben lassen, wenn er eine Email senden möchte (unschön).

Wenn deine Anwendung innerhalb einer Windows Domäne mit Active Directory verwendet wird und der Benutzer in der Domäne angemeldet ist, kannst du auch NTLM Authentifizierung verwenden. Der Benutzer (oder die Anwendung) müssen dann Benutzername und Kennwort nicht mehr an den Mailserver übergeben.

Um dies zu aktivieren, ändere die Konfigurationseinstellung für cdoSMTPAuthenticate zu cdoNTLM.

config.Fields(cdoSMTPAuthenticate).Value = cdoNTLM

Natürlich muss NTLM Authentifizierung auf dem Mailserver aktiviert sein, damit dies funktionieren kann.

Verschlüsselung

Jetzt sind wir eigentlich fertig, aber wir können die Sicherheit unserer Implementierung noch weiter verbessern. Die meisten Email-Server unterstützen auch verschlüsselte Verbindungen für den Email Versand. Die CDO-Bibliothek kann das auch.

Um SSL Verschlüsselung für den Email-Versand zu aktivieren füge diese eine Zeile zum Code hinzu und ändere den Wert für cdoSMTPServerPort.

config.Fields(cdoSMTPServerPort).Value = 465 config.Fields(cdoSMTPUseSSL).Value = "true"

Außerdem ändere die Portnummer in der Zuweisung der Konfiguration auf 465. Probiere aus, ob der Email-Versand noch funktioniert.

Es gibt einige Situation in denen es nicht funktionieren wird, die Email über eine verschlüsselte Verbindung zu versenden. Das SSL-Zertifikat des Servers könnte auf dem Client als nicht vertrauenswürdig eingestuft werden. Dann kann sich die CDO-Bibliothek nicht zum Server verbinden. Manche Mailserver unterstützen auch keine implizite SSL-Verbindung auf Port 465, sondern nur explizite TLS-Verbindungen über Port 587. Dies wird unglücklicherweise nicht von der CDO-Bibliothek unterstützt.

Wie wichtig die Verschlüsselung der Verbindung ist, hängt von dem Szenario ab, in dem deine Anwendung eingesetzt wird. Wenn sich der Mailserver innerhalb eines lokalen Firmennetzwerkes befindet, sollte es keine Notwendigkeit geben, die Verbindung zu verschlüsseln. Falls aber der Server irgendwo im Internet gehostet wird, empfehle ich Verschlüsselung zu verwenden, wenn das möglich ist.

Voraussetzungen und Vor- / Nachteile

Die einzige Systemvoraussetzung ist die CDO-Bibliothek (cdosys.dll), die auf jeder Standardinstallation von Windows seit Windows 2000 vorhanden ist.

Vorteile

  • Die Methode ist unabhängig von der installierten Email Client Software

  • Sehr mächtig und viele Features

Nachteile

  • Die vollständige Konfiguration für den Email Account muss in der Access Anwendung verfügbar sein

  • Etwas komplizierter zu verwenden als DoCmd.SendObject und Outlook Automation

  • Es ist unklar, wie lange Microsoft diese Technologie weiterhin unterstützen wird

Download

Um es dir noch einfacher zu machen, diese Methode für den Emailversand zu verwenden, habe ich ein VBA-Modul mit dem Beispielcode hochgeladen. In diesem Modul sind alle Konstanten aus der CDO-Bibliothek ebenfalls lokal deklariert. Du musst also keinen Verweis auf die Bibliothek hinzufügen, sondern kannst einfach diese Modul in deiner Anwendung importieren und bis sofort startklar.

Share this article: Share on Facebook Tweet Share on LinkedIn Share on XING

Abonniere meinen Newsletter

*

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



© 1999 - 2017 by Philipp Stiefel