Wdrażanie sygnałów dla lokalnych serwerów: integracja PowerMTA

Ptak

30 sie 2019

Email

1 min read

Wdrażanie sygnałów dla lokalnych serwerów: integracja PowerMTA

Najważniejsze informacje

    • Cel: Ten przewodnik wyjaśnia, jak zintegrować PowerMTA 5.0+ z SparkPost Signals, aby przesyłać dane o zdarzeniach i zaangażowaniu (odrzuty, otwarcia, kliknięcia, skargi na spam) z lokalnych MTAs bezpośrednio do warstwy analitycznej SparkPost.

    • Podstawowa konfiguracja:

      • Dodaj enable-signals true i zdefiniuj swój punkt końcowy wprowadzania SparkPost (https://api.sparkpost.com/api/v1/ingest/events lub odpowiednik w UE).

      • Użyj ważnego klucza API z uprawnieniami “Przychodzące zdarzenia: Zapisz”.

      • Określ customer-id, a opcjonalnie skonfiguruj niestandardowe domeny śledzenia dla lepszej dostarczalności.

    • Ustawienia śledzenia: Śledzenie zaangażowania w PowerMTA automatycznie wstrzykuje piksele otwarcia i kliknięcia do e-maili HTML. Możesz wyłączyć śledzenie dla każdego linku za pomocą atrybutu data-msys-clicktrack="0".

    • Selektywne raportowanie: Sygnalizacje mogą być włączane globalnie lub ograniczone do określonych Wirtualnych MTA, pul lub domen nadawców, co pozwala na precyzyjną kontrolę danych.

    • Testowanie i weryfikacja: Użyj pulpitu integracji sygnalizacji i dzienników PowerMTA, aby potwierdzić wprowadzanie zdarzeń oraz śledzić wskaźniki zdrowia, odrzuty i metryki zaangażowania w czasie rzeczywistym.

    • Regulacja dostarczalności:

      • Użyj znaczących nazw Wirtualnego MTA i Zadań — te bezpośrednio mapują się na Pule IP oraz Identyfikatory Kampanii w raportach SparkPost.

      • Skonfiguruj podpisywanie DKIM, egzekwowanie TLS i odpowiednie zasady przekazywania, aby zapobiec nieautoryzowanym wstrzyknięciom.

    • Zaawansowane ustawienia: Artykuł zawiera również gotowe do użycia fragmenty kodu dotyczące FBL i obsługi odrzuceń poza pasmem, uwierzytelnionego wstrzykiwania SMTP (port 587) oraz kodu Python do sanitizacji nagłówków X-Job w celu zapewnienia zgodności.

Podsumowanie pytań i odpowiedzi

  • Czym tak naprawdę zajmuje się integracja Signals?

    Automatycznie przesyła zdarzenia wiadomości PowerMTA (wstrzykiwanie, dostawa, niepowodzenie, zaangażowanie) do Twojego konta SparkPost, dzięki czemu masz dostęp do pulpitów nawigacyjnych, takich jak ocena stanu zdrowia, raporty opóźnień i monitorowanie pułapek spamowych.

  • Dlaczego zintegrować Signals z lokalnym MTA?

    Wiele przedsiębiorstw uruchamia samodzielnie hostowaną infrastrukturę poczty elektronicznej z powodów zgodności, ale nadal chce korzystać z analityki i możliwości monitorowania SparkPost. Signals wypełnia tę lukę, nie migrując dostarczania poczty do chmury.

  • Jak mogę zweryfikować, że zdarzenia przepływają do SparkPost?

    Sprawdź logi PowerMTA dla Signals: Transferred ... successfully i potwierdź wpisy zdarzeń w Signals → Events Search w SparkPost.

  • Czy mogę użyć własnej domeny do śledzenia?

    Tak — skonfiguruj CNAME, taki jak track.mycompany.com → pmta.spgo.io (US) lub pmta.eu.spgo.io (EU), a następnie zarejestruj i zweryfikuj go w SparkPost w celu zachowania spójności marki i reputacji.

  • A co z prywatnością danych lub wykorzystaniem dysku?

    Dyrektywa min-free-space automatycznie usuwa stare pliki zdarzeń JSON, gdy dostępne miejsce na dysku jest niskie, zapobiegając lokalnemu gromadzeniu się danych telemetrycznych.

  • Jaka jest "funkcja bonusowa" na końcu?

    Narzędzie regex Pythona (pmtaSafeJobID), które zapewnia, że nazwy kampanii/zleceń używają tylko znaków ważnych w formacie nagłówka PowerMTA X-Job, zastępując niebezpieczne znaki znakami podkreślenia.

Zanurzmy się w szczegóły konfigurowania PowerMTA dla SparkPost Signals. Będziesz potrzebować:

  • Serwera do uruchomienia najnowszej wersji PowerMTA – nowego lub istniejącego komputera

  • Konta SparkPost z uprawnieniem klucza API do „Nadwyżki zdarzeń: Zapisz” jak opisano tutaj

Skonfigurujemy PowerMTA do przesyłania zdarzeń do Twojego konta SparkPost, a następnie będziesz mógł korzystać z następujących:

Zanurzmy się w szczegóły konfigurowania PowerMTA dla SparkPost Signals. Będziesz potrzebować:

  • Serwera do uruchomienia najnowszej wersji PowerMTA – nowego lub istniejącego komputera

  • Konta SparkPost z uprawnieniem klucza API do „Nadwyżki zdarzeń: Zapisz” jak opisano tutaj

Skonfigurujemy PowerMTA do przesyłania zdarzeń do Twojego konta SparkPost, a następnie będziesz mógł korzystać z następujących:

Zanurzmy się w szczegóły konfigurowania PowerMTA dla SparkPost Signals. Będziesz potrzebować:

  • Serwera do uruchomienia najnowszej wersji PowerMTA – nowego lub istniejącego komputera

  • Konta SparkPost z uprawnieniem klucza API do „Nadwyżki zdarzeń: Zapisz” jak opisano tutaj

Skonfigurujemy PowerMTA do przesyłania zdarzeń do Twojego konta SparkPost, a następnie będziesz mógł korzystać z następujących:

Przegląd instalacji i konfiguracji

Po pierwsze zainstaluj (lub zaktualizuj) do PowerMTA 5.0 r4 lub nowszej, postępując zgodnie z typowymi instrukcjami instalacji v5.0 które są dość proste. Następnie przejdziemy przez następujące kroki:

  • Skonfiguruj łącznik PowerMTA do SparkPost Signals

  • Skonfiguruj śledzenie zaangażowania z niestandardową domeną śledzenia

  • Wybierz, które strumienie ruchu PowerMTA mają być raportowane do Signals

  • Testowanie, czy twoje zdarzenia docierają do Signals

  • Przejrzyj, jak używać znaczących nazw, które dobrze się prezentują w raportowaniu.

Omówimy również inne szczegółowe aspekty konfiguracji PowerMTA używane w naszej prezentacji Signals:

  • Wydarzenia FBL (skargi spamowe) i zdalne (out-of-band) odbicia

  • Konfiguracja wstrzyknięcia, w tym DKIM

  • Konfiguracja FBL i OOB

  • Konfiguracja i nazewnictwo VirtualMTA (i jak to się pojawia w twoich raportach SparkPost Signals)

Na koniec jest „bonusowa funkcja” z kodem, aby upewnić się, że nazwy twoich kampanii są zgodne z konwencjami nazw X-Job PowerMTA. 

Po pierwsze zainstaluj (lub zaktualizuj) do PowerMTA 5.0 r4 lub nowszej, postępując zgodnie z typowymi instrukcjami instalacji v5.0 które są dość proste. Następnie przejdziemy przez następujące kroki:

  • Skonfiguruj łącznik PowerMTA do SparkPost Signals

  • Skonfiguruj śledzenie zaangażowania z niestandardową domeną śledzenia

  • Wybierz, które strumienie ruchu PowerMTA mają być raportowane do Signals

  • Testowanie, czy twoje zdarzenia docierają do Signals

  • Przejrzyj, jak używać znaczących nazw, które dobrze się prezentują w raportowaniu.

Omówimy również inne szczegółowe aspekty konfiguracji PowerMTA używane w naszej prezentacji Signals:

  • Wydarzenia FBL (skargi spamowe) i zdalne (out-of-band) odbicia

  • Konfiguracja wstrzyknięcia, w tym DKIM

  • Konfiguracja FBL i OOB

  • Konfiguracja i nazewnictwo VirtualMTA (i jak to się pojawia w twoich raportach SparkPost Signals)

Na koniec jest „bonusowa funkcja” z kodem, aby upewnić się, że nazwy twoich kampanii są zgodne z konwencjami nazw X-Job PowerMTA. 

Po pierwsze zainstaluj (lub zaktualizuj) do PowerMTA 5.0 r4 lub nowszej, postępując zgodnie z typowymi instrukcjami instalacji v5.0 które są dość proste. Następnie przejdziemy przez następujące kroki:

  • Skonfiguruj łącznik PowerMTA do SparkPost Signals

  • Skonfiguruj śledzenie zaangażowania z niestandardową domeną śledzenia

  • Wybierz, które strumienie ruchu PowerMTA mają być raportowane do Signals

  • Testowanie, czy twoje zdarzenia docierają do Signals

  • Przejrzyj, jak używać znaczących nazw, które dobrze się prezentują w raportowaniu.

Omówimy również inne szczegółowe aspekty konfiguracji PowerMTA używane w naszej prezentacji Signals:

  • Wydarzenia FBL (skargi spamowe) i zdalne (out-of-band) odbicia

  • Konfiguracja wstrzyknięcia, w tym DKIM

  • Konfiguracja FBL i OOB

  • Konfiguracja i nazewnictwo VirtualMTA (i jak to się pojawia w twoich raportach SparkPost Signals)

Na koniec jest „bonusowa funkcja” z kodem, aby upewnić się, że nazwy twoich kampanii są zgodne z konwencjami nazw X-Job PowerMTA. 

Konfiguracja FBL i OOB

Teraz .. w końcu .. deklarujemy, które konkretne domeny są otwarte na zdalne odbicia i odpowiedzi FBL. Nie chcemy ich przekazywać nigdzie (aby zapobiec atakom backscatter), tylko wewnętrznie przetwarzać te odpowiedzi.

# # Enable Bounce and FBL processing on specific domains #
relay-domain pmta.signalsdemo.trymsys.net
relay-domain bounces.pmta.signalsdemo.trymsys.net
relay-domain fbl.pmta.signalsdemo.trymsys.net

<bounce-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain pmta.signalsdemo.trymsys.net
domain bounces.pmta.signalsdemo.trymsys.net
</address-list>
</bounce-processor>

<feedback-loop-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain fbl.pmta.signalsdemo.trymsys.net
</address-list>
</feedback-loop-processor>

Możesz zobaczyć, że ustawiłem dwie domeny odbicia, kiedy bawiłem się z zastosowaniem/niezastosowaniem reguły przepisywania mfrom .

Domena FBL jest zazwyczaj rejestrowana z zewnętrznymi usługami takimi jak Microsoft SNDS; zobacz ten artykuł, aby uzyskać więcej informacji. W tej demonstracji FBL-y będą pochodziły z Bouncy Sink, więc nie ma potrzeby rejestrowania.

Teraz .. w końcu .. deklarujemy, które konkretne domeny są otwarte na zdalne odbicia i odpowiedzi FBL. Nie chcemy ich przekazywać nigdzie (aby zapobiec atakom backscatter), tylko wewnętrznie przetwarzać te odpowiedzi.

# # Enable Bounce and FBL processing on specific domains #
relay-domain pmta.signalsdemo.trymsys.net
relay-domain bounces.pmta.signalsdemo.trymsys.net
relay-domain fbl.pmta.signalsdemo.trymsys.net

<bounce-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain pmta.signalsdemo.trymsys.net
domain bounces.pmta.signalsdemo.trymsys.net
</address-list>
</bounce-processor>

<feedback-loop-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain fbl.pmta.signalsdemo.trymsys.net
</address-list>
</feedback-loop-processor>

Możesz zobaczyć, że ustawiłem dwie domeny odbicia, kiedy bawiłem się z zastosowaniem/niezastosowaniem reguły przepisywania mfrom .

Domena FBL jest zazwyczaj rejestrowana z zewnętrznymi usługami takimi jak Microsoft SNDS; zobacz ten artykuł, aby uzyskać więcej informacji. W tej demonstracji FBL-y będą pochodziły z Bouncy Sink, więc nie ma potrzeby rejestrowania.

Teraz .. w końcu .. deklarujemy, które konkretne domeny są otwarte na zdalne odbicia i odpowiedzi FBL. Nie chcemy ich przekazywać nigdzie (aby zapobiec atakom backscatter), tylko wewnętrznie przetwarzać te odpowiedzi.

# # Enable Bounce and FBL processing on specific domains #
relay-domain pmta.signalsdemo.trymsys.net
relay-domain bounces.pmta.signalsdemo.trymsys.net
relay-domain fbl.pmta.signalsdemo.trymsys.net

<bounce-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain pmta.signalsdemo.trymsys.net
domain bounces.pmta.signalsdemo.trymsys.net
</address-list>
</bounce-processor>

<feedback-loop-processor>
deliver-unmatched-email no
deliver-matched-email no
<address-list>
domain fbl.pmta.signalsdemo.trymsys.net
</address-list>
</feedback-loop-processor>

Możesz zobaczyć, że ustawiłem dwie domeny odbicia, kiedy bawiłem się z zastosowaniem/niezastosowaniem reguły przepisywania mfrom .

Domena FBL jest zazwyczaj rejestrowana z zewnętrznymi usługami takimi jak Microsoft SNDS; zobacz ten artykuł, aby uzyskać więcej informacji. W tej demonstracji FBL-y będą pochodziły z Bouncy Sink, więc nie ma potrzeby rejestrowania.

Skonfiguruj konektor PowerMTA

Konfiguracja Signals jest opisana w sekcji 10.1 podręcznika użytkownika 5.0. Tutaj zaczniemy od „Przypadku użycia #2”, który włącza Signals dla całego ruchu z tego hosta PowerMTA oraz włącza śledzenie zaangażowania SparkPost.

# # SparkPost Signals #
<signals>
api-key ##my ingest API key here##
upload-url https://api.sparkpost.com/api/v1/ingest/events
log-verbose true
min-free-space 1G
engagement-tracking sparkpost   # this turns on the open and click tracking in PowerMTA
customer-id 123                 # Your SparkPost account number here
</signals>

enable-signals true


Oto co robi każdy atrybut:

api-key

Jest to unikalne dla Twojego konta SparkPost, to wartość, którą otrzymałeś wcześniej od SparkPost.


upload-url

To musi pasować do adresu Twojej usługi API SparkPost, niezależnie od tego, czy jest to US, czy EU. Więcej informacji znajdziesz tutaj. Zwykłe wartości to:

SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events


log-verbose

Ten dyrektywa jest opcjonalna, a gdy jest włączona, daje nieco więcej informacji w pliku pmta.log, co może być przydatne podczas konfiguracji, aby potwierdzić, że wszystko działa poprawnie. Co minutę, nawet gdy nie ma ruchu, zobaczysz:

2019-07-26 11:47:57 Signals: Odkryto 0 plików


Przy ruchu zobaczysz coś takiego:

2019-07-26 11:50:57 Signals: Discovered sp1-0000000000003FBD.json
2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json successfully.
2019-07-26 11:50:57 Signals: Discovered 1 file, transferred 1 file successfully


min-free-space

To mówi PowerMTA, jaki próg wolnego miejsca na dysku powinien uruchomić, aby zacząć usuwać najstarsze pliki JSON zdarzeń SparkPost, aby zrobić miejsce dla nowych plików, gdy miejsce na dysku jest ograniczone.


enable-signals

To mówi PowerMTA, aby przesyłać do Signals, w tym przypadku globalnie dla całego ruchu (więcej informacji tutaj, dla v5.0). Możesz być bardziej selektywny, co do tego, które strumienie ruchu przesyłać, jeśli chcesz.


Możesz również oznaczyć określony ruch PowerMTA jako należący do subkonta SparkPost – to kolejny sposób na odróżnienie jednego strumienia ruchu od drugiego.


engagement-tracking, customer-id
Domyślne rozwiązanie PowerMTA dotyczące śledzenia zaangażowania odnosi się do domeny śledzenia dla usługi SparkPost hostowanej w USA. Wskazujesz swój numer ID klienta SparkPost; oto instrukcje, jak go znaleźć.


tracking-domain

Dla kont SparkPost EU, dodaj następujący wiersz:

tracking-domain pmta.eu.spgo.io # to jest punkt końcowy dla SparkPost EU


Domena śledzenia niestandardowa

Jeśli wolisz użyć własnej domeny śledzenia (to lepsze z punktu widzenia dostarczalności), zrób następująco:

  • Stwórz domenę śledzenia u swojego dostawcy DNS, tworząc rekord CNAME. Będzie to zwykle subdomeną twojej domeny najwyższego poziomu, np. track.mycompany.com .


track.mycompany.com CNAME pmta.spgo.io      # if you have a SparkPost US account
track.mycompany.com CNAME pmta.eu.spgo.io   # if you have a SparkPost EU account

Możesz również używać domen śledzenia HTTPS, choć jest to bardziej skomplikowane (zobacz kroki konfiguracji SparkPost dla domen śledzenia HTTPS).

  • Zarejestruj domenę śledzenia w swoim koncie SparkPost i zweryfikuj ją. Poczekaj kilka minut przed próbą, aby pozwolić na propagację zmian DNS w Internecie, w zależności od dostawcy DNS.

  • Skonfiguruj PowerMTA, aby używał tej domeny zamiast domyślnej, z

tracking-domain yourdomain.com # Wstaw tutaj swoją własną domenę

Możesz sprawdzić, czy przesyłane wiadomości e-mail mają dodane „piksle otwarte” i linki, które są zawinięte, patrząc na wewnętrzne dane wiadomości (w Gmailu, użyj menu w prawym górnym rogu i wybierz „Pokaż oryginał”).

Show original option highlighted


Zauważysz piksele otwarte na początku i końcu HTML w wiadomości e-mail. Każdy link HTML jest również zmieniony, aby mieć REF  wskazujący na domenę śledzenia.

HTML code highlighted


To wszystko, co musisz zrobić, aby uruchomić SparkPost Signals z wbudowanym śledzeniem zaangażowania PowerMTA.

Zapobieganie śledzeniu konkretnych linków w twojej wiadomości HTML

Możesz zapobiec PowerMTA w śledzeniu konkretnych linków, ustawiając atrybut niestandardowy data-msys-clicktrack  na „0”  :

<a href="#" data-msys-clicktrack="0">Przykład</a>

PowerMTA nie otoczy linku. Usunie także ten atrybut przed przesłaniem wiadomości do odbiorcy.

Konfiguracja Signals jest opisana w sekcji 10.1 podręcznika użytkownika 5.0. Tutaj zaczniemy od „Przypadku użycia #2”, który włącza Signals dla całego ruchu z tego hosta PowerMTA oraz włącza śledzenie zaangażowania SparkPost.

# # SparkPost Signals #
<signals>
api-key ##my ingest API key here##
upload-url https://api.sparkpost.com/api/v1/ingest/events
log-verbose true
min-free-space 1G
engagement-tracking sparkpost   # this turns on the open and click tracking in PowerMTA
customer-id 123                 # Your SparkPost account number here
</signals>

enable-signals true


Oto co robi każdy atrybut:

api-key

Jest to unikalne dla Twojego konta SparkPost, to wartość, którą otrzymałeś wcześniej od SparkPost.


upload-url

To musi pasować do adresu Twojej usługi API SparkPost, niezależnie od tego, czy jest to US, czy EU. Więcej informacji znajdziesz tutaj. Zwykłe wartości to:

SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events


log-verbose

Ten dyrektywa jest opcjonalna, a gdy jest włączona, daje nieco więcej informacji w pliku pmta.log, co może być przydatne podczas konfiguracji, aby potwierdzić, że wszystko działa poprawnie. Co minutę, nawet gdy nie ma ruchu, zobaczysz:

2019-07-26 11:47:57 Signals: Odkryto 0 plików


Przy ruchu zobaczysz coś takiego:

2019-07-26 11:50:57 Signals: Discovered sp1-0000000000003FBD.json
2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json successfully.
2019-07-26 11:50:57 Signals: Discovered 1 file, transferred 1 file successfully


min-free-space

To mówi PowerMTA, jaki próg wolnego miejsca na dysku powinien uruchomić, aby zacząć usuwać najstarsze pliki JSON zdarzeń SparkPost, aby zrobić miejsce dla nowych plików, gdy miejsce na dysku jest ograniczone.


enable-signals

To mówi PowerMTA, aby przesyłać do Signals, w tym przypadku globalnie dla całego ruchu (więcej informacji tutaj, dla v5.0). Możesz być bardziej selektywny, co do tego, które strumienie ruchu przesyłać, jeśli chcesz.


Możesz również oznaczyć określony ruch PowerMTA jako należący do subkonta SparkPost – to kolejny sposób na odróżnienie jednego strumienia ruchu od drugiego.


engagement-tracking, customer-id
Domyślne rozwiązanie PowerMTA dotyczące śledzenia zaangażowania odnosi się do domeny śledzenia dla usługi SparkPost hostowanej w USA. Wskazujesz swój numer ID klienta SparkPost; oto instrukcje, jak go znaleźć.


tracking-domain

Dla kont SparkPost EU, dodaj następujący wiersz:

tracking-domain pmta.eu.spgo.io # to jest punkt końcowy dla SparkPost EU


Domena śledzenia niestandardowa

Jeśli wolisz użyć własnej domeny śledzenia (to lepsze z punktu widzenia dostarczalności), zrób następująco:

  • Stwórz domenę śledzenia u swojego dostawcy DNS, tworząc rekord CNAME. Będzie to zwykle subdomeną twojej domeny najwyższego poziomu, np. track.mycompany.com .


track.mycompany.com CNAME pmta.spgo.io      # if you have a SparkPost US account
track.mycompany.com CNAME pmta.eu.spgo.io   # if you have a SparkPost EU account

Możesz również używać domen śledzenia HTTPS, choć jest to bardziej skomplikowane (zobacz kroki konfiguracji SparkPost dla domen śledzenia HTTPS).

  • Zarejestruj domenę śledzenia w swoim koncie SparkPost i zweryfikuj ją. Poczekaj kilka minut przed próbą, aby pozwolić na propagację zmian DNS w Internecie, w zależności od dostawcy DNS.

  • Skonfiguruj PowerMTA, aby używał tej domeny zamiast domyślnej, z

tracking-domain yourdomain.com # Wstaw tutaj swoją własną domenę

Możesz sprawdzić, czy przesyłane wiadomości e-mail mają dodane „piksle otwarte” i linki, które są zawinięte, patrząc na wewnętrzne dane wiadomości (w Gmailu, użyj menu w prawym górnym rogu i wybierz „Pokaż oryginał”).

Show original option highlighted


Zauważysz piksele otwarte na początku i końcu HTML w wiadomości e-mail. Każdy link HTML jest również zmieniony, aby mieć REF  wskazujący na domenę śledzenia.

HTML code highlighted


To wszystko, co musisz zrobić, aby uruchomić SparkPost Signals z wbudowanym śledzeniem zaangażowania PowerMTA.

Zapobieganie śledzeniu konkretnych linków w twojej wiadomości HTML

Możesz zapobiec PowerMTA w śledzeniu konkretnych linków, ustawiając atrybut niestandardowy data-msys-clicktrack  na „0”  :

<a href="#" data-msys-clicktrack="0">Przykład</a>

PowerMTA nie otoczy linku. Usunie także ten atrybut przed przesłaniem wiadomości do odbiorcy.

Konfiguracja Signals jest opisana w sekcji 10.1 podręcznika użytkownika 5.0. Tutaj zaczniemy od „Przypadku użycia #2”, który włącza Signals dla całego ruchu z tego hosta PowerMTA oraz włącza śledzenie zaangażowania SparkPost.

# # SparkPost Signals #
<signals>
api-key ##my ingest API key here##
upload-url https://api.sparkpost.com/api/v1/ingest/events
log-verbose true
min-free-space 1G
engagement-tracking sparkpost   # this turns on the open and click tracking in PowerMTA
customer-id 123                 # Your SparkPost account number here
</signals>

enable-signals true


Oto co robi każdy atrybut:

api-key

Jest to unikalne dla Twojego konta SparkPost, to wartość, którą otrzymałeś wcześniej od SparkPost.


upload-url

To musi pasować do adresu Twojej usługi API SparkPost, niezależnie od tego, czy jest to US, czy EU. Więcej informacji znajdziesz tutaj. Zwykłe wartości to:

SparkPost (US): https://api.sparkpost.com/api/v1/ingest/events

SparkPost EU:    https://api.eu.sparkpost.com/api/v1/ingest/events


log-verbose

Ten dyrektywa jest opcjonalna, a gdy jest włączona, daje nieco więcej informacji w pliku pmta.log, co może być przydatne podczas konfiguracji, aby potwierdzić, że wszystko działa poprawnie. Co minutę, nawet gdy nie ma ruchu, zobaczysz:

2019-07-26 11:47:57 Signals: Odkryto 0 plików


Przy ruchu zobaczysz coś takiego:

2019-07-26 11:50:57 Signals: Discovered sp1-0000000000003FBD.json
2019-07-26 11:50:57 Signals: Transferred sp1-0000000000003FBD.json successfully.
2019-07-26 11:50:57 Signals: Discovered 1 file, transferred 1 file successfully


min-free-space

To mówi PowerMTA, jaki próg wolnego miejsca na dysku powinien uruchomić, aby zacząć usuwać najstarsze pliki JSON zdarzeń SparkPost, aby zrobić miejsce dla nowych plików, gdy miejsce na dysku jest ograniczone.


enable-signals

To mówi PowerMTA, aby przesyłać do Signals, w tym przypadku globalnie dla całego ruchu (więcej informacji tutaj, dla v5.0). Możesz być bardziej selektywny, co do tego, które strumienie ruchu przesyłać, jeśli chcesz.


Możesz również oznaczyć określony ruch PowerMTA jako należący do subkonta SparkPost – to kolejny sposób na odróżnienie jednego strumienia ruchu od drugiego.


engagement-tracking, customer-id
Domyślne rozwiązanie PowerMTA dotyczące śledzenia zaangażowania odnosi się do domeny śledzenia dla usługi SparkPost hostowanej w USA. Wskazujesz swój numer ID klienta SparkPost; oto instrukcje, jak go znaleźć.


tracking-domain

Dla kont SparkPost EU, dodaj następujący wiersz:

tracking-domain pmta.eu.spgo.io # to jest punkt końcowy dla SparkPost EU


Domena śledzenia niestandardowa

Jeśli wolisz użyć własnej domeny śledzenia (to lepsze z punktu widzenia dostarczalności), zrób następująco:

  • Stwórz domenę śledzenia u swojego dostawcy DNS, tworząc rekord CNAME. Będzie to zwykle subdomeną twojej domeny najwyższego poziomu, np. track.mycompany.com .


track.mycompany.com CNAME pmta.spgo.io      # if you have a SparkPost US account
track.mycompany.com CNAME pmta.eu.spgo.io   # if you have a SparkPost EU account

Możesz również używać domen śledzenia HTTPS, choć jest to bardziej skomplikowane (zobacz kroki konfiguracji SparkPost dla domen śledzenia HTTPS).

  • Zarejestruj domenę śledzenia w swoim koncie SparkPost i zweryfikuj ją. Poczekaj kilka minut przed próbą, aby pozwolić na propagację zmian DNS w Internecie, w zależności od dostawcy DNS.

  • Skonfiguruj PowerMTA, aby używał tej domeny zamiast domyślnej, z

tracking-domain yourdomain.com # Wstaw tutaj swoją własną domenę

Możesz sprawdzić, czy przesyłane wiadomości e-mail mają dodane „piksle otwarte” i linki, które są zawinięte, patrząc na wewnętrzne dane wiadomości (w Gmailu, użyj menu w prawym górnym rogu i wybierz „Pokaż oryginał”).

Show original option highlighted


Zauważysz piksele otwarte na początku i końcu HTML w wiadomości e-mail. Każdy link HTML jest również zmieniony, aby mieć REF  wskazujący na domenę śledzenia.

HTML code highlighted


To wszystko, co musisz zrobić, aby uruchomić SparkPost Signals z wbudowanym śledzeniem zaangażowania PowerMTA.

Zapobieganie śledzeniu konkretnych linków w twojej wiadomości HTML

Możesz zapobiec PowerMTA w śledzeniu konkretnych linków, ustawiając atrybut niestandardowy data-msys-clicktrack  na „0”  :

<a href="#" data-msys-clicktrack="0">Przykład</a>

PowerMTA nie otoczy linku. Usunie także ten atrybut przed przesłaniem wiadomości do odbiorcy.

Wybierz, które strumienie ruchu PowerMTA zgłosić do Signals

Możesz wybrać, które sygnały mają być aktywne:

  • Globalnie (to jest to, co użyliśmy w powyższym przykładzie)

  • Dla niektórych Wirtualnych MTA, a nie dla innych

  • Dla niektórych zbiorów Wirtualnych MTA, a nie dla innych

  • Dla konkretnych adresów „Nadawcy” lub „Od”, które są przekazywane przez PowerMTA, w połączeniu z selekcjami Wirtualnego MTA / zbiorów Wirtualnych MTA

Zakres

Co jest raportowane do Sygnałów

Kiedy go używać

Globalny

Cały ruch z hosta PowerMTA

Proste wdrożenia, w których cały ruch powinien być przesyłany do Sygnałów SparkPost.

Wirtualny MTA

Ruch tylko z wybranych Wirtualnych MTA

Gdy chcesz oddzielne widoki raportowania dla różnych adresów IP lub typów ruchu.

Zbiór Wirtualnych MTA

Ruch z wybranych zbiorów Wirtualnych MTA

Gdy grupujesz adresy IP w zbiory i chcesz raportowanie na poziomie zbioru.

Nadawca / domena „Od”

Wiadomości od konkretnego nadawcy lub domen „Od”

Gdy potrzebujesz raportowania na poziomie klienta lub marki w ramach tej samej infrastruktury.

Ta konfiguracja jest bardzo potężna i jest ilustrowana poprzez serię przykładowych przypadków użycia (v5.0) w podręczniku użytkownika.

Możesz wybrać, które sygnały mają być aktywne:

  • Globalnie (to jest to, co użyliśmy w powyższym przykładzie)

  • Dla niektórych Wirtualnych MTA, a nie dla innych

  • Dla niektórych zbiorów Wirtualnych MTA, a nie dla innych

  • Dla konkretnych adresów „Nadawcy” lub „Od”, które są przekazywane przez PowerMTA, w połączeniu z selekcjami Wirtualnego MTA / zbiorów Wirtualnych MTA

Zakres

Co jest raportowane do Sygnałów

Kiedy go używać

Globalny

Cały ruch z hosta PowerMTA

Proste wdrożenia, w których cały ruch powinien być przesyłany do Sygnałów SparkPost.

Wirtualny MTA

Ruch tylko z wybranych Wirtualnych MTA

Gdy chcesz oddzielne widoki raportowania dla różnych adresów IP lub typów ruchu.

Zbiór Wirtualnych MTA

Ruch z wybranych zbiorów Wirtualnych MTA

Gdy grupujesz adresy IP w zbiory i chcesz raportowanie na poziomie zbioru.

Nadawca / domena „Od”

Wiadomości od konkretnego nadawcy lub domen „Od”

Gdy potrzebujesz raportowania na poziomie klienta lub marki w ramach tej samej infrastruktury.

Ta konfiguracja jest bardzo potężna i jest ilustrowana poprzez serię przykładowych przypadków użycia (v5.0) w podręczniku użytkownika.

Możesz wybrać, które sygnały mają być aktywne:

  • Globalnie (to jest to, co użyliśmy w powyższym przykładzie)

  • Dla niektórych Wirtualnych MTA, a nie dla innych

  • Dla niektórych zbiorów Wirtualnych MTA, a nie dla innych

  • Dla konkretnych adresów „Nadawcy” lub „Od”, które są przekazywane przez PowerMTA, w połączeniu z selekcjami Wirtualnego MTA / zbiorów Wirtualnych MTA

Zakres

Co jest raportowane do Sygnałów

Kiedy go używać

Globalny

Cały ruch z hosta PowerMTA

Proste wdrożenia, w których cały ruch powinien być przesyłany do Sygnałów SparkPost.

Wirtualny MTA

Ruch tylko z wybranych Wirtualnych MTA

Gdy chcesz oddzielne widoki raportowania dla różnych adresów IP lub typów ruchu.

Zbiór Wirtualnych MTA

Ruch z wybranych zbiorów Wirtualnych MTA

Gdy grupujesz adresy IP w zbiory i chcesz raportowanie na poziomie zbioru.

Nadawca / domena „Od”

Wiadomości od konkretnego nadawcy lub domen „Od”

Gdy potrzebujesz raportowania na poziomie klienta lub marki w ramach tej samej infrastruktury.

Ta konfiguracja jest bardzo potężna i jest ilustrowana poprzez serię przykładowych przypadków użycia (v5.0) w podręczniku użytkownika.

Testowanie, czy Twoje wydarzenia docierają do Signals

Oto widok SparkPost Signals, połączonego z PowerMTA. Możesz zobaczyć, że wynik zdrowia się zmienia.

Health score dashboard


Nazwy kampanii są dostępne jako elementy raportowania, obok Subkonto, Pula IP, Dostawca skrzynek pocztowych i Domeny wysyłania.

Oprócz przeglądania logów PowerMTA, możesz sprawdzić, czy dane o zdarzeniach docierają do SparkPost, patrząc na ekran integracji Signals.

Signals integration screen

Na ekranie wyszukiwania zdarzeń SparkPost powinieneś zobaczyć zdarzenia w ciągu kilku minut.  Będą to obejmowały zdarzenia Wstrzyknięcia i Dostawy, a także Zatrzymania, a potencjalnie Zatrzymania poza zapadnięciem wściekłości i Zdarzenia skarg na spam, jeśli już skonfigurowałeś PowerMTA, aby te zdarzenia obsługiwał dla Ciebie.
Jeśli masz włączone śledzenie zaangażowania, zobaczysz również zdarzenia otwarcia , initial_open i kliknięcia .

Oto widok SparkPost Signals, połączonego z PowerMTA. Możesz zobaczyć, że wynik zdrowia się zmienia.

Health score dashboard


Nazwy kampanii są dostępne jako elementy raportowania, obok Subkonto, Pula IP, Dostawca skrzynek pocztowych i Domeny wysyłania.

Oprócz przeglądania logów PowerMTA, możesz sprawdzić, czy dane o zdarzeniach docierają do SparkPost, patrząc na ekran integracji Signals.

Signals integration screen

Na ekranie wyszukiwania zdarzeń SparkPost powinieneś zobaczyć zdarzenia w ciągu kilku minut.  Będą to obejmowały zdarzenia Wstrzyknięcia i Dostawy, a także Zatrzymania, a potencjalnie Zatrzymania poza zapadnięciem wściekłości i Zdarzenia skarg na spam, jeśli już skonfigurowałeś PowerMTA, aby te zdarzenia obsługiwał dla Ciebie.
Jeśli masz włączone śledzenie zaangażowania, zobaczysz również zdarzenia otwarcia , initial_open i kliknięcia .

Oto widok SparkPost Signals, połączonego z PowerMTA. Możesz zobaczyć, że wynik zdrowia się zmienia.

Health score dashboard


Nazwy kampanii są dostępne jako elementy raportowania, obok Subkonto, Pula IP, Dostawca skrzynek pocztowych i Domeny wysyłania.

Oprócz przeglądania logów PowerMTA, możesz sprawdzić, czy dane o zdarzeniach docierają do SparkPost, patrząc na ekran integracji Signals.

Signals integration screen

Na ekranie wyszukiwania zdarzeń SparkPost powinieneś zobaczyć zdarzenia w ciągu kilku minut.  Będą to obejmowały zdarzenia Wstrzyknięcia i Dostawy, a także Zatrzymania, a potencjalnie Zatrzymania poza zapadnięciem wściekłości i Zdarzenia skarg na spam, jeśli już skonfigurowałeś PowerMTA, aby te zdarzenia obsługiwał dla Ciebie.
Jeśli masz włączone śledzenie zaangażowania, zobaczysz również zdarzenia otwarcia , initial_open i kliknięcia .

Używanie znaczących nazw, które dobrze się prezentują w raportach

Ustalanie nazw wirtualnych puli PowerMTA i nazw zadań w sposób znaczący i czytelny dla ludzi jest warte wysiłku. Pojawiają się one bezpośrednio w Twoich aspektach sygnalizacji SparkPost i w raporcie podsumowującym.

Jak wspomniano wcześniej, nie musisz tworzyć tych pul w swoim koncie SparkPost. SparkPost pobiera je z konfiguracji PowerMTA.

Oto jak terminy konfiguracji PowerMTA przekładają się na terminy SparkPost.

Termin PowerMTA Termin Raportów / Sygnalizacji SparkPostDomena odbiorcy

(domain portion of “rcpt” field in Accounting file).Recipient Domain
The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA.
  
(domain portion of “orig” in Accounting file).Sending Domain
VirtualMTA (name)—VirtualMTA Pool (name)
  
(“vmtaPool” in accounting file)IP Pool (name)
smtp-source-host a.b.c.d
  
(“dlvSourceIp” in accounting file)Sending IP a.b.c.d
Job (name)
  
(“jobId” in accounting file)Campaign ID (name)—Template (name)
“Subaccount” is not a native PowerMTA concept


Jednak PowerMTA może oznaczać wirtualne MTA, wirtualne pule MTA lub domeny Nadawcy lub Od z identyfikatorem subkonta do celów raportowania SparkPost.

Subaccount ID (number)
FBL (event)
Spam Complaint (event)
Remote Bounce (event)
Out-of-Band bounce (event)

Ustawienie co najmniej jednego adresu smtp-source-host  umożliwia także SparkPost poprawne zidentyfikowanie adresu IP nadawcy, aby pojawił się w zdarzeniach dotyczących wstrzykiwania i dostarczania, a także w widoku raportu podsumowującego.

Nazwy zadań są ustalane w PowerMTA poprzez nagłówek w wstrzykniętej wiadomości. Umożliwia to indywidualną kontrolę nad zadaniami (wstrzymywanie/wznawianie itp.), co samo w sobie jest użyteczne, a PowerMTA przekazuje nazwy do raportowania sygnalizacji SparkPost jako „ID kampanii”. Zobacz Podręcznik Użytkownika sekcja 12.8 „Śledzenie kampanii w PowerMTA z JobID”.

Jest kilka rzeczy, o których warto pamiętać w kontekście nazywania zadań. Chociaż SparkPost (w formacie JSON i z ucieczką JSON) pozwala na użycie znaków takich jak <SPACE>  w nazwach kampanii, nagłówki mailowe są bardziej restrykcyjne. Dozwolone znaki w nagłówku X-Job  to:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

Innymi słowy, niedozwolone znaki obejmują <SPACE>, cudzysłowy “  i znak odwrotny `. Jeśli przyzwyczaiłeś się do pracy z nazwami X-Job, to nie będzie zaskoczeniem, a Twoje nazwy ID kampanii będą po prostu działały w raportowaniu SparkPost. Jeśli tak jak ja, najpierw nauczyłeś się SparkPost, możesz chcieć narzędzia, aby upewnić się, że Twoje wartości X-Job są bezpieczne; zobacz funkcję dodatkową na końcu tego artykułu.

Termin PowerMTA

Termin Sygnalizacji SparkPost

Wirtualne MTA

Pula IP

Wirtualna pula MTA

Pula IP (grupowa)

Nazwa Zadania (nagłówek X-Job)

ID kampanii

smtp-source-host

Adres IP nadawcy

Domena błędu

Identyfikacja domeny wysyłającej

Domena Nadawcy/Od

Raportowanie w subkoncie / na poziomie domeny

Ustalanie nazw wirtualnych puli PowerMTA i nazw zadań w sposób znaczący i czytelny dla ludzi jest warte wysiłku. Pojawiają się one bezpośrednio w Twoich aspektach sygnalizacji SparkPost i w raporcie podsumowującym.

Jak wspomniano wcześniej, nie musisz tworzyć tych pul w swoim koncie SparkPost. SparkPost pobiera je z konfiguracji PowerMTA.

Oto jak terminy konfiguracji PowerMTA przekładają się na terminy SparkPost.

Termin PowerMTA Termin Raportów / Sygnalizacji SparkPostDomena odbiorcy

(domain portion of “rcpt” field in Accounting file).Recipient Domain
The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA.
  
(domain portion of “orig” in Accounting file).Sending Domain
VirtualMTA (name)—VirtualMTA Pool (name)
  
(“vmtaPool” in accounting file)IP Pool (name)
smtp-source-host a.b.c.d
  
(“dlvSourceIp” in accounting file)Sending IP a.b.c.d
Job (name)
  
(“jobId” in accounting file)Campaign ID (name)—Template (name)
“Subaccount” is not a native PowerMTA concept


Jednak PowerMTA może oznaczać wirtualne MTA, wirtualne pule MTA lub domeny Nadawcy lub Od z identyfikatorem subkonta do celów raportowania SparkPost.

Subaccount ID (number)
FBL (event)
Spam Complaint (event)
Remote Bounce (event)
Out-of-Band bounce (event)

Ustawienie co najmniej jednego adresu smtp-source-host  umożliwia także SparkPost poprawne zidentyfikowanie adresu IP nadawcy, aby pojawił się w zdarzeniach dotyczących wstrzykiwania i dostarczania, a także w widoku raportu podsumowującego.

Nazwy zadań są ustalane w PowerMTA poprzez nagłówek w wstrzykniętej wiadomości. Umożliwia to indywidualną kontrolę nad zadaniami (wstrzymywanie/wznawianie itp.), co samo w sobie jest użyteczne, a PowerMTA przekazuje nazwy do raportowania sygnalizacji SparkPost jako „ID kampanii”. Zobacz Podręcznik Użytkownika sekcja 12.8 „Śledzenie kampanii w PowerMTA z JobID”.

Jest kilka rzeczy, o których warto pamiętać w kontekście nazywania zadań. Chociaż SparkPost (w formacie JSON i z ucieczką JSON) pozwala na użycie znaków takich jak <SPACE>  w nazwach kampanii, nagłówki mailowe są bardziej restrykcyjne. Dozwolone znaki w nagłówku X-Job  to:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

Innymi słowy, niedozwolone znaki obejmują <SPACE>, cudzysłowy “  i znak odwrotny `. Jeśli przyzwyczaiłeś się do pracy z nazwami X-Job, to nie będzie zaskoczeniem, a Twoje nazwy ID kampanii będą po prostu działały w raportowaniu SparkPost. Jeśli tak jak ja, najpierw nauczyłeś się SparkPost, możesz chcieć narzędzia, aby upewnić się, że Twoje wartości X-Job są bezpieczne; zobacz funkcję dodatkową na końcu tego artykułu.

Termin PowerMTA

Termin Sygnalizacji SparkPost

Wirtualne MTA

Pula IP

Wirtualna pula MTA

Pula IP (grupowa)

Nazwa Zadania (nagłówek X-Job)

ID kampanii

smtp-source-host

Adres IP nadawcy

Domena błędu

Identyfikacja domeny wysyłającej

Domena Nadawcy/Od

Raportowanie w subkoncie / na poziomie domeny

Ustalanie nazw wirtualnych puli PowerMTA i nazw zadań w sposób znaczący i czytelny dla ludzi jest warte wysiłku. Pojawiają się one bezpośrednio w Twoich aspektach sygnalizacji SparkPost i w raporcie podsumowującym.

Jak wspomniano wcześniej, nie musisz tworzyć tych pul w swoim koncie SparkPost. SparkPost pobiera je z konfiguracji PowerMTA.

Oto jak terminy konfiguracji PowerMTA przekładają się na terminy SparkPost.

Termin PowerMTA Termin Raportów / Sygnalizacji SparkPostDomena odbiorcy

(domain portion of “rcpt” field in Accounting file).Recipient Domain
The domain portion of the “Sender” or “From” header in the message relayed by PowerMTA.
  
(domain portion of “orig” in Accounting file).Sending Domain
VirtualMTA (name)—VirtualMTA Pool (name)
  
(“vmtaPool” in accounting file)IP Pool (name)
smtp-source-host a.b.c.d
  
(“dlvSourceIp” in accounting file)Sending IP a.b.c.d
Job (name)
  
(“jobId” in accounting file)Campaign ID (name)—Template (name)
“Subaccount” is not a native PowerMTA concept


Jednak PowerMTA może oznaczać wirtualne MTA, wirtualne pule MTA lub domeny Nadawcy lub Od z identyfikatorem subkonta do celów raportowania SparkPost.

Subaccount ID (number)
FBL (event)
Spam Complaint (event)
Remote Bounce (event)
Out-of-Band bounce (event)

Ustawienie co najmniej jednego adresu smtp-source-host  umożliwia także SparkPost poprawne zidentyfikowanie adresu IP nadawcy, aby pojawił się w zdarzeniach dotyczących wstrzykiwania i dostarczania, a także w widoku raportu podsumowującego.

Nazwy zadań są ustalane w PowerMTA poprzez nagłówek w wstrzykniętej wiadomości. Umożliwia to indywidualną kontrolę nad zadaniami (wstrzymywanie/wznawianie itp.), co samo w sobie jest użyteczne, a PowerMTA przekazuje nazwy do raportowania sygnalizacji SparkPost jako „ID kampanii”. Zobacz Podręcznik Użytkownika sekcja 12.8 „Śledzenie kampanii w PowerMTA z JobID”.

Jest kilka rzeczy, o których warto pamiętać w kontekście nazywania zadań. Chociaż SparkPost (w formacie JSON i z ucieczką JSON) pozwala na użycie znaków takich jak <SPACE>  w nazwach kampanii, nagłówki mailowe są bardziej restrykcyjne. Dozwolone znaki w nagłówku X-Job  to:

A-Za-z0-9!#$%&'()*+,-./:;<=>?@[\]^_{|}~ 

Innymi słowy, niedozwolone znaki obejmują <SPACE>, cudzysłowy “  i znak odwrotny `. Jeśli przyzwyczaiłeś się do pracy z nazwami X-Job, to nie będzie zaskoczeniem, a Twoje nazwy ID kampanii będą po prostu działały w raportowaniu SparkPost. Jeśli tak jak ja, najpierw nauczyłeś się SparkPost, możesz chcieć narzędzia, aby upewnić się, że Twoje wartości X-Job są bezpieczne; zobacz funkcję dodatkową na końcu tego artykułu.

Termin PowerMTA

Termin Sygnalizacji SparkPost

Wirtualne MTA

Pula IP

Wirtualna pula MTA

Pula IP (grupowa)

Nazwa Zadania (nagłówek X-Job)

ID kampanii

smtp-source-host

Adres IP nadawcy

Domena błędu

Identyfikacja domeny wysyłającej

Domena Nadawcy/Od

Raportowanie w subkoncie / na poziomie domeny

Wydarzenia FBL (skargi na spam) i zdalne (poza kanałem) odrzuty

PowerMTA może odbierać i przetwarzać zdarzenia FBL (znane w SparkPost jako zdarzenia skarg na spam) oraz zdalne odbicia (znane w SparkPost jako odbicia poza pasmem, ponieważ odpowiedź wraca po pewnym czasie, a nie w trakcie rozmowy SMTP).

W Forum Wsparcia Port25 znajdują się artykuły na temat konfiguracji Procesora Odbicia oraz Procesora FBL. Jeśli jesteś obecnym użytkownikiem PowerMTA, prawdopodobnie już je masz.

Oto konfiguracja, którą przygotowałem na potrzeby prezentacji, oparta na tych artykułach i skierowana na hosting PowerMTA w Amazon EC2.

Jeśli znasz się na konfiguracji PowerMTA w tej dziedzinie, możesz pominąć tę część, aż do następnej poziomej linii.

PowerMTA może odbierać i przetwarzać zdarzenia FBL (znane w SparkPost jako zdarzenia skarg na spam) oraz zdalne odbicia (znane w SparkPost jako odbicia poza pasmem, ponieważ odpowiedź wraca po pewnym czasie, a nie w trakcie rozmowy SMTP).

W Forum Wsparcia Port25 znajdują się artykuły na temat konfiguracji Procesora Odbicia oraz Procesora FBL. Jeśli jesteś obecnym użytkownikiem PowerMTA, prawdopodobnie już je masz.

Oto konfiguracja, którą przygotowałem na potrzeby prezentacji, oparta na tych artykułach i skierowana na hosting PowerMTA w Amazon EC2.

Jeśli znasz się na konfiguracji PowerMTA w tej dziedzinie, możesz pominąć tę część, aż do następnej poziomej linii.

PowerMTA może odbierać i przetwarzać zdarzenia FBL (znane w SparkPost jako zdarzenia skarg na spam) oraz zdalne odbicia (znane w SparkPost jako odbicia poza pasmem, ponieważ odpowiedź wraca po pewnym czasie, a nie w trakcie rozmowy SMTP).

W Forum Wsparcia Port25 znajdują się artykuły na temat konfiguracji Procesora Odbicia oraz Procesora FBL. Jeśli jesteś obecnym użytkownikiem PowerMTA, prawdopodobnie już je masz.

Oto konfiguracja, którą przygotowałem na potrzeby prezentacji, oparta na tych artykułach i skierowana na hosting PowerMTA w Amazon EC2.

Jeśli znasz się na konfiguracji PowerMTA w tej dziedzinie, możesz pominąć tę część, aż do następnej poziomej linii.

Konfiguracja wstrzykiwania

Użyjemy portu 587 dla wstrzykniętych wiadomości, które będą przychodzić przez publiczny Internet z innego hosta. Musimy powstrzymać złych aktorów przed odkrywaniem i nadużywaniem tej usługi, więc stosujemy uwierzytelnianie za pomocą nazwy użytkownika/hasła oraz opcjonalne TLS, podobnie jak w punktach wstrzykiwania SMTP SparkPost.

Chcemy mieć możliwość wysyłania wiadomości z źródeł, które są odpowiednio uwierzytelnione do dowolnego miejsca docelowego. Chcemy też oddzielnego nasłuchu na porcie 25 dla odpowiedzi FBL i zdalnych odbić, które nie wymagają uwierzytelnienia.

# IP address(es) and port(s) on which to listen for incoming SMTP connections
smtp-listener 0.0.0.0:587
smtp-listener 0.0.0.0:25

W poniższych deklaracjach <source>  korzystamy z uwierzytelniania za pomocą nazwy użytkownika/hasła oraz opcjonalnego TLS, aby bronić się przed wstrzyknięciem złośliwych wiadomości. Ustalamy również limity szybkości na połączenia przy podejmowaniu nieudanych prób hasła.

Twoja konfiguracja może być inna; na przykład, jeśli masz prywatną sieć między wstrzykiwaczem a PowerMTA, nie będziesz potrzebować uwierzytelniania hasłem.

# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs #
<source 0/0>
log-connections false
log-commands false    # WARNING: verbose! just for dev
log-data false        # WARNING: even more verbose!
smtp-service true     # allow SMTP service
smtp-max-auth-failure-rate 1/min
allow-unencrypted-plain-auth false
allow-starttls true
rewrite-list mfrom
</source>

<source {auth}>
always-allow-relaying yes   # only if the auth succeeds
default-virtual-mta default
process-x-job true
</source>

Deklaracja <source {auth}> (zobacz tutaj. v5.0) ma zastosowanie po pomyślnym uwierzytelnieniu. Tutaj zezwala na dalsze przesyłanie, ustawia domyślną grupę wirtualnego MTA do użycia i dodaje nagłówek X-Job (który będzie raportowany przez SparkPost Signals jako campaign_id).

Rewrite-list mapuje wstrzyknięte wiadomości, aby używały określonej domeny MAIL FROM (znanej również jako domena odbić lub Return-Path:).

# # Rewrite the MAIL FROM address to match the bounce domain #
<rewrite-list mfrom>
mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net
</rewrite-list>


Następnie skonfigurujemy nasze ustawienia TLS i nazwę użytkownika / hasło SMTP, zgodnie z aktualnymi zaleceniami.

# # Secure the inbound service with username, password and TLS. SMT 2020-06-15 #
smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem
smtp-server-tls-allow-tlsv1 false
smtp-server-tls-allow-tlsv1.1 false
smtp-server-tls-allow-tlsv1.2 true
smtp-server-tls-allow-tlsv1.3 true

# # SMTP users (authenticated via SMTP AUTH) #
<smtp-user SMTP_Injection>
password ##PUT YOUR PASSWORD HERE##
authentication-method password
</smtp-user>


Możemy sprawdzić, że (niebezpieczne, deprecjonowane) TLS v1.0 nie jest akceptowane przy użyciu mojego ulubionego narzędzia testowego SMTP, swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 \
  --to test@trymsys.net \
  --from any@sparkpost.com \
  --tls \
  --tls-protocol tlsv1


Widzimy:

*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0))
*** STARTTLS attempted but failed


Podobnie dla –tls-protocol tlsv1_1.

Zastosujemy również podpisywanie DKIM dla naszych wychodzących wiadomości, ponieważ to dobra praktyka (przestrzegałem tych instrukcji, aby skonfigurować klucz).

# # DKIM #
domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem

Użyjemy portu 587 dla wstrzykniętych wiadomości, które będą przychodzić przez publiczny Internet z innego hosta. Musimy powstrzymać złych aktorów przed odkrywaniem i nadużywaniem tej usługi, więc stosujemy uwierzytelnianie za pomocą nazwy użytkownika/hasła oraz opcjonalne TLS, podobnie jak w punktach wstrzykiwania SMTP SparkPost.

Chcemy mieć możliwość wysyłania wiadomości z źródeł, które są odpowiednio uwierzytelnione do dowolnego miejsca docelowego. Chcemy też oddzielnego nasłuchu na porcie 25 dla odpowiedzi FBL i zdalnych odbić, które nie wymagają uwierzytelnienia.

# IP address(es) and port(s) on which to listen for incoming SMTP connections
smtp-listener 0.0.0.0:587
smtp-listener 0.0.0.0:25

W poniższych deklaracjach <source>  korzystamy z uwierzytelniania za pomocą nazwy użytkownika/hasła oraz opcjonalnego TLS, aby bronić się przed wstrzyknięciem złośliwych wiadomości. Ustalamy również limity szybkości na połączenia przy podejmowaniu nieudanych prób hasła.

Twoja konfiguracja może być inna; na przykład, jeśli masz prywatną sieć między wstrzykiwaczem a PowerMTA, nie będziesz potrzebować uwierzytelniania hasłem.

# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs #
<source 0/0>
log-connections false
log-commands false    # WARNING: verbose! just for dev
log-data false        # WARNING: even more verbose!
smtp-service true     # allow SMTP service
smtp-max-auth-failure-rate 1/min
allow-unencrypted-plain-auth false
allow-starttls true
rewrite-list mfrom
</source>

<source {auth}>
always-allow-relaying yes   # only if the auth succeeds
default-virtual-mta default
process-x-job true
</source>

Deklaracja <source {auth}> (zobacz tutaj. v5.0) ma zastosowanie po pomyślnym uwierzytelnieniu. Tutaj zezwala na dalsze przesyłanie, ustawia domyślną grupę wirtualnego MTA do użycia i dodaje nagłówek X-Job (który będzie raportowany przez SparkPost Signals jako campaign_id).

Rewrite-list mapuje wstrzyknięte wiadomości, aby używały określonej domeny MAIL FROM (znanej również jako domena odbić lub Return-Path:).

# # Rewrite the MAIL FROM address to match the bounce domain #
<rewrite-list mfrom>
mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net
</rewrite-list>


Następnie skonfigurujemy nasze ustawienia TLS i nazwę użytkownika / hasło SMTP, zgodnie z aktualnymi zaleceniami.

# # Secure the inbound service with username, password and TLS. SMT 2020-06-15 #
smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem
smtp-server-tls-allow-tlsv1 false
smtp-server-tls-allow-tlsv1.1 false
smtp-server-tls-allow-tlsv1.2 true
smtp-server-tls-allow-tlsv1.3 true

# # SMTP users (authenticated via SMTP AUTH) #
<smtp-user SMTP_Injection>
password ##PUT YOUR PASSWORD HERE##
authentication-method password
</smtp-user>


Możemy sprawdzić, że (niebezpieczne, deprecjonowane) TLS v1.0 nie jest akceptowane przy użyciu mojego ulubionego narzędzia testowego SMTP, swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 \
  --to test@trymsys.net \
  --from any@sparkpost.com \
  --tls \
  --tls-protocol tlsv1


Widzimy:

*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0))
*** STARTTLS attempted but failed


Podobnie dla –tls-protocol tlsv1_1.

Zastosujemy również podpisywanie DKIM dla naszych wychodzących wiadomości, ponieważ to dobra praktyka (przestrzegałem tych instrukcji, aby skonfigurować klucz).

# # DKIM #
domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem

Użyjemy portu 587 dla wstrzykniętych wiadomości, które będą przychodzić przez publiczny Internet z innego hosta. Musimy powstrzymać złych aktorów przed odkrywaniem i nadużywaniem tej usługi, więc stosujemy uwierzytelnianie za pomocą nazwy użytkownika/hasła oraz opcjonalne TLS, podobnie jak w punktach wstrzykiwania SMTP SparkPost.

Chcemy mieć możliwość wysyłania wiadomości z źródeł, które są odpowiednio uwierzytelnione do dowolnego miejsca docelowego. Chcemy też oddzielnego nasłuchu na porcie 25 dla odpowiedzi FBL i zdalnych odbić, które nie wymagają uwierzytelnienia.

# IP address(es) and port(s) on which to listen for incoming SMTP connections
smtp-listener 0.0.0.0:587
smtp-listener 0.0.0.0:25

W poniższych deklaracjach <source>  korzystamy z uwierzytelniania za pomocą nazwy użytkownika/hasła oraz opcjonalnego TLS, aby bronić się przed wstrzyknięciem złośliwych wiadomości. Ustalamy również limity szybkości na połączenia przy podejmowaniu nieudanych prób hasła.

Twoja konfiguracja może być inna; na przykład, jeśli masz prywatną sieć między wstrzykiwaczem a PowerMTA, nie będziesz potrzebować uwierzytelniania hasłem.

# One source rule for all injection, internal or external. Enforce auth, except for bounces and FBLs #
<source 0/0>
log-connections false
log-commands false    # WARNING: verbose! just for dev
log-data false        # WARNING: even more verbose!
smtp-service true     # allow SMTP service
smtp-max-auth-failure-rate 1/min
allow-unencrypted-plain-auth false
allow-starttls true
rewrite-list mfrom
</source>

<source {auth}>
always-allow-relaying yes   # only if the auth succeeds
default-virtual-mta default
process-x-job true
</source>

Deklaracja <source {auth}> (zobacz tutaj. v5.0) ma zastosowanie po pomyślnym uwierzytelnieniu. Tutaj zezwala na dalsze przesyłanie, ustawia domyślną grupę wirtualnego MTA do użycia i dodaje nagłówek X-Job (który będzie raportowany przez SparkPost Signals jako campaign_id).

Rewrite-list mapuje wstrzyknięte wiadomości, aby używały określonej domeny MAIL FROM (znanej również jako domena odbić lub Return-Path:).

# # Rewrite the MAIL FROM address to match the bounce domain #
<rewrite-list mfrom>
mail-from *@pmta.signalsdemo.trymsys.net *@bounces.pmta.signalsdemo.trymsys.net
</rewrite-list>


Następnie skonfigurujemy nasze ustawienia TLS i nazwę użytkownika / hasło SMTP, zgodnie z aktualnymi zaleceniami.

# # Secure the inbound service with username, password and TLS. SMT 2020-06-15 #
smtp-server-tls-certificate /etc/pmta/pmtasignalsdemo.pem
smtp-server-tls-allow-tlsv1 false
smtp-server-tls-allow-tlsv1.1 false
smtp-server-tls-allow-tlsv1.2 true
smtp-server-tls-allow-tlsv1.3 true

# # SMTP users (authenticated via SMTP AUTH) #
<smtp-user SMTP_Injection>
password ##PUT YOUR PASSWORD HERE##
authentication-method password
</smtp-user>


Możemy sprawdzić, że (niebezpieczne, deprecjonowane) TLS v1.0 nie jest akceptowane przy użyciu mojego ulubionego narzędzia testowego SMTP, swaks.

swaks --server pmta.signalsdemo.trymsys.net --port 587 \
  --to test@trymsys.net \
  --from any@sparkpost.com \
  --tls \
  --tls-protocol tlsv1


Widzimy:

*** TLS startup failed (connect(): error:00000000:lib(0):func(0):reason(0))
*** STARTTLS attempted but failed


Podobnie dla –tls-protocol tlsv1_1.

Zastosujemy również podpisywanie DKIM dla naszych wychodzących wiadomości, ponieważ to dobra praktyka (przestrzegałem tych instrukcji, aby skonfigurować klucz).

# # DKIM #
domain-key mypmta, pmta.signalsdemo.trymsys.net, /etc/pmta/mypmta.pmta.signalsdemo.trymsys.net.pem

Konfiguracja i nazewnictwo VirtualMTA

PowerMTA VirtualMTAs (i pule VirtualMTA) to potężne funkcje do zarządzania strumieniami wiadomości, a raportowanie funkcji PowerMTA / SparkPost Signals działa najlepiej, gdy są one aktywne.

# # Route all outgoing traffic through this virtual mta / pool. #
# Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events
# will carry the correct sending_IP attribute #
<virtual-mta mta1>
    smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net
</virtual-mta>

<virtual-mta-pool default>
    virtual-mta mta1
    <domain *>
        max-smtp-out    20      # max. connections *per domain*
        bounce-after    4d12h   # 4 days, 12 hours
        retry-after     10m     # 10 minutes
        dkim-sign       yes
    </domain>
</virtual-mta-pool>


Ustawienie virtual-mta-pool jest zgłaszane w SparkPost jako „IP Pool” i jest dostępne jako aspekt raportowania SparkPost Signals (rozwijane menu pod wykresami).

Health score dashboard


Raport podsumowujący pokazuje również IP Pool jako aspekt raportowania „Grupa według”.

Summary report dashboard


Jak wspomniano wcześniej w tym artykule, skonfigurowanie przynajmniej jednego adresu smtp-source-host umożliwia również SparkPost prawidłowe zidentyfikowanie adresu IP nadawcy, aby pojawił się on w zdarzeniach dotyczących wstrzykiwania i dostawy oraz w raporcie podsumowującym:

Summary report with the group by filter set to "Sending IP"

To wszystko, czego potrzebujesz, aby uzyskać podstawową integrację między PowerMTA a SparkPost Signals. Znajdziesz pełny przykład pliku konfiguracyjnego tutaj.

Zanim odejdziesz, oto dodatkowa funkcja, o której wspomniałem.

PowerMTA VirtualMTAs (i pule VirtualMTA) to potężne funkcje do zarządzania strumieniami wiadomości, a raportowanie funkcji PowerMTA / SparkPost Signals działa najlepiej, gdy są one aktywne.

# # Route all outgoing traffic through this virtual mta / pool. #
# Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events
# will carry the correct sending_IP attribute #
<virtual-mta mta1>
    smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net
</virtual-mta>

<virtual-mta-pool default>
    virtual-mta mta1
    <domain *>
        max-smtp-out    20      # max. connections *per domain*
        bounce-after    4d12h   # 4 days, 12 hours
        retry-after     10m     # 10 minutes
        dkim-sign       yes
    </domain>
</virtual-mta-pool>


Ustawienie virtual-mta-pool jest zgłaszane w SparkPost jako „IP Pool” i jest dostępne jako aspekt raportowania SparkPost Signals (rozwijane menu pod wykresami).

Health score dashboard


Raport podsumowujący pokazuje również IP Pool jako aspekt raportowania „Grupa według”.

Summary report dashboard


Jak wspomniano wcześniej w tym artykule, skonfigurowanie przynajmniej jednego adresu smtp-source-host umożliwia również SparkPost prawidłowe zidentyfikowanie adresu IP nadawcy, aby pojawił się on w zdarzeniach dotyczących wstrzykiwania i dostawy oraz w raporcie podsumowującym:

Summary report with the group by filter set to "Sending IP"

To wszystko, czego potrzebujesz, aby uzyskać podstawową integrację między PowerMTA a SparkPost Signals. Znajdziesz pełny przykład pliku konfiguracyjnego tutaj.

Zanim odejdziesz, oto dodatkowa funkcja, o której wspomniałem.

PowerMTA VirtualMTAs (i pule VirtualMTA) to potężne funkcje do zarządzania strumieniami wiadomości, a raportowanie funkcji PowerMTA / SparkPost Signals działa najlepiej, gdy są one aktywne.

# # Route all outgoing traffic through this virtual mta / pool. #
# Declare the delivery IP address here, so that SparkPost signals ingest injection (aka "reception") events
# will carry the correct sending_IP attribute #
<virtual-mta mta1>
    smtp-source-host 172.31.25.101 pmta.signalsdemo.trymsys.net
</virtual-mta>

<virtual-mta-pool default>
    virtual-mta mta1
    <domain *>
        max-smtp-out    20      # max. connections *per domain*
        bounce-after    4d12h   # 4 days, 12 hours
        retry-after     10m     # 10 minutes
        dkim-sign       yes
    </domain>
</virtual-mta-pool>


Ustawienie virtual-mta-pool jest zgłaszane w SparkPost jako „IP Pool” i jest dostępne jako aspekt raportowania SparkPost Signals (rozwijane menu pod wykresami).

Health score dashboard


Raport podsumowujący pokazuje również IP Pool jako aspekt raportowania „Grupa według”.

Summary report dashboard


Jak wspomniano wcześniej w tym artykule, skonfigurowanie przynajmniej jednego adresu smtp-source-host umożliwia również SparkPost prawidłowe zidentyfikowanie adresu IP nadawcy, aby pojawił się on w zdarzeniach dotyczących wstrzykiwania i dostawy oraz w raporcie podsumowującym:

Summary report with the group by filter set to "Sending IP"

To wszystko, czego potrzebujesz, aby uzyskać podstawową integrację między PowerMTA a SparkPost Signals. Znajdziesz pełny przykład pliku konfiguracyjnego tutaj.

Zanim odejdziesz, oto dodatkowa funkcja, o której wspomniałem.

Funkcja dodatkowa: Sprawdzanie/filtracja nazwy X-Job

Aby zapewnić, że każdy ciąg znaków jest bezpieczny do użycia jako nazwa zadania X-Job PowerMTA, oto prostą funkcję Pythona, która mapuje wszelkie niebezpieczne znaki na podkreślenie „_”

import re

def pmtaSafeJobID(s):
    """
    :param s: str
    :return: str
    Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header.
    See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid
    Specifically disallow <sp> " ` but allow through most other chars.
    """
    # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html
    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]'
    return re.sub(disallowedChars, '_', s)

To korzysta z wyrażeń regularnych Pythona w specyficzny sposób. Deklaruje zbiór zabronionych znaków za pomocą operatora „komplementu zbioru” ^ zamiast wymieniać wszystkie dozwolone znaki. Oznacza to, że przechwytujemy (i zabezpieczamy) znaki poza zwykłym zestawem 7-bitowym. Możemy to pokazać, używając tego fragmentu testowego:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Daje

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________

Możesz zobaczyć, że <SPACE>, podwójne cudzysłowy „, i backtick `, a także wszystkie znaki poza ~ są mapowane na podkreślenie.

Aby zapewnić, że każdy ciąg znaków jest bezpieczny do użycia jako nazwa zadania X-Job PowerMTA, oto prostą funkcję Pythona, która mapuje wszelkie niebezpieczne znaki na podkreślenie „_”

import re

def pmtaSafeJobID(s):
    """
    :param s: str
    :return: str
    Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header.
    See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid
    Specifically disallow <sp> " ` but allow through most other chars.
    """
    # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html
    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]'
    return re.sub(disallowedChars, '_', s)

To korzysta z wyrażeń regularnych Pythona w specyficzny sposób. Deklaruje zbiór zabronionych znaków za pomocą operatora „komplementu zbioru” ^ zamiast wymieniać wszystkie dozwolone znaki. Oznacza to, że przechwytujemy (i zabezpieczamy) znaki poza zwykłym zestawem 7-bitowym. Możemy to pokazać, używając tego fragmentu testowego:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Daje

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________

Możesz zobaczyć, że <SPACE>, podwójne cudzysłowy „, i backtick `, a także wszystkie znaki poza ~ są mapowane na podkreślenie.

Aby zapewnić, że każdy ciąg znaków jest bezpieczny do użycia jako nazwa zadania X-Job PowerMTA, oto prostą funkcję Pythona, która mapuje wszelkie niebezpieczne znaki na podkreślenie „_”

import re

def pmtaSafeJobID(s):
    """
    :param s: str
    :return: str
    Map an arbitrary campaign ID string into allowed chars for PMTA X-Job header.
    See https://download.port25.com/files/UsersGuide-5.0.html#tracking-a-campaign-in-powermta-with-a-jobid
    Specifically disallow <sp> " ` but allow through most other chars.
    """
    # Note have to escape ' - [ ] and double-escape \ - see https://docs.python.org/3/library/re.html
    disallowedChars = '[^A-Za-z0-9!#$%&\'()*+,\-./:;<=>?@$begin:math:display$\\\\\\\\$end:math:display$^_{|}~]'
    return re.sub(disallowedChars, '_', s)

To korzysta z wyrażeń regularnych Pythona w specyficzny sposób. Deklaruje zbiór zabronionych znaków za pomocą operatora „komplementu zbioru” ^ zamiast wymieniać wszystkie dozwolone znaki. Oznacza to, że przechwytujemy (i zabezpieczamy) znaki poza zwykłym zestawem 7-bitowym. Możemy to pokazać, używając tego fragmentu testowego:

s='' for i in range(32, 256): s += chr(i) print(pmtaSafeJobID(s))

Daje

!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^abcdefghijklmnopqrstuvwxyz{|}~_________________________________________________________

Możesz zobaczyć, że <SPACE>, podwójne cudzysłowy „, i backtick `, a także wszystkie znaki poza ~ są mapowane na podkreślenie.

Inne wiadomości

Przeczytaj więcej z tej kategorii

A person is standing at a desk while typing on a laptop.

Kompletna platforma oparta na sztucznej inteligencji, która rośnie wraz z Twoim biznesem.

A person is standing at a desk while typing on a laptop.

Kompletna platforma oparta na sztucznej inteligencji, która rośnie wraz z Twoim biznesem.