Language: Deutsch English















Last Update: 2017 - 03 - 20





Emails mit einem mailto-Hyperlink aus Access erstellen

von Philipp Stiefel, ursprünglich veröffentlicht am 15. Januar 2016


Ballons vor einem Sendeturm, article header image

Die integrierte SendObject-Methode des DoCmd-Objektes (DoCmd.SendObject) ist bereits eine sehr einfache Möglichkeit, um Emails aus einer Microsoft Access Anwendung zu senden. Ihre Systemvoraussetzungen sind sehr gering. Nur ein MAPI-kompatibler Email-Client wird benötigt. – Allerdings könnte es Situationen geben, wo nicht einmal das gegeben ist.

Kein MAPI bei der Windows 10 Mail App

Ich musste mich gerade mit dem Fall eines Benutzers beschäftigen, der nur eine sehr kärgliche Installation von Windows 10 hat. Auf seinem Rechner ist kein Office Paket installiert. Nur die Microsoft Access Runtime ist vorhanden und kein anderer Mail-Client als die Windows 10 Mail App ist verfügbar. – Zu meiner Überraschung scheint die Windows 10 Mail App den MAPI Standard nicht zu unterstützen.

Wenn du die DoCmd.SendObject-Anweisung auf einem Rechner mit nur der Windows 10 Mail App ausführst, wirst du zwei Fehlermeldungen wie die folgenden sehen.

no MAPI email client configured Microsoft Access can't send this email message

(Screenshots nur auf Englisch, da ich im Moment kein deutsches System habe, um den Fehler zu reproduzieren.)

Nun gut, ich sollte nicht zu überrascht sein, da Microsoft auf der Einleitungsseite zu Simple MAPI im Windows Dev Center bereits seit einiger Zeit warnt: „Von der Verwendung von Simple MAPI wird abgeraten. Es könnte in kommenden Versionen von Windows geändert oder nicht mehr verfügbar sein.“ (Übersetzung von mir).

Also, was nun?

Das mailto Protokoll

Es gibt eine weitere Möglichkeit Emails aus Access Anwendungen zu erstellen, die aber nur selten genutzt wird, da sie zwar sehr einfach, aber auch sehr eingeschränkt ist. Ein mailto-Hyperlink ist eine generische Methode um Email zu erstellen (nicht zu senden!). Sie ist im RFC2368 spezifiziert und wird üblicherweise verwendet, um auf Webseiten dem Besucher eine einfache Möglichkeit bereitzustellen, um mit dem Autor per Email in Kontakt zu treten.

Deine Access Anwendung läuft natürlich nicht in einem Webbrowser, der dafür ausgelegt ist Hyperlinks zu verarbeiten. In Access VBA steht aber die FollowHyperlink-Methode des Access.Application-Objektes zur Verfügung, die du aus VBA verwenden kannst, um einem mailto-Hyperlink zu folgen. Voraussetzung ist nur, dass auf deinem Computer eine Anwendung installiert ist, die mit dem mailto-URL-Schema verknüpft ist.

Application.FollowHyperlink "mailto:someone@example.com"

Diese eine Zeile VBA Code sollte deinen Mailclient starten und eine neue Email an die angegeben Adresse erstellen.

Betreff und Text setzen

Der mailto-Hyperlink wird sehr häufig verwendet, um eine Email an einen einzelnen Empfänger zu erstellen und evtl. noch den Betreff vorzubelegen. Es ist aber auch möglich den Textkörper in mailto-Link vorzubelegen.

Hier ist ein Muster-mailto-Link, der eine Email mit vordefiniertem Betreff und Text erstellt. Dazu werden die Pseudo-Header Subject und Body verwendet.

mailto:someone@example.com?subject=test-subject&body=here%20is%20the%20text

Übertreib es aber nicht mit dem Text. Die mögliche Textlänge ist begrenzt. Ich konnte keine klar definierte Begrenzung in irgendeiner Spezifikation finden. Aus meinen eigenen Versuchen geht jedoch hervor, dass die maximale Länge eines mailto-Links, der als Adresse an Application.FollowHyperlink übergeben wird, 2074 Zeichen nicht überschreiten darf. Längere Werte als URL-Adresse verursachen den recht aussagelosen „Laufzeitfehler 87: ein unerwarteter Fehler ist aufgetreten“.

An unexpected error has occurred

Ich konnte zwar keine verlässlichen Informationen dazu im Internet finden, aber es besteht zumindest die Möglichkeit, dass es bei manchen Email-Clients noch niedrigere Limits für die maximale Länge des Body-Wertes innerhalb des mailto-Links geben könnte. Falls es ein solches Limit bei Outlook 2013 und der Windows 10 Mail App geben sollte, dann ist es auf jeden Fall länger als das Limit der 2074 Zeichen für die Gesamtlänge des Address-Parameters der FollowHyperlink-Methode.

Analog zu Subject und Body kannst du den CC- und BCC-Header verwenden um Kopie-Empfänger für deine Email vorzudefinieren.

mailto:someone@example.com?cc=foo@example.com&bcc=bar@example.com&subject=test-CC

URL-Kodierung von Betreff und Text

