Last Update: 2024 - 05 - 21 |
Emails mit einem mailto-Hyperlink aus Access erstellenvon Philipp Stiefel, ursprünglich veröffentlicht am 15. Januar 2016 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 AppIch 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. (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 ProtokollEs 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 setzenDer 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“. 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 TextDir 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ügenDie 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 sendenAus 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 NachteileIch schließe das Thema ab, indem ich hier nochmal die Vor- und Nachteile dieser Methode der Email-Erstellung in einer kleinen Liste zusammenfasse. Vorteile
Nachteile
Andere Möglichkeiten für den Emailversand aus AccessFalls 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.
Ich werde Deine Email-Addresse niemals weitergeben. Du kannst den Newsletter jederzeit abbestellen. © 1999 - 2024 by Philipp Stiefel - Datenschutzerklärung |