{"id":55001364,"date":"2022-06-01T00:00:00","date_gmt":"2022-08-05T17:21:20","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1364"},"modified":"2023-06-15T17:00:09","modified_gmt":"2023-06-15T17:00:09","slug":"serienmails_versenden_mit_cdo","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/","title":{"rendered":"Serienmails versenden mit CDO"},"content":{"rendered":"<p><b>Zum Verwenden von Serienmails nutzt man meist Outlook und schreibt eine Mail an sich selbst, w\u00e4hrend man die Empf\u00e4nger dann m\u00f6glichst dem Feld BCC hinzuf\u00fcgt. Auf diese Weise bleibt der Datenschutz gewahrt, denn Sie wollen ja nicht jedem Empf\u00e4nger die E-Mail-Adressen aller anderen Empf\u00e4nger der Serienmail mitteilen. Der Nachteil ist, dass Sie so noch nicht einmal einfache Individualisierungen realisieren k\u00f6nnen wie etwa eine pers\u00f6nliche Anrede. Wenn Sie das erledigen wollen, versenden Sie per Automation aus einer Datenbank Nachrichten \u00fcber Outlook. Falls das nicht in Frage kommt, weil beispielsweise Outlook nicht auf dem Rechner installiert ist, k\u00f6nnen Sie noch eine Alternative nutzen, n\u00e4mlich die Bibliothek CDO. Im Beitrag &#8222;E-Mails versenden mit CDO&#8220; haben wir bereits die grundlegenden Techniken zum E-Mail-Versand mit dieser Bibliothek vorgestellt. Nun gehen wir einen Schritt weiter und zeigen, wie das auch noch f\u00fcr Serienmails gelingt.<\/b><\/p>\n<h2>Vorbereitung f\u00fcr den Einsatz der CDO-Bibliothek<\/h2>\n<p>Damit Sie die CDO-Bibliothek mit den Objekten und Methoden zum Versenden von E-Mails nutzen k\u00f6nnen, ben\u00f6tigen Sie einen Verweis auf diese Bibliothek. Diesen f\u00fcgen Sie \u00fcber den <b>Verweise<\/b>-Dialog hinzu, den Sie vom VBA-Editor aus \u00f6ffnen. Hier w\u00e4hlen Sie den Men\u00fceintrag <b>Extras|Verweise <\/b>und w\u00e4hlen dann im erscheinenden Dialog <b>Verweise<\/b> den Eintrag <b>Microsoft CDO for Windows 2000 Library <\/b>aus (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_001.png\" alt=\"Verweis auf die CDO-Bibliothek\" width=\"474,5589\" height=\"374,1123\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 1: Verweis auf die CDO-Bibliothek<\/span><\/b><\/p>\n<h2>Vorbereiten der Datenbank<\/h2>\n<p>Um die hier vorgestellten Techniken nutzen zu k\u00f6nnen, ben\u00f6tigen Sie zumindest eine Tabelle mit den Daten der E-Mail-Empf\u00e4nger. Diese sollte im besten Fall die Felder <b>Anrede<\/b>, <b>Vorname<\/b>, <b>Nachname <\/b>und <b>E-Mail-Adresse<\/b> enthalten.<\/p>\n<p>Wir haben eine solche Tabelle wie in Bild 2 definiert. Das dortige Feld <b>AnredeID<\/b> ist ein Fremdschl\u00fcsselfeld, mit dem Sie die Datens\u00e4tze der Tabelle <b>tblAnreden <\/b>ausw\u00e4hlen k\u00f6nnen. Diese enth\u00e4lt neben dem Prim\u00e4rschl\u00fcsselfeld <b>AnredeID<\/b> noch das Feld <b>Anrede <\/b>mit der Bezeichnung der Anrede sowie ein weiteres Feld namens Mailanrede, das wir mit einer Anrede speziell f\u00fcr die E-Mails gef\u00fcllt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_002.png\" alt=\"Beispieltabelle f\u00fcr Kundendaten im Entwurf\" width=\"424,5589\" height=\"270,8393\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 2: Beispieltabelle f\u00fcr Kundendaten im Entwurf<\/span><\/b><\/p>\n<p>Diese Tabelle sieht mit den Daten f\u00fcr die Anreden <b>Herr<\/b> und <b>Frau <\/b>wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_003.png\" alt=\"Tabelle mit den Anreden\" width=\"424,5589\" height=\"166,7217\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 3: Tabelle mit den Anreden<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblKunden <\/b>haben wir mit den Techniken aus dem Beitrag <b>Beispieldaten generieren mit .NET und Bogus <\/b>(<b>www.access-im-unternehmen.de\/1359<\/b>) gef\u00fcllt. Die Tabelle sieht anschlie\u00dfend wie in Bild 4 aus. Wir werden sp\u00e4ter nur die ersten zwei, drei Datens\u00e4tze, um testweise E-Mails zu versenden. Diesen f\u00fcgen wir daher tats\u00e4chlich vorhandene E-Mail-Adressen hinzu, bei denen wir auch pr\u00fcfen k\u00f6nnen, ob diese angekommen sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_004.png\" alt=\"Tabelle mit den aufgef\u00fcllten Datens\u00e4tzen\" width=\"700\" height=\"187,7049\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 4: Tabelle mit den aufgef\u00fcllten Datens\u00e4tzen<\/span><\/b><\/p>\n<h2>Speichern der SMTP-Konfiguration<\/h2>\n<p>Im Beitrag <b>E-Mails versenden mit CDO <\/b>(<b>www.access-im-unternehmen.de\/1363<\/b>) haben wir die Daten f\u00fcr den Zugriff auf den SMTP-Server, der f\u00fcr den Mailversand verwendet werden soll, direkt in den Code geschrieben.<\/p>\n<p>Das wollen wir in diesem Beitrag direkt ein wenig professioneller gestalten und die Daten in einer Tabelle unterbringen, deren Inhalte wir dann \u00fcber ein Formular anpassen k\u00f6nnen.<\/p>\n<p>Die Tabelle finden Sie in der Entwurfsansicht in Bild 5. Sie nimmt neben dem Prim\u00e4rschl\u00fcsselfeld zun\u00e4chst ein Feld zum Speichern der Bezeichnung eines Satzes von SMTP-Server-Daten auf. Danach folgen die Felder f\u00fcr die Adresse des SMTP-Servers, f\u00fcr den Benutzernamen und das Kennwort, unter dem die Anmeldung erfolgen soll, sowie gegebenenfalls der Port.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_005.png\" alt=\"Tabelle zum Speichern der SMTP-Konfiguration\" width=\"524,559\" height=\"405,0165\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 5: Tabelle zum Speichern der SMTP-Konfiguration<\/span><\/b><\/p>\n<h2>Auslesen der Konfiguration und Erstellen eines Configuration-Objekts<\/h2>\n<p>Zus\u00e4tzlich programmieren wir eine Funktion, der wir nur noch den Prim\u00e4rschl\u00fcsselwert der zu liefernden Konfiguration \u00fcbergeben. Diese soll dann ein fertiges <b>Configuration<\/b>-Objekt auf Basis der Daten aus dem entsprechenden Datensatz der Tabelle zur\u00fcckliefern.<\/p>\n<p>Diese Funktion sieht wie in Listing 1 aus. Sie erwartet den Parameter <b>lngConfigurationID <\/b>und liefert ein Objekt des Typs <b>Configuration <\/b>zur\u00fcck. Sie erzeugt ein <b>Database<\/b>-Objekt auf Basis der aktuellen Datenbank und ein Recordset mit dem Datensatz der Tabelle <b>tblConfigurations<\/b>, dessen Wert im Feld <b>ConfigurationID <\/b>dem mit <b>lngConfiguration-ID <\/b>\u00fcbergebenen Parameter entspricht.<\/p>\n<pre><span style=\"color: blue;\">Public Function <\/span>GetConfiguration(lngConfigurationID<span style=\"color: blue;\"> As Long<\/span>)<span style=\"color: blue;\"> As <\/span>CDO.Configuration\r\n     <span style=\"color: blue;\">Dim <\/span>objConfiguration<span style=\"color: blue;\"> As <\/span>CDO.Configuration\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;\">Dim <\/span>strSMTPServer<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strPort<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strUsername<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strPassword<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color: blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblConfigurations WHERE ConfigurationID = \" &amp; lngConfigurationID, _\r\n         dbOpenDynaset)\r\n     strSMTPServer = rst!SMTPServer\r\n     strPort = Nz(rst!Port, \"\")\r\n     strUsername = rst!UserName\r\n     strPassword = rst!Password\r\n     <span style=\"color: blue;\">Set<\/span> objConfiguration = <span style=\"color: blue;\">New<\/span> CDO.Configuration\r\n     <span style=\"color: blue;\">With<\/span> objConfiguration\r\n         .Fields(cdoSendUsingMethod).Value = cdoSendUsingPort\r\n         .Fields(cdoSMTPServer).Value = strSMTPServer\r\n         <span style=\"color: blue;\">Debug.Print<\/span> .Fields(cdoSMTPServerPort)\r\n         <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> <span style=\"color: blue;\">Len<\/span>(strPort) = 0<span style=\"color: blue;\"> Then<\/span>\r\n             .Fields(cdoSMTPServerPort).Value = strPort\r\n         <span style=\"color: blue;\">End If<\/span>\r\n         .Fields(cdoSMTPUseSSL).Value = \"true\"\r\n         .Fields(cdoSMTPAuthenticate).Value = cdoBasic\r\n         .Fields(cdoSendUserName).Value = strUsername\r\n         .Fields(cdoSendPassword).Value = strPassword\r\n         .Fields.Update\r\n     End <span style=\"color: blue;\">With<\/span>\r\n     <span style=\"color: blue;\">Set<\/span> GetConfiguration = objConfiguration\r\n<span style=\"color: blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 1: Funktion zum Ermitteln eines Configuration-Objekts<\/span><\/b><\/p>\n<p>Aus diesem Recordset liest die Funktion die einzelnen Feldwerte aus und schreibt diese in die Variablen <b>strSMTPServer<\/b>, <b>strPort<\/b>, <b>strUsername <\/b>und <b>strPassword<\/b>. Dann erstellt sie ein neues Objekt des Typs <b>CDO.Configuration <\/b>und weist den Eigenschaften dieses Objekts die Werte aus den Textfeldern zu &#8211; neben einigen Werten f\u00fcr Eigenschaften, die immer gleich sind wie etwa f\u00fcr <b>cboSendUsingMethode<\/b>, <b>cdoSMTPUserSSL <\/b>oder <b>cdoSMTP-Authenticate<\/b>. Nachdem alle relevanten Eigenschaften gef\u00fcllt sind, gibt die Funktion das mit <b>objConfiguration <\/b>referenzierte Objekt als Ergebnis zur\u00fcck.<\/p>\n<h2>Serien-E-Mails verschicken<\/h2>\n<p>In der L\u00f6sung aus dem Beitrag <b>E-Mails senden mit CDO <\/b>(<b>www.access-im-unternehmen.de\/1363<\/b>) haben wir das Zusammenstellen des <b>Configuration<\/b>-Objekts und des <b>Message<\/b>-Objekts, das zum Versenden einer E-Mail dient, in einer Prozedur erstellt. Das ist beim Versand einer Serienmail nicht sinnvoll &#8211; wenn immer der gleiche SMTP-Server mit den gleichen Anmeldedaten zum Einsatz kommt, brauchen wir nicht f\u00fcr jede E-Mail erneut ein <b>Configuration<\/b>-Objekt zu erstellen. Wenn wir also gleich eine Prozedur programmieren, mit der wir die Empf\u00e4nger der E-Mail durchlaufen, wird dies ber\u00fccksichtigen werden.<br \/>\nF\u00fcr das Versenden einer Serienmail ben\u00f6tigen wir noch einige Daten, die wir am Besten auch direkt in einer eigenen Tabelle speichern. Dabei handelt es sich um die Daten, die f\u00fcr jede Mail eines Mailings gleich sind, also:<\/p>\n<ul>\n<li>E-Mail-Adresse des Absenders<\/li>\n<li>Betreff der E-Mail<\/li>\n<li>Inhalt der E-Mail, gegebenenfalls mit Platzhaltern<\/li>\n<li>Anh\u00e4nge f\u00fcr die E-Mail, gegebenenfalls mit Platzhaltern<\/li>\n<\/ul>\n<p>Diese Daten speichern wir in der Tabelle <b>tblMailings <\/b>aus Bild 6. Neben den genannten Daten nimmt diese Tabelle nur noch ein Prim\u00e4rschl\u00fcsselfeld auf sowie ein Feld f\u00fcr die Bezeichnung des Mailings. F\u00fcr das Feld <b>Mailingname<\/b> haben wir einen eindeutigen Index festgelegt, damit wir die Mailings danach unterscheiden k\u00f6nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_006.png\" alt=\"Tabelle zum Speichern der Daten eines Mailings\" width=\"499,5589\" height=\"397,3961\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 6: Tabelle zum Speichern der Daten eines Mailings<\/span><\/b><\/p>\n<p>Sie k\u00f6nnen der Tabelle noch beliebige weitere Felder hinzuf\u00fcgen &#8211; beispielsweise f\u00fcr das Datum, an dem das Mailing verschickt werden soll oder Sie speichern darin Informationen dar\u00fcber, welche Tabelle f\u00fcr das Zusammenstellen der Empf\u00e4nger verwendet wurde und nach welchen Kriterien diese Zusammenstellung erfolgte.<\/p>\n<p>Ein Beispiel f\u00fcr die allgemeinen Daten eines Mailing k\u00f6nnen Sie Bild 7 entnehmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_007.png\" alt=\"Tabelle zum Speichern der Daten eines Mailings mit Beispieldaten\" width=\"700\" height=\"203,8168\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 7: Tabelle zum Speichern der Daten eines Mailings mit Beispieldaten<\/span><\/b><\/p>\n<h2>Prozedur zum Steuern des Mailversands<\/h2>\n<p>Die Prozedur aus Listing 2 \u00fcbernimmt die Steuerung des Mailversands. Sie erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>Serienmail(lngConfigurationID<span style=\"color: blue;\"> As Long<\/span>, lngMailingID<span style=\"color: blue;\"> As Long<\/span>, strSQLTo<span style=\"color: blue;\"> As String<\/span>, strMailfield<span style=\"color: blue;\"> As String<\/span>)\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>rstMailing<span style=\"color: blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color: blue;\">Dim <\/span>rstTo<span style=\"color: blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color: blue;\">Dim <\/span>strTo<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strFrom<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strSubject<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strTextbody<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>strAttachments<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>objConfiguration<span style=\"color: blue;\"> As <\/span>CDO.Configuration\r\n     <span style=\"color: blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color: blue;\">Set<\/span> objConfiguration = GetConfiguration(lngConfigurationID)\r\n     <span style=\"color: blue;\">Set<\/span> rstMailing = db.OpenRecordset(\"SELECT * FROM tblMailings WHERE MailingID = \" &amp; lngMailingID, dbOpenDynaset)\r\n     strFrom = rstMailing!Sender\r\n     strSubject = rstMailing!Subject\r\n     strTextbody = rstMailing!Textbody\r\n     strAttachments = Nz(rstMailing!Attachments, \"\")\r\n     <span style=\"color: blue;\">Set<\/span> rstTo = db.OpenRecordset(strSQLTo, dbOpenDynaset)\r\n     <span style=\"color: blue;\">Do While<\/span> <span style=\"color: blue;\">Not<\/span> rstTo.EOF\r\n         strTo = rstTo.Fields(strMailfield)\r\n         SendMailing objConfiguration, strTo, strFrom, strSubject, strTextbody, \"\", strAttachments\r\n         rstTo.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: Prozedur zum Steuern des Mailversands<\/span><\/b><\/p>\n<ul>\n<li><b>lngConfigurationID<\/b>: Prim\u00e4rschl\u00fcsselwert des Datensatzes der Tabelle <b>tblConfigurations<\/b>, der zum F\u00fcllen des <b>Configuration<\/b>-Objekts verwendet werden soll<\/li>\n<li><b>lngMailingID<\/b>: Prim\u00e4rschl\u00fcsselfeld des Datensatzes der Tabelle <b>tblMailings<\/b>, mit dessen Daten die E-Mail gef\u00fcllt werden soll<\/li>\n<li><b>strSQLTo<\/b>: SQL-Abfrage, die angibt, welche Datens\u00e4tze der entsprechenden Tabelle in den Mailversand einbezogen werden sollen<\/li>\n<li><b>strMailfield<\/b>: Feld der SQL-Abfrage aus <b>strSQLTo<\/b>, welches die E-Mail-Adressen enth\u00e4lt<\/li>\n<\/ul>\n<p>Die Prozedur erstellt ein <b>Database<\/b>-Objekt namens <b>db <\/b>mit einem Verweis auf die aktuelle Datenbank. Dann holt sie mit der bereits vorgestellten Funktion <b>GetConfiguration <\/b>das <b>Configuration<\/b>-Objekt f\u00fcr die ID aus <b>lngConfiguration-ID<\/b>.<\/p>\n<p>Dann f\u00fcllt sie ein Recordset namens <b>rstMailing <\/b>mit den Daten des Datensatzes der Tabelle <b>tblMailings<\/b>, dessen Prim\u00e4rschl\u00fcsselwert mit <b>lngMailingID <\/b>\u00fcbereinstimmt. Aus diesem liest sie die Daten f\u00fcr die Variablen <b>strFrom<\/b>, <b>strSubject<\/b>, <b>strTextBody <\/b>und <b>strAttachments <\/b>aus.<\/p>\n<p>Dann \u00f6ffnet sie ein weiteres Recordset auf Basis der mit <b>strSQLTo <\/b>\u00fcbermittelten Abfrage. Diese k\u00f6nnte beispielsweise wie folgt lauten:<\/p>\n<pre>SELECT * FROM tblKunden WHERE KundeID = 1<\/pre>\n<p>In diesem Fall liefert das Recordset nur einen einzigen Datensatz, was zu Testzwecken aber ausreicht. Die Datens\u00e4tze dieses Recordsets durchl\u00e4uft die Prozedur dann in einer <b>Do While<\/b>-Schleife. Innerhalb dieser Schleife liest die Prozedur die E-Mail-Adresse des Empf\u00e4ngers der E-Mail aus dem Feld aus <b>strMailfield <\/b>in die Variable <b>strTo <\/b>ein.<\/p>\n<p>Damit hat die Prozedur alle Informationen zusammen, um eine weitere Prozedur namens <b>SendMailing <\/b>aufzurufen, welche die eigentliche Arbeit erledigt &#8211; n\u00e4mlich den Versand der E-Mail.<\/p>\n<p>Auf diese Weise werden E-Mails an alle Eintr\u00e4ge der Empf\u00e4ngerliste verschickt.<\/p>\n<h2>Prozedur zum Verwenden der E-Mails<\/h2>\n<p>Die Prozedur <b>SendMailing <\/b>erwartet die folgenden Parameter (siehe Listing 3):<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>SendMailing(objConfiguration<span style=\"color: blue;\"> As <\/span>CDO.Configuration, strTo<span style=\"color: blue;\"> As String<\/span>, strFrom<span style=\"color: blue;\"> As String<\/span>, _\r\n         strSubject<span style=\"color: blue;\"> As String<\/span>, strTextbody<span style=\"color: blue;\"> As String<\/span>, <span style=\"color: blue;\">Optional<\/span> strBCC<span style=\"color: blue;\"> As String<\/span>, <span style=\"color: blue;\">Optional<\/span> strAttachments<span style=\"color: blue;\"> As String<\/span>)\r\n     <span style=\"color: blue;\">Dim <\/span>objMessage<span style=\"color: blue;\"> As <\/span>CDO.Message\r\n     <span style=\"color: blue;\">Dim <\/span>varAttachment<span style=\"color: blue;\"> As Variant<\/span>\r\n     <span style=\"color: blue;\">Set<\/span> objMessage = <span style=\"color: blue;\">New<\/span> CDO.Message\r\n     <span style=\"color: blue;\">With<\/span> objMessage\r\n         <span style=\"color: blue;\">Set<\/span> .Configuration = objConfiguration\r\n         .To = strTo\r\n         .From = strFrom\r\n         .Subject = strSubject\r\n         .Textbody = strTextbody\r\n         <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> <span style=\"color: blue;\">Len<\/span>(strBCC) = 0<span style=\"color: blue;\"> Then<\/span>\r\n             .BCC = strBCC\r\n         <span style=\"color: blue;\">End If<\/span>\r\n         <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> <span style=\"color: blue;\">Len<\/span>(strAttachments) = 0<span style=\"color: blue;\"> Then<\/span>\r\n             For Each varAttachment In <span style=\"color: blue;\">Split<\/span>(strAttachments, \";\")\r\n                 .AddAttachment varAttachment\r\n             <span style=\"color: blue;\">Next<\/span> varAttachment\r\n         <span style=\"color: blue;\">End If<\/span>\r\n         On Error Resume <span style=\"color: blue;\">Next<\/span>\r\n         .Send\r\n         <span style=\"color: blue;\">If <\/span><span style=\"color: blue;\">Not<\/span> Err.Number = 0<span style=\"color: blue;\"> Then<\/span>\r\n             <span style=\"color: blue;\">Debug.Print<\/span> Err.Number, Err.Description\r\n         <span style=\"color: blue;\">End If<\/span>\r\n     End <span style=\"color: blue;\">With<\/span>\r\n     <span style=\"color: blue;\">Set<\/span> objMessage = Nothing\r\n<span style=\"color: blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 3: Prozedur zum Versenden einer E-Mail<\/span><\/b><\/p>\n<ul>\n<li><b>objConfiguration<\/b>: Das mit der Funktion <b>GetConfiguration <\/b>ermittelte und mit den Daten aus der Tabelle <b>tblConfiguration <\/b>gef\u00fcllte Objekt des Typs <b>CDO.Configuration<\/b><\/li>\n<li><b>strTo<\/b>: Empf\u00e4ngeradresse<\/li>\n<li><b>strFrom<\/b>: Absenderadresse<\/li>\n<li><b>strSubject<\/b>: Betreff der E-Mail<\/li>\n<li><b>strTextbody<\/b>: Inhalt der E-Mail<\/li>\n<li><b>strBCC<\/b>: optionaler Parameter zur Angabe einer E-Mail-Adresse, welche die E-Mail als Kontrolle erhalten soll<\/li>\n<li><b>strAttachments<\/b>: optionaler Parameter zur Angabe von Anlagen. Diese werden als durch Semikola getrennte Pfadangaben \u00fcbermittelt.<\/li>\n<\/ul>\n<p>Die Prozedur erstellt ein neues Objekt des Typs <b>CDO.Message <\/b>und referenziert dieses mit der Variablen <b>objMessage<\/b>. Danach stellt es einige Eigenschaften f\u00fcr dieses Objekt ein. Das Objekt aus dem Parameter <b>objConfiguration <\/b>landet in der Eigenschaft <b>Configuration<\/b>, <b>strTo <\/b>in der Eigenschaft <b>To<\/b>, <b>strFrom <\/b>in der Eigenschaft <b>From <\/b>sowie <b>strSubject <\/b>und <b>strTextbody <\/b>in den Eigenschaften <b>Subject <\/b>und <b>Textbody<\/b>.<\/p>\n<p>Sollte beim Aufruf ein Wert f\u00fcr <b>strBCC <\/b>\u00fcbergeben worden sein, landet dieser in der Eigenschaft <b>BCC<\/b>.<\/p>\n<p>Hat <b>strAttachments <\/b>nicht die L\u00e4nge <b>0<\/b>, teilen wir die durch Semikola getrennten Abschnitte mit der <b>Split<\/b>-Funktion in ein Array auf und durchlaufen dieses in einer <b>For Each<\/b>-Schleife. Darin weist sie die einzelnen Elemente mit der <b>AddAttachment<\/b>-Methode dem <b>Message<\/b>-Objekt zu.<\/p>\n<p>Schlie\u00dflich sendet die Prozedur die E-Mail mit der <b>Send<\/b>-Methode ab und pr\u00fcft bei deaktivierter Fehlerbehandlung noch, ob dabei ein Fehler aufgetreten ist.<\/p>\n<h2>Beispielaufruf zum Versenden von Mailings<\/h2>\n<p>Den Aufruf der Prozedur <b>SendMailing <\/b>haben wir, wie oben beschrieben, in die Prozedur <b>Serienmail <\/b>untergebracht. Diese rufen wir beispielsweise wie folgt auf:<\/p>\n<pre>Serienmail 1, 1, \"SELECT * FROM tblKunden  WHERE KundeID = 1\", \"EMail\"<\/pre>\n<p>Das bedeutet, dass wir die Konfiguration mit dem Wert <b>1 <\/b>im Feld <b>ConfigurationID <\/b>aus der Tabelle <b>tblConfigurations <\/b>verwenden, um das Mailing mit dem Wert <b>1 <\/b>im Feld <b>MailingID <\/b>aus der Tabelle <b>tblMailings <\/b>zu versenden. Als Empf\u00e4nger verwenden wir die Daten aus der mit <b>SELECT * FROM tblKunden WHERE KundeID = 1 <\/b>angegebenen Datenquelle, wobei wir dem Feld <b>EMail <\/b>die Empf\u00e4ngeradressen entnehmen.<\/p>\n<p>Das gelingt auch, wie die anschlie\u00dfend empfangene E-Mail aus Bild 8 best\u00e4tigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_008.png\" alt=\"Eine versendete Beispiel-E-Mail\" width=\"624,559\" height=\"465,7563\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 8: Eine versendete Beispiel-E-Mail<\/span><\/b><\/p>\n<h2>Platzhalter ersetzen<\/h2>\n<p>Allerdings sehen wir hier noch eine offene Aufgabe. Wir haben im Feld <b>TextBody <\/b>der Tabelle einen Inhalt mit Platzhaltern gespeichert:<\/p>\n<pre>[Mailanrede] [Nachname],\r\ndies ist eine Testserienmail.\r\nViele Gr\u00fc\u00dfe\r\nAndr\u00e9 Minhorst<\/pre>\n<p>Diese sollten nat\u00fcrlich noch durch entsprechende Daten ersetzt werden &#8211; in der soeben versendeten E-Mail finden wir noch den Platzhaltertext vor. Dazu legen wir eine weitere Funktion namens <b>ReplacePlaceholders <\/b>mit den folgenden Parametern an:<\/p>\n<ul>\n<li><b>strTextbody<\/b>: Der aus dem Feld <b>TextBody <\/b>der Tabelle <b>tblMailings <\/b>entnommene Text f\u00fcr die E-Mail<\/li>\n<li><b>rst<\/b>: Recordset mit dem aktuellen Datensatz der Daten des Empf\u00e4ngers f\u00fcr die aktuell zu versendende E-Mail<\/li>\n<\/ul>\n<p>Den Aufruf dieser Funktion platzieren wir in der Prozedur Serienmail innerhalb der <b>For&#8230;Next<\/b>-Schleife, welche die Eintr\u00e4ge der Kundentabelle mit den Empf\u00e4ngerdaten durchl\u00e4uft. Dort rufen wir die Funktion <b>ReplacePlaceholders <\/b>auf und \u00fcbergeben den Inhalt aus <b>strTextBody <\/b>sowie das Recordset <b>rstTo<\/b>, dessen Datensatzzeiger auf den aktuell zu verwendenden Kundendatensatz verweist (siehe Listing 4).<\/p>\n<pre><span style=\"color: blue;\">Public Sub <\/span>Serienmail(lngConfiguration<span style=\"color: blue;\"> As Long<\/span>, lngMailingID<span style=\"color: blue;\"> As Long<\/span>, strSQLTo<span style=\"color: blue;\"> As String<\/span>, strMailfield<span style=\"color: blue;\"> As String<\/span>)\r\n     ...\r\n     <span style=\"color: blue;\">Do While<\/span> <span style=\"color: blue;\">Not<\/span> rstTo.EOF\r\n         strTo = rstTo.Fields(strMailfield)\r\n         strTextbody = ReplacePlaceholders(strTextbody, rstTo)\r\n         SendMailing objConfiguration, strTo, strFrom, strSubject, strTextbody, \"\", strAttachments\r\n         rstTo.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 4: Erweiterung der Prozedur Serienmail<\/span><\/b><\/p>\n<p>Die Funktion <b>ReplacePlaceholders <\/b>finden Sie schlie\u00dflich in Listing 5. Die Funktion deklariert eine <b>Field<\/b>-Variable namens <b>fld<\/b>. Diese nutzen wir, um alle <b>Field<\/b>-Elemente der <b>Fields<\/b>-Auflistung des mit <b>rst <\/b>\u00fcbergebenen Recordsets zu durchlaufen. \u00dcber die <b>Field<\/b>-Elemente haben wir Zugriff auf zwei wichtige Eigenschaften f\u00fcr den aktuellen Datensatz: Wir k\u00f6nnen mit der <b>Name<\/b>-Eigenschaft den Namen des Feldes ermitteln und mit der <b>Value<\/b>-Eigenschaft den Inhalt des jeweiligen Feldes. In der <b>For Each<\/b>-Schleife durchlaufen wir also alle Felder des \u00fcbergebenen Recordsets wie <b>Vorname<\/b>, <b>Nachname<\/b>, <b>EMail <\/b>und so weiter.<\/p>\n<pre><span style=\"color: blue;\">Public Function <\/span>ReplacePlaceholders(ByVal strTextbody<span style=\"color: blue;\"> As String<\/span>, ByVal rst<span style=\"color: blue;\"> As <\/span>DAO.Recordset)<span style=\"color: blue;\"> As String<\/span>\r\n     <span style=\"color: blue;\">Dim <\/span>fld<span style=\"color: blue;\"> As <\/span>DAO.Field\r\n     For Each fld In rst.Fields\r\n         strTextbody = <span style=\"color: blue;\">Replace<\/span>(strTextbody, \"[\" &amp; fld.Name &amp; \"]\", fld.Value)\r\n     <span style=\"color: blue;\">Next<\/span> fld\r\n     ReplacePlaceholders = strTextbody\r\n<span style=\"color: blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color: darkgrey;\">Listing 5: Funktion zum Ersetzen von Platzhaltern<\/span><\/b><\/p>\n<p>Innerhalb der <b>For Each<\/b>-Schleife ersetzen wir mit der <b>Replace<\/b>-Funktion in <b>strTextbody<\/b> eine Zeichenkette, die aus einer \u00f6ffnenden eckigen Klammer, dem Feldnamen und und einer schlie\u00dfenden eckigen Klammer besteht, durch den Wert des Feldes f\u00fcr diesen Datensatz. Wir suchen also beispielsweise nach der Zeichenkette <b>[Nachname<\/b>] und ersetzen diese durch den tats\u00e4chlichen Nachnamen des aktuellen Datensatzes. Auf diese Weise ersetzen wir alle Platzhalter, deren Bezeichnung einem der Felder des Recordsets entspricht.<\/p>\n<p>Im ersten Versuch mit dem obigen Aufruf gelingt das noch nicht vollst\u00e4ndig, denn hier wird nur der Platzhalter <b>[Nachname] <\/b>ersetzt. Das ist leicht nachvollziehbar, denn unser \u00fcbergebener SQL-Ausdruck enth\u00e4lt gar kein Feld namens <b>Mailanrede<\/b>. Diese finden wir erst in der mit der Tabelle <b>tblKunden <\/b>verkn\u00fcpften Tabelle <b>tblAnreden<\/b>. Wir m\u00fcssen also schlicht die Datenquelle f\u00fcr die Serienmail erweitern, indem wir die Tabelle <b>tblAnreden <\/b>hinzunehmen. Der Aufruf sieht dann wie folgt aus:<\/p>\n<pre>Serienmail 1, 1, \"SELECT * FROM tblKunden INNER JOIN  tblAnreden ON tblKunden.AnredeID = tblAnreden.AnredeID  WHERE KundeID = 1\", \"EMail\"<\/pre>\n<p>Damit wird nun auch der Platzhalter Mailanrede ersetzt und wir erhalten nach dem Versand die E-Mail aus Bild 9.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_03\/pic_1364_009.png\" alt=\"Beispiel-E-Mail mit ersetzten Platzhaltern\" width=\"624,559\" height=\"465,7563\" \/><\/p>\n<p><b><span style=\"color: darkgrey;\">Bild 9: Beispiel-E-Mail mit ersetzten Platzhaltern<\/span><\/b><\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Nach dem Grundlagenbeitrag \u00fcber das Verwenden von E-Mails mit der CDO-Bibliothek finden Sie in diesem Beitrag auch noch die Techniken, um eine Serienmail per CDO auf den Weg zu bringen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SerienmailsMitCDO.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/1DEA0C5B-C497-4E12-B0FD-A2A4B0BCB109\/aiu_1364.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zum Verwenden von Serienmails nutzt man meist Outlook und schreibt eine Mail an sich selbst, w&auml;hrend man die Empf&auml;nger dann m&ouml;glichst dem Feld BCC hinzuf&uuml;gt. Auf diese Weise bleibt der Datenschutz gewahrt, denn Sie wollen ja nicht jedem Empf&auml;nger die E-Mail-Adressen aller anderen Empf&auml;nger der Serienmail mitteilen. Der Nachteil ist, dass Sie so noch nicht einmal einfache Individualisierungen realisieren k&ouml;nnen wie etwa eine pers&ouml;nliche Anrede. Wenn Sie das erledigen wollen, versenden Sie per Automation aus einer Datenbank Nachrichten &uuml;ber Outlook. Falls das nicht in Frage kommt, weil beispielsweise Outlook nicht auf dem Rechner installiert ist, k&ouml;nnen Sie noch eine Alternative nutzen, n&auml;mlich die Bibliothek CDO. Im Beitrag &#8222;E-Mails mit CDO&#8220; haben wir bereits die grundlegenden Techniken zum Versenden von E-Mails mit dieser Bibliothek vorgestellt. Nun gehen wir einen Schritt weiter und zeigen, wie das auch noch f&uuml;r Serienmails gelingt.<\/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,66032022,44000026],"tags":[],"class_list":["post-55001364","post","type-post","status-publish","format-standard","hentry","category-662022","category-66032022","category-Interaktiv"],"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>Serienmails versenden mit CDO - Access im Unternehmen<\/title>\n<meta name=\"description\" content=\"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.\" \/>\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\/serienmails_versenden_mit_cdo\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Serienmails versenden mit CDO\" \/>\n<meta property=\"og:description\" content=\"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-05T17:21:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-15T17:00:09+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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Serienmails versenden mit CDO\",\"datePublished\":\"2022-08-05T17:21:20+00:00\",\"dateModified\":\"2023-06-15T17:00:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/\"},\"wordCount\":2073,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2022\",\"3\\\/2022\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/\",\"name\":\"Serienmails versenden mit CDO - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2022-08-05T17:21:20+00:00\",\"dateModified\":\"2023-06-15T17:00:09+00:00\",\"description\":\"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/serienmails_versenden_mit_cdo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Serienmails versenden mit CDO\"}]},{\"@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":"Serienmails versenden mit CDO - Access im Unternehmen","description":"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.","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\/serienmails_versenden_mit_cdo\/","og_locale":"de_DE","og_type":"article","og_title":"Serienmails versenden mit CDO","og_description":"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.","og_url":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/","og_site_name":"Access im Unternehmen","article_published_time":"2022-08-05T17:21:20+00:00","article_modified_time":"2023-06-15T17:00:09+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Serienmails versenden mit CDO","datePublished":"2022-08-05T17:21:20+00:00","dateModified":"2023-06-15T17:00:09+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/"},"wordCount":2073,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2022","3\/2022","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/","url":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/","name":"Serienmails versenden mit CDO - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2022-08-05T17:21:20+00:00","dateModified":"2023-06-15T17:00:09+00:00","description":"Versende Serien-E-Mails von Microsoft Access aus per VBA und nutze dabei die CDO-Bibliothek. So ist kein Outlook mehr n\u00f6tig.","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/serienmails_versenden_mit_cdo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Serienmails versenden mit CDO"}]},{"@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\/55001364","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=55001364"}],"version-history":[{"count":2,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001364\/revisions"}],"predecessor-version":[{"id":88074226,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001364\/revisions\/88074226"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}