{"id":13071,"date":"2026-08-28T16:10:18","date_gmt":"2026-08-28T14:10:18","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/email-tracking-pixel-auditor\/"},"modified":"2026-08-28T16:10:18","modified_gmt":"2026-08-28T14:10:18","slug":"email-tracking-pixel-auditor","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/","title":{"rendered":"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Piksel \u015bledz\u0105cy to obraz o boku jednego piksela, pobierany z serwera w chwili otwarcia wiadomo\u015bci. To pobranie jest ca\u0142ym sednem prawnym: nast\u0119puje na urz\u0105dzeniu ko\u0144cowym osoby czytaj\u0105cej. Tutaj wypisywany jest ka\u017cdy zas\u00f3b zdalny wiadomo\u015bci, oddzielane jest to, co si\u0119ga serwera, od tego, co go nie si\u0119ga, i oznaczane s\u0105 adresy nios\u0105ce identyfikator, kt\u00f3ry przypisuje otwarcie pojedynczej odbiorczyni.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"ep-quelle\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">\u0179r\u00f3d\u0142o wiadomo\u015bci, cz\u0119\u015b\u0107 HTML<\/label><br \/>\n        <textarea id=\"ep-quelle\" rows=\"10\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace; font-size: 0.8rem;\"><\/textarea>\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">\u0179r\u00f3d\u0142o jest rozbierane przez DOMParser. Powstaj\u0105cy dokument nie ma kontekstu przegl\u0105dania: niczego nie doczytuje i niczego nie wykonuje, wi\u0119c sprawdzenie e-maila nie uruchamia tu w\u0142a\u015bnie tych pikseli, o kt\u00f3re chodzi. Nic nie jest przesy\u0142ane ani zapisywane. Uwagi prawne oddaj\u0105 zalecenie CNIL z 14 kwietnia 2026 i jego FAQ z 22 lipca 2026.<\/p>\n<p>    <button id=\"ep-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Sprawd\u017a<\/button><\/p>\n<div id=\"ep-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Piksel \u015bledz\u0105cy to obraz o boku jednego piksela, pobierany z serwera w chwili otwarcia wiadomo\u015bci. To pobranie jest ca\u0142ym sednem prawnym: nast\u0119puje na urz\u0105dzeniu ko\u0144cowym osoby czytaj\u0105cej. Tutaj wypisywany jest ka\u017cdy zas\u00f3b zdalny wiadomo\u015bci, oddzielane jest to, co si\u0119ga serwera, od tego, co go nie si\u0119ga, i oznaczane s\u0105 adresy nios\u0105ce identyfikator, kt\u00f3ry przypisuje otwarcie pojedynczej odbiorczyni.\",\"label_quelle\":\"\u0179r\u00f3d\u0142o wiadomo\u015bci, cz\u0119\u015b\u0107 HTML\",\"datenschutz\":\"\u0179r\u00f3d\u0142o jest rozbierane przez DOMParser. Powstaj\u0105cy dokument nie ma kontekstu przegl\u0105dania: niczego nie doczytuje i niczego nie wykonuje, wi\u0119c sprawdzenie e-maila nie uruchamia tu w\u0142a\u015bnie tych pikseli, o kt\u00f3re chodzi. Nic nie jest przesy\u0142ane ani zapisywane. Uwagi prawne oddaj\u0105 zalecenie CNIL z 14 kwietnia 2026 i jego FAQ z 22 lipca 2026.\",\"knopf\":\"Sprawd\u017a\",\"beispiel\":\"\\u003Chtml\\u003E\\n\\u003Cbody style=\\u0022background-image:url(https:\\\/\\\/cdn.newsletter.example.net\\\/bg\\\/paper.png)\\u0022\\u003E\\n\\u003Cp\\u003EHello,\\u003C\\\/p\\u003E\\n\\u003Cimg src=\\u0022https:\\\/\\\/cdn.newsletter.example.net\\\/logo.png\\u0022 width=\\u0022180\\u0022 height=\\u002240\\u0022 alt=\\u0022Logo\\u0022\\u003E\\n\\u003Cimg src=\\u0022data:image\\\/gif;base64,R0lGODlhAQABAAAAACw=\\u0022 width=\\u002212\\u0022 height=\\u002212\\u0022 alt=\\u0022dot\\u0022\\u003E\\n\\u003Cimg src=\\u0022cid:signature-block-1\\u0022 width=\\u0022200\\u0022 height=\\u002260\\u0022 alt=\\u0022Signature\\u0022\\u003E\\n\\u003Cp\\u003ERead the \\u003Ca href=\\u0022https:\\\/\\\/click.newsletter.example.net\\\/ls\\\/click?upn=aGVsbG8tdGVzdC1yZWNpcGllbnQtaWQ\\u0022\\u003Efull article on example.com\\u003C\\\/a\\u003E.\\u003C\\\/p\\u003E\\n\\u003Cp\\u003E\\u003Ca href=\\u0022https:\\\/\\\/example.com\\\/unsubscribe?email=anna.beispiel%40example.org\\u0022\\u003EUnsubscribe\\u003C\\\/a\\u003E\\u003C\\\/p\\u003E\\n\\u003Cimg src=\\u0022https:\\\/\\\/open.newsletter.example.net\\\/o\\\/9f2c1ab47de35061c8b04f2a?e=anna.beispiel%40example.org\\u0022 width=\\u00221\\u0022 height=\\u00221\\u0022 alt=\\u0022\\u0022\\u003E\\n\\u003C\\\/body\\u003E\\n\\u003C\\\/html\\u003E\",\"h_zusammenfassung\":\"Podsumowanie\",\"zeile_abrufe\":\"Pobrania przy otwarciu\",\"zeile_hosts\":\"R\u00f3\u017cne zaczepione hosty\",\"zeile_zaehlpixel\":\"Niewidoczne obrazy\",\"zeile_kennung\":\"Adresy z identyfikatorem\",\"zeile_umschrieben\":\"Przepisane odno\u015bniki\",\"zeile_ohne_abruf\":\"Osadzone, bez pobrania\",\"h_ressourcen\":\"Zasoby zdalne\",\"spalte_art\":\"Rodzaj\",\"spalte_host\":\"Host\",\"spalte_masse\":\"Wymiary\",\"spalte_befund\":\"Ustalenie\",\"art_img\":\"Obraz\",\"art_srcset\":\"Obraz, srcset\",\"art_rahmen\":\"Ramka\",\"art_medien\":\"Media\",\"art_stil\":\"Arkusz styl\u00f3w\",\"art_hintergrund\":\"Obraz t\u0142a\",\"schema_data\":\"osadzone, data:\",\"schema_cid\":\"za\u0142\u0105czone, cid:\",\"schema_relativ\":\"wzgl\u0119dne, nieosi\u0105galne\",\"befund_kein_abruf\":\"nie si\u0119ga \u017cadnego serwera\",\"befund_zaehlpixel\":\"niewidoczny: sygna\u0142, a nie obraz\",\"befund_abruf\":\"pobranie przy otwarciu\",\"befund_verweis\":\"odno\u015bnik\",\"befund_umschrieben\":\"przepisany: widoczny host to nie cel\",\"befund_kennung_mailadresse\":\"niesie adres odbiorcy\",\"befund_kennung_parameter\":\"niesie parametr odbiorcy\",\"befund_kennung_brocken\":\"niesie nieprzejrzysty identyfikator odbiorcy\",\"h_verweise\":\"Odno\u015bniki\",\"spalte_text\":\"Widoczny tekst\",\"spalte_ziel\":\"Host docelowy\",\"h_hinweise\":\"Uwagi\",\"hinweis_keine_eingabe\":\"Nie ma jeszcze czego sprawdza\u0107 - \u017ar\u00f3d\u0142o wiadomo\u015bci nale\u017cy do pola powy\u017cej.\",\"hinweis_kein_abruf\":\"Brak zasob\u00f3w zdalnych. Otwarcie tej wiadomo\u015bci nie si\u0119ga \u017cadnego serwera, nic nie jest wi\u0119c odczytywane z urz\u0105dzenia ko\u0144cowego, a artyku\u0142 5 ust\u0119p 3 nie ma si\u0119 czego uchwyci\u0107.\",\"hinweis_zugriff\":\"Ka\u017cde pobranie powy\u017cej nast\u0119puje na urz\u0105dzeniu ko\u0144cowym osoby czytaj\u0105cej, gdy tylko wiadomo\u015b\u0107 zostanie otwarta. W\u0142a\u015bnie to czyni je dost\u0119pem w rozumieniu artyku\u0142u 5 ust\u0119p 3 dyrektywy ePrivacy - to, \u017ce obraz jest ozdobny, niczego w mechanizmie nie zmienia.\",\"hinweis_ausnahme_leer\":\"Wyj\u0105tki s\u0105 dwa: bezwzgl\u0119dnie konieczne dla transmisji oraz bezwzgl\u0119dnie konieczne dla us\u0142ugi wyra\u017anie zam\u00f3wionej. FAQ CNIL z 22 lipca 2026 zamyka ten drugi dla wszystkiego, co zbiera adres IP albo user agent - a ka\u017cde pobranie HTTP przesy\u0142a oba z samej swojej budowy. Dlatego wyj\u0105tek jest w praktyce niemal pusty, a nie po prostu w\u0105ski.\",\"hinweis_zaehlpixel\":\"Obraz o boku jednego piksela albo taki, kt\u00f3ry ukrywa jego styl, nie jest po to, by go ogl\u0105da\u0107. Jego jedynym skutkiem jest pobranie, a ono jest pomiarem.\",\"hinweis_kennung\":\"Co najmniej jeden adres niesie co\u015b, co oznacza pojedyncz\u0105 odbiorczyni\u0119. Z liczby otwar\u0107 robi si\u0119 w ten spos\u00f3b zapis tego, kto otworzy\u0142 - inna czynno\u015b\u0107 przetwarzania, wymagaj\u0105ca w\u0142asnej podstawy.\",\"hinweis_viele_hosts\":\"Wi\u0119cej ni\u017c jeden host dowiaduje si\u0119, \u017ce ta wiadomo\u015b\u0107 zosta\u0142a otwarta: {hosts}. Ka\u017cdy z nich jest osobnym odbiorc\u0105 tego faktu.\",\"hinweis_umschrieben\":\"Co najmniej jeden odno\u015bnik prowadzi gdzie indziej ni\u017c do hosta, kt\u00f3ry wymienia jego tekst. Przekierowanie zapisuje klikni\u0119cie, zanim przeka\u017ce dalej; widoczny adres nie jest tym zaczepionym jako pierwszy.\",\"hinweis_kennung_verweis\":\"\u017badne pobranie nie niesie identyfikatora, ale odno\u015bnik ju\u017c tak. Pomiar klikni\u0119\u0107 nadal wi\u0105\u017ce wtedy czynno\u015b\u0107 z osob\u0105, cho\u0107 samo otwarcie tego nie robi.\",\"hinweis_ohne_abruf\":\"Zasoby osadzone jako data: albo za\u0142\u0105czone jako cid: nie si\u0119gaj\u0105 \u017cadnego serwera. Tak pokazuje si\u0119 obraz, nie mierz\u0105c przy tym niczego.\",\"hinweis_b2b\":\"Kontakty s\u0142u\u017cbowe nie s\u0105 wy\u0142\u0105czone. Zalecenie obejmuje wiadomo\u015bci na adresy zawodowe tak samo jak na prywatne.\",\"hinweis_frist\":\"Okres przej\u015bciowy przyznany przez CNIL zako\u0144czy\u0142 si\u0119 14 lipca 2026, zalecenie wi\u0119c obowi\u0105zuje, a nie jest jedynie zapowiedziane.\",\"hinweis_ausserhalb\":\"To odczytanie europejskiej dyrektywy przez francuski organ. Dyrektywa obowi\u0105zuje w ca\u0142ej Unii, ale to, jak surowo czyta j\u0105 ka\u017cdy organ, ju\u017c nie - wniosek si\u0119ga wi\u0119c dalej ni\u017c egzekwowanie.\",\"hinweis_lokal\":\"To sprawdzenie odby\u0142o si\u0119 w ca\u0142o\u015bci w przegl\u0105darce i nie pobra\u0142o \u017cadnego z wypisanych powy\u017cej adres\u00f3w.\"};<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Hilfsfunktionen ueber einzelne Adressen\n    \/\/ =========================================================================<\/p>\n<p>    \/** Host einer Adresse, ohne dass dabei etwas abgerufen wird. *\/\n    function hostAus(adresse) {\n        var a = String(adresse == null ? '' : adresse).replace(\/^\\s+|\\s+$\/g, '');\n        if (!a.length) { return null; }\n        if (\/^(data|cid|mailto|tel):\/i.test(a)) { return null; }\n        var m = a.match(\/^[a-zA-Z][a-zA-Z0-9+.\\-]*:\\\/\\\/([^\\\/?#]+)\/);\n        if (m) { return m[1].toLowerCase().replace(\/^.*@\/, '').replace(\/:\\d+$\/, ''); }\n        if (\/^\\\/\\\/\/.test(a)) {\n            var p = a.slice(2).split(\/[\\\/?#]\/)[0];\n            return p ? p.toLowerCase().replace(\/:\\d+$\/, '') : null;\n        }\n        return null; \/\/ relative Adressen erreichen in einer E-Mail nichts\n    }<\/p>\n<p>    function schema(adresse) {\n        var a = String(adresse == null ? '' : adresse).replace(\/^\\s+\/, '');\n        var m = a.match(\/^([a-zA-Z][a-zA-Z0-9+.\\-]*):\/);\n        return m ? m[1].toLowerCase() : (\/^\\\/\\\/\/.test(a) ? 'https' : null);\n    }<\/p>\n<p>    \/**\n     * Traegt die Adresse eine Kennung, die sie an eine einzelne Empfaengerin\n     * bindet? Drei Spuren: eine Mailadresse, ein sprechender Parametername,\n     * ein langer undurchsichtiger Brocken.\n     *\/\n    function kennungVerdaechtig(adresse) {\n        var a = String(adresse == null ? '' : adresse);\n        if (!a.length) { return null; }\n        var entschluesselt = a;\n        try { entschluesselt = decodeURIComponent(a); } catch (e) { entschluesselt = a; }<\/p>\n<p>        if (\/[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,}\/.test(entschluesselt)) { return 'mailadresse'; }\n        if (\/[?&](email|e|mail|addr|address|recipient|rcpt|subscriber|sid|uid|rid|mid|cid|contact)=\/i.test(a)) { return 'parameter'; }<\/p>\n<p>        \/\/ Lange Brocken in Pfad oder Parameterwert, die wie eine Kennung aussehen.\n        var teile = a.replace(\/^[a-zA-Z][a-zA-Z0-9+.\\-]*:\\\/\\\/[^\\\/?#]*\/, '').split(\/[\\\/?&=#]+\/);\n        for (var i = 0; i < teile.length; i++) {\n            var t = teile[i];\n            if (t.length < 16) { continue; }\n            if (\/^[0-9a-fA-F]{16,}$\/.test(t)) { return 'brocken'; }\n            if (\/^[A-Za-z0-9_\\-]{20,}$\/.test(t) &#038;&#038; \/[0-9]\/.test(t) &#038;&#038; \/[A-Za-z]\/.test(t)) { return 'brocken'; }\n            if (\/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\/.test(t)) { return 'brocken'; }\n        }\n        return null;\n    }\n\n    \/** Masse aus Attributen und Inline-Stil. Ein Pixel oder null heisst unsichtbar. *\/\n    function masse(element) {\n        function lesen(wert) {\n            if (wert === null || wert === undefined) { return null; }\n            var m = String(wert).match(\/^\\s*(\\d+(?:\\.\\d+)?)\\s*(px)?\\s*$\/i);\n            return m ? Number(m[1]) : null;\n        }\n        var stil = element.getAttribute('style') || '';\n        function ausStil(name) {\n            var re = new RegExp(name + '\\\\s*:\\\\s*([^;]+)', 'i');\n            var m = stil.match(re);\n            return m ? lesen(m[1]) : null;\n        }\n        var breite = ausStil('width');\n        var hoehe = ausStil('height');\n        if (breite === null) { breite = lesen(element.getAttribute('width')); }\n        if (hoehe === null) { hoehe = lesen(element.getAttribute('height')); }\n        var versteckt = \/display\\s*:\\s*none\/i.test(stil) || \/visibility\\s*:\\s*hidden\/i.test(stil);\n        var winzig = (breite !== null &#038;&#038; breite <= 1) || (hoehe !== null &#038;&#038; hoehe <= 1);\n        return { breite: breite, hoehe: hoehe, unsichtbar: versteckt || winzig };\n    }\n\n    \/\/ =========================================================================\n    \/\/ Zerlegung\n    \/\/ =========================================================================\n\n    \/**\n     * Zerlegt die Quelle mit DOMParser. Das dabei entstehende Dokument hat\n     * keinen Browsing-Kontext: es laedt nichts nach und fuehrt nichts aus.\n     * Genau deshalb darf ein Pruefer dieser Art ueberhaupt existieren.\n     *\/\n    function analysieren(quelle) {\n        var text = String(quelle == null ? '' : quelle);\n        var ressourcen = [];\n        var verweise = [];\n\n        if (!text.replace(\/\\s\/g, '').length) {\n            return { ressourcen: ressourcen, verweise: verweise, leer: true };\n        }\n        if (typeof DOMParser === 'undefined') {\n            return { ressourcen: ressourcen, verweise: verweise, leer: true, kein_parser: true };\n        }\n\n        var dok = new DOMParser().parseFromString(text, 'text\/html');\n\n        function aufnehmen(typ, adresse, element) {\n            var a = String(adresse == null ? '' : adresse).replace(\/^\\s+|\\s+$\/g, '');\n            if (!a.length) { return; }\n            var s = schema(a);\n            var host = hostAus(a);\n            var m = element ? masse(element) : { breite: null, hoehe: null, unsichtbar: false };\n            var abruf = host !== null;\n            ressourcen.push({\n                typ: typ,\n                url: a,\n                host: host,\n                schema: s,\n                abruf: abruf,\n                breite: m.breite,\n                hoehe: m.hoehe,\n                unsichtbar: m.unsichtbar,\n                kennung: abruf ? kennungVerdaechtig(a) : null,\n                rolle: (typ === 'img' &#038;&#038; m.unsichtbar) ? 'zaehlpixel' : typ\n            });\n        }\n\n        Array.prototype.forEach.call(dok.querySelectorAll('img'), function (e) {\n            aufnehmen('img', e.getAttribute('src'), e);\n            var srcset = e.getAttribute('srcset');\n            if (srcset) {\n                srcset.split(',').forEach(function (teil) {\n                    aufnehmen('srcset', teil.replace(\/^\\s+|\\s+$\/g, '').split(\/\\s+\/)[0], e);\n                });\n            }\n        });\n        Array.prototype.forEach.call(dok.querySelectorAll('iframe, frame'), function (e) {\n            aufnehmen('rahmen', e.getAttribute('src'), e);\n        });\n        Array.prototype.forEach.call(dok.querySelectorAll('video, audio, source, embed'), function (e) {\n            aufnehmen('medien', e.getAttribute('src'), e);\n        });\n        Array.prototype.forEach.call(dok.querySelectorAll('link[href]'), function (e) {\n            var rel = (e.getAttribute('rel') || '').toLowerCase();\n            if (rel.indexOf('stylesheet') !== -1 || rel.indexOf('icon') !== -1 || rel.indexOf('preload') !== -1) {\n                aufnehmen('stil', e.getAttribute('href'), e);\n            }\n        });\n\n        \/\/ Hintergrundbilder: aus Inline-Stilen, aus background-Attributen und\n        \/\/ aus \n\n<style>-Bloecken. url(...) mit und ohne Anfuehrungszeichen.\n        function urlsAus(css, element) {\n            var re = \/url\\(\\s*['\"]?([^'\")]+)['\"]?\\s*\\)\/gi;\n            var m;\n            while ((m = re.exec(css)) !== null) { aufnehmen('hintergrund', m[1], element); }\n        }\n        Array.prototype.forEach.call(dok.querySelectorAll('[style]'), function (e) {\n            urlsAus(e.getAttribute('style') || '', e);\n        });\n        Array.prototype.forEach.call(dok.querySelectorAll('[background]'), function (e) {\n            aufnehmen('hintergrund', e.getAttribute('background'), e);\n        });\n        Array.prototype.forEach.call(dok.querySelectorAll('style'), function (e) {\n            urlsAus(e.textContent || '', null);\n            var imp = \/@import\\s+(?:url\\(\\s*)?['\"]?([^'\")\\s;]+)\/gi;\n            var m2;\n            while ((m2 = imp.exec(e.textContent || '')) !== null) { aufnehmen('stil', m2[1], null); }\n        });<\/p>\n<p>        \/\/ Verweise: sichtbarer Text gegen Ziel.\n        Array.prototype.forEach.call(dok.querySelectorAll('a[href]'), function (e) {\n            var href = String(e.getAttribute('href') || '').replace(\/^\\s+|\\s+$\/g, '');\n            if (!href.length) { return; }\n            var s = schema(href);\n            if (s === 'mailto' || s === 'tel') { return; }\n            var zielHost = hostAus(href);\n            var text = (e.textContent || '').replace(\/\\s+\/g, ' ').replace(\/^\\s+|\\s+$\/g, '');\n            var textHost = null;\n            var mm = text.match(\/(?:https?:\\\/\\\/)?((?:[a-z0-9\\-]+\\.)+[a-z]{2,})\/i);\n            if (mm) { textHost = mm[1].toLowerCase(); }\n            verweise.push({\n                href: href,\n                host: zielHost,\n                text: text.slice(0, 60),\n                textHost: textHost,\n                umschrieben: !!(textHost && zielHost && textHost !== zielHost),\n                kennung: zielHost ? kennungVerdaechtig(href) : null\n            });\n        });<\/p>\n<p>        return { ressourcen: ressourcen, verweise: verweise, leer: false };\n    }<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Bewertung\n    \/\/ =========================================================================<\/p>\n<p>    function bewerten(befund) {\n        var b = befund || { ressourcen: [], verweise: [], leer: true };\n        var ressourcen = b.ressourcen || [];\n        var verweise = b.verweise || [];<\/p>\n<p>        var abrufe = ressourcen.filter(function (r) { return r.abruf; });\n        var ohneAbruf = ressourcen.filter(function (r) { return !r.abruf; });\n        var hosts = [];\n        abrufe.forEach(function (r) { if (hosts.indexOf(r.host) === -1) { hosts.push(r.host); } });\n        var zaehlpixel = abrufe.filter(function (r) { return r.rolle === 'zaehlpixel'; });\n        var mitKennung = abrufe.filter(function (r) { return !!r.kennung; });\n        var umschrieben = verweise.filter(function (v) { return v.umschrieben; });\n        var verweiseMitKennung = verweise.filter(function (v) { return !!v.kennung; });<\/p>\n<p>        var hinweise = [];\n        if (b.leer) {\n            hinweise.push('keine_eingabe');\n        } else if (!abrufe.length) {\n            hinweise.push('kein_abruf');\n        } else {\n            hinweise.push('zugriff');\n            hinweise.push('ausnahme_leer');\n            if (zaehlpixel.length) { hinweise.push('zaehlpixel'); }\n            if (mitKennung.length) { hinweise.push('kennung'); }\n            if (hosts.length > 1) { hinweise.push('viele_hosts'); }\n        }\n        if (umschrieben.length) { hinweise.push('umschrieben'); }\n        if (verweiseMitKennung.length && !mitKennung.length) { hinweise.push('kennung_verweis'); }\n        if (ohneAbruf.length) { hinweise.push('ohne_abruf'); }\n        \/\/ Die rechtliche Einordnung haengt am Abruf. Eine Nachricht, die\n        \/\/ keinen ausloest, braucht sie nicht - dort waere sie Rauschen.\n        if (abrufe.length) {\n            hinweise.push('b2b');\n            hinweise.push('frist');\n            hinweise.push('ausserhalb');\n        }\n        hinweise.push('lokal');<\/p>\n<p>        return {\n            ressourcen: ressourcen,\n            verweise: verweise,\n            abrufe: abrufe,\n            ohneAbruf: ohneAbruf,\n            hosts: hosts,\n            zaehlung: {\n                abrufe: abrufe.length,\n                hosts: hosts.length,\n                zaehlpixel: zaehlpixel.length,\n                mitKennung: mitKennung.length,\n                umschrieben: umschrieben.length,\n                ohneAbruf: ohneAbruf.length,\n                verweise: verweise.length\n            },\n            hinweise: hinweise\n        };\n    }<\/p>\n<p>    \/\/ --- Pruefpunkt ----------------------------------------------------------\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.EP = {\n        analysieren: analysieren,\n        bewerten: bewerten,\n        hostAus: hostAus,\n        schema: schema,\n        kennungVerdaechtig: kennungVerdaechtig,\n        T: T\n    };<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Oberflaeche\n    \/\/ =========================================================================<\/p>\n<p>    var btn = document.getElementById('ep-btn');\n    var out = document.getElementById('ep-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    var feld = document.getElementById('ep-quelle');\n    if (feld && !feld.value) { feld.value = T.beispiel; }<\/p>\n<p>    function el(tag, stil, text) {\n        var e = document.createElement(tag);\n        if (stil) { e.setAttribute('style', stil); }\n        if (text !== undefined) { e.textContent = text; }\n        return e;\n    }<\/p>\n<p>    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.92rem; margin: 18px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var GUT = ' color: #7ee787;';\n    var WARN = ' color: #ffa94d;';\n    var GRAU = ' color: #8a8a99;';<\/p>\n<p>    function gitter(spalten) {\n        return el('div', 'display: grid; grid-template-columns: ' + spalten + '; gap: 0 18px; align-items: baseline;');\n    }\n    function paar(g, name, w, stil) {\n        g.appendChild(el('div', ZELLE, name));\n        g.appendChild(el('div', ZELLE_WERT + (stil || ''), w));\n    }\n    function kopf(g, spalten) {\n        spalten.forEach(function (s) {\n            g.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee);', s));\n        });\n    }<\/p>\n<p>    btn.addEventListener('click', function () {\n        var feldWert = feld ? feld.value : '';\n        var erg = bewerten(analysieren(feldWert));\n        out.innerHTML = '';<\/p>\n<p>        \/\/ --- Zusammenfassung ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_zusammenfassung));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_abrufe, String(erg.zaehlung.abrufe), erg.zaehlung.abrufe ? WARN : GUT);\n        paar(g, T.zeile_hosts, String(erg.zaehlung.hosts), erg.zaehlung.hosts > 1 ? WARN : '');\n        paar(g, T.zeile_zaehlpixel, String(erg.zaehlung.zaehlpixel), erg.zaehlung.zaehlpixel ? WARN : GUT);\n        paar(g, T.zeile_kennung, String(erg.zaehlung.mitKennung), erg.zaehlung.mitKennung ? WARN : GUT);\n        paar(g, T.zeile_umschrieben, String(erg.zaehlung.umschrieben), erg.zaehlung.umschrieben ? WARN : GUT);\n        paar(g, T.zeile_ohne_abruf, String(erg.zaehlung.ohneAbruf), GRAU);\n        out.appendChild(g);<\/p>\n<p>        \/\/ --- Ressourcen ---\n        if (erg.ressourcen.length) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_ressourcen));\n            var r = gitter('auto auto auto auto');\n            kopf(r, [T.spalte_art, T.spalte_host, T.spalte_masse, T.spalte_befund]);\n            erg.ressourcen.forEach(function (x) {\n                r.appendChild(el('div', ZELLE, T['art_' + x.typ] || x.typ));\n                r.appendChild(el('div', ZELLE_WERT + (x.abruf ? '' : GRAU),\n                    x.abruf ? x.host : (T['schema_' + (x.schema || 'relativ')] || x.schema || '-')));\n                r.appendChild(el('div', ZELLE_WERT,\n                    (x.breite === null && x.hoehe === null) ? '-'\n                        : ((x.breite === null ? '?' : x.breite) + ' x ' + (x.hoehe === null ? '?' : x.hoehe))));\n                var befund = !x.abruf ? T.befund_kein_abruf\n                    : (x.rolle === 'zaehlpixel' ? T.befund_zaehlpixel\n                        : (x.kennung ? T['befund_kennung_' + x.kennung] : T.befund_abruf));\n                r.appendChild(el('div', ZELLE + (!x.abruf ? GRAU : (x.rolle === 'zaehlpixel' || x.kennung ? WARN : '')), befund));\n            });\n            out.appendChild(r);\n        }<\/p>\n<p>        \/\/ --- Verweise ---\n        if (erg.verweise.length) {\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_verweise));\n            var v = gitter('auto auto auto');\n            kopf(v, [T.spalte_text, T.spalte_ziel, T.spalte_befund]);\n            erg.verweise.forEach(function (x) {\n                v.appendChild(el('div', ZELLE, x.text || '-'));\n                v.appendChild(el('div', ZELLE_WERT, x.host || '-'));\n                var befund = x.umschrieben ? T.befund_umschrieben\n                    : (x.kennung ? T['befund_kennung_' + x.kennung] : T.befund_verweis);\n                v.appendChild(el('div', ZELLE + (x.umschrieben || x.kennung ? WARN : ''), befund));\n            });\n            out.appendChild(v);\n        }<\/p>\n<p>        \/\/ --- Hinweise ---\n        out.appendChild(el('div', UEBERSCHRIFT, T.h_hinweise));\n        var liste = el('ul', 'margin: 0 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem; line-height: 1.65;');\n        erg.hinweise.forEach(function (h) {\n            var text = T['hinweis_' + h];\n            if (!text) { return; }\n            liste.appendChild(el('li', '', text.replace('{hosts}', erg.hosts.join(', '))));\n        });\n        out.appendChild(liste);\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wypisuje wszystko, co e-mail wysy\u0142a do serwera w chwili otwarcia: niewidoczne piksele, obrazy t\u0142a, przepisane odno\u015bniki oraz identyfikatory wi\u0105\u017c\u0105ce otwarcie z jedn\u0105 osob\u0105. Rozbi\u00f3r odbywa si\u0119 lokalnie, nic nie jest pobierane.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92151,92247,92044],"class_list":["post-13071","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-pl","tag-gdpr-pl","tag-tracking-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog<\/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:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wypisuje wszystko, co e-mail wysy\u0142a do serwera w chwili otwarcia: niewidoczne piksele, obrazy t\u0142a, przepisane odno\u015bniki oraz identyfikatory wi\u0105\u017c\u0105ce otwarcie z jedn\u0105 osob\u0105. Rozbi\u00f3r odbywa si\u0119 lokalnie, nic nie jest pobierane.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/email-tracking-pixel-auditor\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/email-tracking-pixel-auditor\\\/\",\"name\":\"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-28T14:10:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/email-tracking-pixel-auditor\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/email-tracking-pixel-auditor\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/email-tracking-pixel-auditor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog","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:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/","og_locale":"en_US","og_type":"article","og_title":"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog","og_description":"Wypisuje wszystko, co e-mail wysy\u0142a do serwera w chwili otwarcia: niewidoczne piksele, obrazy t\u0142a, przepisane odno\u015bniki oraz identyfikatory wi\u0105\u017c\u0105ce otwarcie z jedn\u0105 osob\u0105. Rozbi\u00f3r odbywa si\u0119 lokalnie, nic nie jest pobierane.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/","name":"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-28T14:10:18+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/email-tracking-pixel-auditor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Kontroler pikseli \u015bledz\u0105cych i tre\u015bci zdalnych w e-mailu"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13071"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13071\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13071"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}