Dir ist wahrscheinlich aufgefallen, dass der Wert für Body in dem obigen Beispiel URL-kodiert ist. URL-Kodierung (manchmal auch Prozentkodierung genannt) ist eine sehr einfache Methode um Zeichen zu maskieren, die innerhalb einer URL eine besondere Bedeutung hätten. – Das Ziel eines mailto-Links ist letztendlich eine URL.

Um die URL-Zeichenkodierung auf einen Text anzuwenden, werden alle reservierten Zeichen durch die Hexadezimaldarstellung ihres ASCII-Codes mit einem vorangestelltem Prozentzeichen (daher der Name) ersetzt.

Um also den Text einer Email zu definieren benötigen wir eine Funktion, die unseren Text URL-kodiert, bevor er in dem mailto-Link eingebaut wird. Es ist nicht schwierig eine solche Funktion zu schreiben. Es hat mich weniger als 10 Minuten gekostet diese hier zu schreiben.

Public Function URLEncode(ByVal strInput As String) As String Const CHARS_TO_ENCODE As String = "%_!_#_$_&_'_(_)_*_+_,_/_:_;_=_?_@_[_]_ _" & vbCr & "_" & vbLf Dim charsToEncode As Variant Dim i As Long Dim retVal As String retVal = strInput charsToEncode = Split(CHARS_TO_ENCODE, "_") For i = LBound(charsToEncode) To UBound(charsToEncode) retVal = Replace(retVal, charsToEncode(i), "%" & Right("0" & Hex(Asc(charsToEncode(i))), 2)) Next i URLEncode = retVal End Function

Es mag effizientere Wege geben eine solche Funktion zu schreiben, aber ich denke meine Implementierung ist einfach zu verstehen und, soweit ich getestet habe, funktioniert sie zuverlässig.

Nehmen wir nun an, du hast die obige Funktion in deine Anwendung kopiert und du hast dort ein einfaches Formular mit drei Textbox-Steuerelementen (txtRecipient, txtSubject und txtText) und einem Button (btnEmail), dann kannst du mit den folgenden VBA-Codezeilen im Event-Handler des Email-Buttons eine Email erstellen.

Private Sub btnEmail_Click() Dim recipient As String Dim subject As String Dim body As String recipient = Nz(Me.txtRecipient.Value, "") subject = URLEncode(Nz(Me.txtSubject.Value, "")) body = URLEncode(Nz(Me.txtText.Value, "")) Application.FollowHyperlink "MailTo:" & recipient & "?subject=" & subject & "&body=" & body End Sub

I habe die URLEncode-Funktion nicht in Bezug auf ihre Performance getestet. Da die Länge des Textes ohnehin begrenzt ist und du die Funktion im Kontext des Email-Versands sicher nicht häufig aufrufen wirst, denke ich dass die Performance hier irrelevant ist.

(K)eine Anlage hinzufügen

Die offizielle Spezifikation des mailto-Protokolls sieht keine Möglichkeit vor, Anlagen an eine Email-Nachricht anzuhängen. Dennoch funktioniert es bei einigen Email-Clients (z.B. Outlook 98-2003) einen virtuellen Attachment-Header im mailto-Link zu verwenden, um eine Anlage an die Email anzuhängen.

Du kannst in diesem Bespiel sehen, wie das funktionieren würde.

mailto:someone@example.com?subject=test-subject&body=here%20is%20the%20text&attach=C:\tmp\Text.txt

Du solltest dich aber auf keinen Fall darauf verlassen, dass dies in der Praxis so funktioniert. Selbst wenn es unter bestimmten Bedingungen tatsächlich geht, könnte es bereits morgen wegen einen Update des Mailclients nicht mehr funktionieren.

Emails nicht senden

Aus Sicherheitsgründen verbietet es die Spezifikation des mailto-Protokolls ausdrücklich, dass Emails damit ohne weiteres Eingreifen des Benutzers direkt versendet werden.

Du kannst also einen mailto-Link nur dazu verwenden um die Email zu erstellen, aber der Benutzer muss am Ende selbst den „Senden“-Button klicken. Also behalte immer im Hinterkopf, dass dein Programm niemals sicher wissen kann, ob eine Nachricht tatsächlich gesendet wurde, oder nicht.

Vorteile und Nachteile

Ich schließe das Thema ab, indem ich hier nochmal die Vor- und Nachteile dieser Methode der Email-Erstellung in einer kleinen Liste zusammenfasse.

Vorteile

  • Keine speziellen Bibliotheken erforderlich, es funktioniert mit den einfachsten Email-Clients
  • Sehr einfache Implementierung, allerdings brauchst du eine Funktion für die URL-Kodierung

Nachteile

  • Du kannst die Email nur erstellen, aber nicht direkt senden
  • Es ist nicht möglich HTML-Formatierungen im Text zu verwenden
  • Es gibt keine offizielle/verlässliche Methode um Anlagen anzuhängen
  • Die Länge des Email-Texts ist begrenzt

Andere Möglichkeiten für den Emailversand aus Access

Falls du das nicht bereits getan hast, empfehle ich dir dringend einen Blick auf die anderen Möglichkeiten für den Emailversand aus Access zu werfen, bevor du dich entscheidest, welche Methode am besten zu deinen Anforderungen passt.

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 - 2016 by Philipp Stiefel