{"id":55001376,"date":"2022-08-01T00:00:00","date_gmt":"2022-08-04T18:11:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1376"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"EMailAdressen_validieren_per_VBA","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/","title":{"rendered":"E-Mail-Adressen validieren per VBA"},"content":{"rendered":"<p><b>Immer mehr Vorg&auml;nge werden per E-Mail verarbeitet. Dazu geh&ouml;ren auch Bestellungen, Rechnungen et cetera. Fr&uuml;her wurden beispielsweise Rechnungen an die Postadresse geschickt, was einigerma&szlig;en fehlertolerant war. Sp&auml;testens der Brieftr&auml;ger hat die falsche Hausnummer erkannt und die Sendung dank regelm&auml;&szlig;igem Zustellungsgebiet beim richtigen Adressaten abgeliefert. Bei E-Mails verh&auml;lt sich dies v&ouml;llig anders: Hier f&uuml;hrt jede Ungenauigkeit zur Unzustellbarkeit, toleriert werden allenfalls noch Abweichungen bei der Gro&szlig;-\/Kleinschreibung. Daher lohnt es sich, die E-Mail-Adressen von Kunden und anderen Adressaten zumindest oberfl&auml;chlich zu pr&uuml;fen.<\/b><\/p>\n<h2>Aufbau einer E-Mail-Adresse<\/h2>\n<p>Als Erstes unterteilen wir eine E-Mail-Adresse grob in den Teil vor dem @-Zeichen und dahinter. Davor finden wir den sogenannten Lokalteil, dahinter die Domain des E-Mail-Providers.<\/p>\n<p>Schauen wir uns zuerst die Domain an. Diese besteht wiederum aus drei Teilen: dem Hostnamen, einem Punkt und der Top-Level-Domain. Da es immer mehr Top-Level-Domains gibt, wird es schwierig, diese konkret auf G&uuml;ltigkeit zu pr&uuml;fen. Auch die Anzahl der Zeichen wurde im Laufe der Zeit immer mehr ausgeweitet. Fr&uuml;her gab es nur Top-Level-Domains mit zwei oder drei Buchstaben (wie <b>de <\/b>oder <b>com<\/b>), mittlerweile finden wir auch solche mit mehr Buchstaben.<\/p>\n<p>Der Teil vor dem @-Zeichen hei&szlig;t Lokalteil und kann je Domain nur einmal vergeben werden. Er kann die folgenden Zeichen verwenden:<\/p>\n<pre>A-Za-z0-9.!#$%&''*+-\/=?^_''{|}~<\/pre>\n<p>Allerdings finden wir in der Regel nur Buchstaben, Zahlen und den Punkt vor. Dennoch k&ouml;nnen wir die m&ouml;glichen Zeichen in die Pr&uuml;fung mit einbeziehen.<\/p>\n<h2>M&ouml;glichkeiten f&uuml;r die Pr&uuml;fung<\/h2>\n<p>Wir k&ouml;nnen verschiedene Techniken f&uuml;r die Pr&uuml;fung von E-Mail-Adressen einsetzen. Wenn wir nur eine grundlegende Pr&uuml;fung vornehmen wollen, kommen wir mit den Zeichenkettenfunktionen von VBA aus. F&uuml;r eine weitergehende Pr&uuml;fung ist auch die Nutzung von regul&auml;ren Ausdr&uuml;cken m&ouml;glich. Dazu ben&ouml;tigen wir jedoch bereits eine zus&auml;tzliche Bibliothek. Diese beiden Methoden erlauben jedoch nur die Pr&uuml;fung der Syntax der E-Mail-Adresse.<\/p>\n<p>Wenn Sie sicherstellen wollen, dass die E-Mail auch beim Empf&auml;nger ankommt, k&ouml;nnen Sie einen der zahlreichen Onlinedienste beanspruchen. Diese sind jedoch meist kostenpflichtig oder bieten keinen Webservice an, mit dem wir diese nutzen k&ouml;nnen.<\/p>\n<h2>Grundlegende Pr&uuml;fung<\/h2>\n<p>Die grundlegendste Pr&uuml;fung kontrolliert schlicht, ob die E-Mail-Adresse bestimmte Elemente und keine unerlaubten Sonderzeichen enth&auml;lt.<\/p>\n<p>Diese wollen wir nun per VBA programmieren. Die dazu notwendige Funktion soll <b>CheckEMailSyntax <\/b>hei&szlig;en und die zu pr&uuml;fende E-Mail-Adresse als Parameter entgegennehmen. Das Ergebnis soll ein <b>Boolean<\/b>-Wert sein, der im Falle einer g&uuml;ltigen E-Mail-Adresse den Wert <b>True <\/b>enth&auml;lt. Diese definieren wir zun&auml;chst wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CheckEMailSyntax(strEMail<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Nun wollen wir ein paar Testf&auml;lle mit vorgegebenen Ergebnissen definieren, mit denen wir die Funktion direkt w&auml;hrend der Entwicklung testen k&ouml;nnen. Dazu verwenden wir zwei verschiedene Prozeduren.<\/p>\n<p>Die erste ruft die eigentliche Testprozedur auf und &uuml;bergibt dieser jeweils die zu untersuchende E-Mail-Adresse und die Angabe, ob diese g&uuml;ltig ist oder nicht. Hier sind die Aufrufe mit einigen Test-Adressen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test()\r\n     Test_CheckEMailSyntax \"andre@minhorst.com\", <span style=\"color:blue;\">True<\/span>\r\n     Test_CheckEMailSyntax \"andre@minhorst,com\", <span style=\"color:blue;\">False<\/span>\r\n     Test_CheckEMailSyntax \"andreQminhorst.com\", <span style=\"color:blue;\">False<\/span>\r\n     Test_CheckEMailSyntax \"andre@minhorst.de\", <span style=\"color:blue;\">True<\/span>\r\n     Test_CheckEMailSyntax \"@minhorst.de\", <span style=\"color:blue;\">False<\/span>\r\n     Test_CheckEMailSyntax \"andre@.de\", <span style=\"color:blue;\">False<\/span>\r\n     Test_CheckEMailSyntax \"andre@minhorst.\", <span style=\"color:blue;\">False<\/span>\r\n     Test_CheckEMailSyntax \"andre@minhorst@de\", <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die zweite Prozedur f&uuml;hrt den Testaufruf aus und gleicht das Ergebnis mit dem erwarteten Ergebnis ab. Liefert der Test das erwartete Ergebnis, erscheint eine Zeile im Direktbereich, die auf den erfolgreichen Test verweist.<\/p>\n<p>Anderenfalls wird der fehlgeschlagene Test gemeldet (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_CheckEMailSyntax(strEMail<span style=\"color:blue;\"> As String<\/span>, bolResult<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">If <\/span>CheckEMailSyntax(strEMail) = bolResult<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Test mit ''\" & strEMail & \"'' erfolgreich\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> \"Test mit ''\" & strEMail & \"'' fehlgeschlagen\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Eigentliche Testprozedur<\/span><\/b><\/p>\n<p>Mit den obigen Tests sieht das Ergebnis wie folgt aus:<\/p>\n<pre>Test mit ''andre@minhorst.com'' erfolgreich\r\nTest mit ''andre@minhorst,com'' erfolgreich\r\nTest mit ''andreQminhorst.com'' erfolgreich\r\nTest mit ''andre@minhorst.de'' erfolgreich\r\nTest mit ''@minhorst.de'' fehlgeschlagen\r\nTest mit ''andre@.de'' fehlgeschlagen\r\nTest mit ''andre@minhorst.'' fehlgeschlagen\r\nTest mit ''andre@minhorst@de'' erfolgreich<\/pre>\n<p>Zuf&auml;lligerweise liefert die Funktion mit dem Wert <b>False<\/b> in einigen F&auml;llen das richtige Ergebnis, was sich aber gleich relativieren wird.<\/p>\n<p>Als Erstes wollen wir pr&uuml;fen, ob ein <b>@<\/b>-Zeichen in der E-Mail enthalten ist. Dazu erweitern wir die Funktion wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CheckEMailSyntax(strEMail<span style=\"color:blue;\"> As String<\/span>) <span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strEMail, \"@\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ''...\r\n     ''weitere Pr&uuml;fungen\r\n     ''...\r\n     CheckEMailSyntax = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Hier pr&uuml;fen wir mit der <b>InStr<\/b>-Funktion, ob in <b>strEMail <\/b>&uuml;berhaupt ein <b>@<\/b>-Zeichen enthalten ist. Rufen wir die <b>Test<\/b>-Prozedur erneut auf, liefern nun andere Tests ein positives Ergebnis. Wenn die Bedingung falsch ist, also die Funktion nicht &uuml;ber <b>Exit Function <\/b>verlassen wird, gibt die Funktion den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p>Aber die Pr&uuml;fung ist nicht ganz korrekt, denn es soll nicht nur &uuml;berhaupt ein <b>@<\/b>-Zeichen enthalten sein, sondern genau eines. Wie k&ouml;nnen wir pr&uuml;fen, ob genau ein <b>@<\/b>-Zeichen vorhanden ist? Wir ersetzen dieses durch eine leere Zeichenkette und vergleichen dann die L&auml;nge mit der L&auml;nge des Originals. Der durch die folgende Bedingung ermittelte Unterschied muss 1 sein:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strEMail) - <span style=\"color:blue;\">Len<\/span>(<span style=\"color:blue;\">Replace<\/span>(strEMail, \"@\", \"\"))  = 1<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Als N&auml;chstes f&uuml;gen wir eine Bedingung hinzu, die auf das Vorhandensein des Punkts pr&uuml;ft. Im Gegensatz zum @-Zeichen kann die E-Mail-Adresse auch mehrere Punkte enthalten, wie zum Beispiel in <b>andre.minhorst@t-online.de<\/b>. Allerdings darf nur ein Punkt hinter dem <b>@<\/b>-Zeichen auftauchen. Wir schauen uns also nur den Teil hinter dem <b>@<\/b>-Zeichen an.<\/p>\n<p>Dazu deklarieren wir eine Variable namens <b>strDomain <\/b>und f&uuml;gen den Teil hinter dem <b>@<\/b>-Zeichen in diese Variable ein:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strDomain<span style=\"color:blue;\"> As String<\/span>\r\n...\r\nstrDomain = <span style=\"color:blue;\">Mid<\/span>(strEMail, <span style=\"color:blue;\">InStr<\/span>(1, strEMail, \"@\") + 1)<\/pre>\n<p>Danach f&uuml;hren wir f&uuml;r <b>strDomain <\/b>und den Punkt die gleiche Pr&uuml;fung wie oben f&uuml;r <b>strEMail <\/b>und das <b>@<\/b>-Zeichen durch und pr&uuml;fen so, ob genau ein Punkt in <b>strDomain <\/b>enthalten ist:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strDomain) - <span style=\"color:blue;\">Len<\/span>(<span style=\"color:blue;\">Replace<\/span>(strDomain, \".\", \"\"))  = 1<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Damit gelingen schon einmal die ersten vier Tests, also schauen wir uns an, was wir noch nicht ber&uuml;cksichtigt haben, dass der f&uuml;nfte Test fehlschl&auml;gt. Hier testen wir auf <b>@minhorst.com<\/b>, was das Ergebnis <b>False <\/b>liefern sollte, aber die Prozedur liefert das Ergebnis <b>True<\/b>.<\/p>\n<p>Wir m&uuml;ssen also vor dem <b>@<\/b>-Zeichen noch mindestens ein weiteres Zeichen vorfinden. Dazu lesen wir den Teil vor dem <b>@<\/b>-Zeichen in die Variable <b>strLocal <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strLocal<span style=\"color:blue;\"> As String<\/span>\r\n...\r\nstrLocal = <span style=\"color:blue;\">Left<\/span>(strEMail, <span style=\"color:blue;\">InStr<\/span>(1, strEMail, \"@\") - 1)<\/pre>\n<p>Danach k&ouml;nnen wir zun&auml;chst einmal pr&uuml;fen, ob <b>strLocal <\/b>mindestens die L&auml;nge <b>1 <\/b>aufweist:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strLocal) = 0<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Damit kommen wir zum n&auml;chsten Test, der fehlschl&auml;gt: <b>andre@.de <\/b>liefert einen Fehler. Logisch: Hier fehlt der Hostname, also der Teil vor dem Punkt. Also nutzen wir zwei weitere Variablen, in denen wir den Hostnamen und die Top Level Domain speichern:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strHostname<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strTLD<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Diese ermitteln wir aus <b>strDomain<\/b> &#8211; f&uuml;r den Hostnamen bis zum ersten Punkt von hinten, f&uuml;r die Top Level Domain vom ersten Punkt von hinten an:<\/p>\n<pre>strHostname = <span style=\"color:blue;\">Left<\/span>(strDomain, <span style=\"color:blue;\">InStrRev<\/span>(strDomain, \".\") - 1)\r\nstrTLD = <span style=\"color:blue;\">Mid<\/span>(strDomain, <span style=\"color:blue;\">InStrRev<\/span>(strDomain, \".\") + 1)<\/pre>\n<p>Die Pr&uuml;fung, ob ein Hostname enthalten ist, sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strHostname) = 0<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Und auf die G&uuml;ltigkeit der Top Level Domain, also dem hinteren Teil, testen wir so:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strTLD) = 0<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Damit sind nun alle Tests erfolgreich. Also k&ouml;nnen wir ein paar weitere H&uuml;rden in Form neuer Tests einbauen.<\/p>\n<h2>Lokalteil auf ung&uuml;ltige Zeichen pr&uuml;fen<\/h2>\n<p>Der Lokalteil darf laut Wikipedia die folgenden Zeichen enthalten:<\/p>\n<pre>A-Za-z0-9.!#$%&''*+-\/=?^_''{|}~<\/pre>\n<p>Diese legen wir f&uuml;r eine Konstante namens <b>cstrLocal <\/b>fest:<\/p>\n<pre>Const cstrLocal<span style=\"color:blue;\"> As String<\/span> = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.!#$%&''*+-\/=?^_''{|}~\"<\/pre>\n<p>Dann f&uuml;gen wir einen Test hinzu, wo der Lokalteil ein ung&uuml;ltiges Zeichen enth&auml;lt &#8211; n&auml;mlich ein Anf&uuml;hrungszeichen:<\/p>\n<pre>Test_CheckEMailSyntax \"an\"\"dre@minhorst.com\", <span style=\"color:blue;\">False<\/span><\/pre>\n<p>In der Pr&uuml;fung f&uuml;r diesen Fall durchlaufen wir alle Zeichen des Lokalteils aus <b>strLocal <\/b>und pr&uuml;fen, ob das aktuelle Zeichen in den zul&auml;ssigen Zeichen enthalten ist.<\/p>\n<p>Falls nicht, liefert der Test den Wert <b>False<\/b>:<\/p>\n<pre>For i = 1 To <span style=\"color:blue;\">Len<\/span>(strLocal)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, cstrLocal, <span style=\"color:blue;\">Mid<\/span>(strLocal, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Damit verl&auml;uft auch dieser Test erfolgreich.<\/p>\n<h2>Hostname und Domain auf ung&uuml;ltige Zeichen testen<\/h2>\n<p>Der Hostname und die Top Level Domain d&uuml;rfen nur aus Buchstaben bestehen und der Hostname darf zus&auml;tzlich noch das Minuszeichen enthalten, also beispielsweise <b>access-im-unternehmen<\/b>. Die Minuszeichen d&uuml;rfen aber nicht am Anfang oder am Ende liegen, sondern nur zwischen zwei Buchstaben. F&uuml;r den Hostnamen legen wir eine weitere Konstante namens <b>cstrHostname <\/b>an, die nur alle Buchstaben, alle Zahlen und das Minuszeichen enth&auml;lt:<\/p>\n<pre>Const cstrHostname<span style=\"color:blue;\"> As String<\/span> = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-\"<\/pre>\n<p>Die Konstante <b>cstrTLD <\/b>f&uuml;r die Top Level Domain enth&auml;lt alle Buchstaben:<\/p>\n<pre>Const cstrTLD<span style=\"color:blue;\"> As String<\/span> = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"<\/pre>\n<p>In den folgenden beiden Pr&uuml;fungen untersuchen wir den Hostnamen und die Top Level Domain auf ung&uuml;ltige Zeichen:<\/p>\n<pre>For i = 1 To <span style=\"color:blue;\">Len<\/span>(strHostname)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, cstrHostname, <span style=\"color:blue;\">Mid<\/span>(strHostname, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">Next<\/span> i\r\nFor i = 1 To <span style=\"color:blue;\">Len<\/span>(strTLD)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, cstrTLD, <span style=\"color:blue;\">Mid<\/span>(strTLD, i, 1)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">Next<\/span> i<\/pre>\n<p>Dass das Minuszeichen nicht an erster oder letzter Stelle beim Hostnamen stehen darf, pr&uuml;fen wir mit folgender Bedingung:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(strHostname, 1) = \"-\"  Or <span style=\"color:blue;\">Right<\/span>(strHostname, 1) = \"-\"<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die folgenden weiteren Tests verlaufen damit alle erfolgreich:<\/p>\n<pre>Test_CheckEMailSyntax \r\n                   \"info@access-im-unternehmen.de\", <span style=\"color:blue;\">True<\/span>\r\nTest_CheckEMailSyntax \r\n                 \"info@-access-im-unternehmen.de\", <span style=\"color:blue;\">False<\/span>\r\nTest_CheckEMailSyntax  \"info@access-im-unternehmen-.de\", <span style=\"color:blue;\">False<\/span><\/pre>\n<h2>Praxistest: Newsletterverteiler<\/h2>\n<p>Wenn Sie einen Newsletterverteiler haben oder andere Listen von E-Mail-Adressen, k&ouml;nnen Sie die soeben erstellte Funktion zum Testen von E-Mail-Adressen gleich einmal einem Praxistest unterziehen.<\/p>\n<p>Wir verwenden dabei beispielsweise die Prozedur aus Listing 2.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EMailsTesten()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblNewsletterempfaenger\", dbOpenDynaset, dbSeeChanges)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> CheckEMailSyntax(rst!EMail)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> rst!EMail\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         DoEvents\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ausprobieren der Funktion mit gr&ouml;&szlig;eren Mengen an E-Mail-Adressen<\/span><\/b><\/p>\n<p>Beim Durchforsten der scheinbar fehlerhaften E-Mails f&auml;llt auf, dass wir aus Wikipedia einige falsche Regeln abgeleitet haben. Der erste Fehler: Der Hostname kann auch eine oder mehrere Subdomains enthalten, also noch weitere Punkte. Wir ermitteln den Hostnamen f&uuml;r die Variable <b>strHostname<\/b> nicht durch Trennen des Domainteils an der Stelle des mit <b>InStr <\/b>gefundenen Punktes, sondern am ersten Punkt von hinten:<\/p>\n<pre>strHostname = <span style=\"color:blue;\">Left<\/span>(strDomain, <span style=\"color:blue;\">InStrRev<\/span>(strDomain, \".\") - 1)<\/pre>\n<p>Der Hostname darf dann mehrere Punkte enthalten, die sich aber nicht am Anfang und am Ende befinden d&uuml;rfen und es d&uuml;rfen keine zwei Punkte direkt aufeinanderfolgen &#8211; sie m&uuml;ssen also zwei Teile des Domainnamens voneinander trennen.<\/p>\n<p>Dies pr&uuml;fen wir mit den folgenden beiden Bedingungen ab. Die erste untersucht, ob mehr als ein Punkt hintereinander im Hostnamen enthalten ist:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strHostname) - <span style=\"color:blue;\">Len<\/span>(<span style=\"color:blue;\">Replace<\/span>( strHostname, \"..\", \"\")) &gt; 1<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Die zweite k&uuml;mmert sich um Punkte, die am Anfang oder am Ende angegeben wurden &#8211; dazu geh&ouml;ren dann beispielsweise auch zwei Punkte vor der Top-Level-Domain wie etwa bei <b>andre@minhorst..com<\/b>:<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(strHostname, 1) = \".\" Or <span style=\"color:blue;\">Right<\/span>(strHostname, 1)  = \".\"<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Gleichzeitig m&uuml;ssen wir die Bedingung von weiter oben, wo wir maximal einen Punkt innerhalb von <b>strDomain <\/b>erlaubt haben, &auml;ndern, sodass hier mindestens ein Punkt vorkommen muss (dass es nicht mehr als zwei werden, pr&uuml;fen wir weiter oben):<\/p>\n<pre><span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strDomain) - <span style=\"color:blue;\">Len<\/span>(<span style=\"color:blue;\">Replace<\/span>(strDomain, \".\", \"\"))  &gt;= 1<span style=\"color:blue;\"> Then<\/span>\r\n     CheckEMailSyntax = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Exit Function<\/span>\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Den Punkt m&uuml;ssen wir au&szlig;erdem noch zur Konstanten <b>cstrHostname <\/b>hinzuf&uuml;gen.<\/p>\n<p>Mit dieser Version konnten wir zumindest in einigen Tausend E-Mails aus dem E-Mail-Verteiler zuverl&auml;ssig die ung&uuml;ltigen E-Mail-Adressen herausfiltern.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die hier vorgestellte Funktion <b>CheckEMailSyntax <\/b>k&ouml;nnen Sie nun beispielsweise zum Pr&uuml;fen gr&ouml;&szlig;erer Mengen von E-Mails nutzen, die in einer Tabelle gespeichert sind &#8211; siehe Beispiel der Prozedur <b>EMailsTesten <\/b>weiter oben.<\/p>\n<p>Sie k&ouml;nnen die Funktion aber auch direkt bei der Eingabe von E-Mail-Adressen in das Textfeld eines Formulars pr&uuml;fen und eine entsprechende Meldung ausgeben, wenn die E-Mail nicht den Anforderungen entspricht.<\/p>\n<p>Dazu hinterlegen Sie beispielsweise f&uuml;r das Ereignis <b>Vor Aktualisierung <\/b>eines Textfelds namens <b>txtEMail <\/b>den folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtEMail_BeforeUpdate(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> CheckEMailSyntax(Nz(Me!txtEMail, \"\"))<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Mail-Adresse ''\" & Me!txtEMail _\r\n            & \"'' ist ung&uuml;ltig.\"\r\n         Me!txtEMail.SetFocus\r\n         Cancel = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn der Benutzer eine ung&uuml;ltige E-Mail-Adresse eingibt, erscheint eine Meldung und der Fokus wird wieder auf das Textfeld gesetzt (siehe Bild 1). Au&szlig;erdem erh&auml;lt der Parameter <b>Cancel <\/b>den Wert <b>True<\/b>, was das Speichern des Feldinhalts abbricht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_04\/pic_1376_001.png\" alt=\"Validieren von E-Mail-Adressen im Formular\" width=\"499,5589\" height=\"292,3984\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Validieren von E-Mail-Adressen im Formular<\/span><\/b><\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>EMailValidieren.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BCAF44C4-B043-4C83-8B40-37A57748B6AE\/aiu_1376.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Immer mehr Vorg&auml;nge werden per E-Mail verarbeitet. Dazu geh&ouml;ren auch Bestellungen, Rechnungen et cetera. Fr&uuml;her wurden beispielsweise Rechnungen an die Postadresse geschickt, was einigerma&szlig;en fehlertolerant war. Sp&auml;testens der Brieftr&auml;ger hat die falsche Hausnummer erkannt und die Sendung dank regelm&auml;&szlig;igem Zustellungsgebiet beim richtigen Adressaten abgeliefert. Bei E-Mails verh&auml;lt sich dies v&ouml;llig anders: Hier f&uuml;hrt jede Ungenauigkeit zur Unzustellbarkeit, toleriert werden allenfalls noch Abweichungen bei der Gro&szlig;-\/Kleinschreibung. Daher lohnt es sich, die E-Mail-Adressen von Kunden und anderen Adressaten zumindest oberfl&auml;chlich zu pr&uuml;fen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662022,66042022,44000025],"tags":[],"class_list":["post-55001376","post","type-post","status-publish","format-standard","hentry","category-662022","category-66042022","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>E-Mail-Adressen validieren per VBA - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"E-Mail-Adressen validieren per VBA\" \/>\n<meta property=\"og:description\" content=\"Immer mehr Vorg&auml;nge werden per E-Mail verarbeitet. Dazu geh&ouml;ren auch Bestellungen, Rechnungen et cetera. Fr&uuml;her wurden beispielsweise Rechnungen an die Postadresse geschickt, was einigerma&szlig;en fehlertolerant war. Sp&auml;testens der Brieftr&auml;ger hat die falsche Hausnummer erkannt und die Sendung dank regelm&auml;&szlig;igem Zustellungsgebiet beim richtigen Adressaten abgeliefert. Bei E-Mails verh&auml;lt sich dies v&ouml;llig anders: Hier f&uuml;hrt jede Ungenauigkeit zur Unzustellbarkeit, toleriert werden allenfalls noch Abweichungen bei der Gro&szlig;-\/Kleinschreibung. Daher lohnt es sich, die E-Mail-Adressen von Kunden und anderen Adressaten zumindest oberfl&auml;chlich zu pr&uuml;fen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T18:11:20+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"E-Mail-Adressen validieren per VBA\",\"datePublished\":\"2022-08-04T18:11:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/\"},\"wordCount\":1802,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"4\\\/2022\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/\",\"name\":\"E-Mail-Adressen validieren per VBA - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-04T18:11:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/EMailAdressen_validieren_per_VBA\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"E-Mail-Adressen validieren per VBA\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"E-Mail-Adressen validieren per VBA - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/","og_locale":"de_DE","og_type":"article","og_title":"E-Mail-Adressen validieren per VBA","og_description":"Immer mehr Vorg&auml;nge werden per E-Mail verarbeitet. Dazu geh&ouml;ren auch Bestellungen, Rechnungen et cetera. Fr&uuml;her wurden beispielsweise Rechnungen an die Postadresse geschickt, was einigerma&szlig;en fehlertolerant war. Sp&auml;testens der Brieftr&auml;ger hat die falsche Hausnummer erkannt und die Sendung dank regelm&auml;&szlig;igem Zustellungsgebiet beim richtigen Adressaten abgeliefert. Bei E-Mails verh&auml;lt sich dies v&ouml;llig anders: Hier f&uuml;hrt jede Ungenauigkeit zur Unzustellbarkeit, toleriert werden allenfalls noch Abweichungen bei der Gro&szlig;-\/Kleinschreibung. Daher lohnt es sich, die E-Mail-Adressen von Kunden und anderen Adressaten zumindest oberfl&auml;chlich zu pr&uuml;fen.","og_url":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-04T18:11:20+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"12\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"E-Mail-Adressen validieren per VBA","datePublished":"2022-08-04T18:11:20+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/"},"wordCount":1802,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","4\/2022","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/","url":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/","name":"E-Mail-Adressen validieren per VBA - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-04T18:11:20+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/EMailAdressen_validieren_per_VBA\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"E-Mail-Adressen validieren per VBA"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001376","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001376"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001376\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001376"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001376"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001376"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}