---
title: "Migracja ze SparkPost"
description: "Przenieś integrację e-mail ze SparkPost do Bird z mapowaniami dla transmisji, SMTP, szablonów, suppresji i webhooków, a także listą kontrolną przełączenia."
canonical: "https://bird.com/pl-pl/dokumentacja/guides/email/migrate/sparkpost"
---

# Migracja ze SparkPost

Użyj tego przewodnika, aby przenieść wychodzący e-mail ze SparkPost do Bird. Postępuj zgodnie z [główną listą kontrolną migracji](/docs/guides/email/migrate), korzystając z poniższych mapowań dla swojej integracji HTTP lub SMTP.

## Zanim zaczniesz

Potrzebujesz dostępu do swojego konta SparkPost i subkont, DNS domeny wysyłkowej, konfiguracji aplikacji oraz handlera webhooków. Przygotuj [obszar roboczy Bird](/docs/guides/workspaces) i [klucz API](/docs/api/authentication) w wybranym [regionie](/docs/api/regions). Import rezygnacji wymaga również uprawnienia do zapisu `preferences` na kluczu.

Zinwentaryzuj nadawców, szablony, snippety, listy odbiorców, suppresje, zaplanowane wysyłki, pule IP i webhooki. Uwzględnij SDK, adaptery pocztowe frameworków, zadania w tle i przepływy przychodzącego e-maila. Zapisuj nowe identyfikatory zasobów w miarę ich tworzenia; identyfikatory i dane uwierzytelniające SparkPost nie działają w Bird. Użyj [SDK Bird](/docs/sdks) przy zastępowaniu klienta SparkPost i sprawdź jego ponawianie, limity czasu i paginację.

Jeśli korzystasz z [subkont SparkPost](https://developers.sparkpost.com/api/subaccounts/), [skontaktuj się z nami](/help/support) przed wyborem układu obszarów roboczych. Potwierdź dostępne obszary robocze, uprawnienia, współdzielone zasoby i przepływ provisioningu tenantów. Klucz API obszaru roboczego nie może przełączać tenantów za pomocą `X-MSYS-SUBACCOUNT`. Zachowaj zawieszonych tenantów i ograniczenia wysyłki specyficzne dla tenantów podczas migracji.

Potwierdź, że Twoje [limity planu](/docs/guides/billing-and-usage) Bird i [limity liczby żądań](/docs/guides/rate-limits) pokrywają wolumen wysyłki, liczbę zasobów i szczytowy ruch.

Zarejestruj swoje [domeny wysyłkowe](/docs/guides/email/sending-domains) wcześnie. Zachowaj działające DNS SparkPost i wybierz osobne nazwy hostów return-path i śledzenia tam, gdzie to konieczne. Jeśli rejestracja zgłosi konflikt własności, [skontaktuj się ze wsparciem](/help/support) przed usunięciem aktywnej domeny.

**Dedykowane IP:** [skontaktuj się z nami](/help/support) lub ze swoim zespołem konta przed migracją. Poproś nas o potwierdzenie, czy Twoje istniejące IP SparkPost mogą zostać przeniesione do Bird, i uzgodnij konfigurację puli, harmonogram oraz ewentualny warmup. Podaj region konta, adresy IP, nazwy pul i wolumen wysyłki. Utrzymuj swoje obecne IP aktywne do momentu potwierdzenia planu migracji.

Potwierdź [wybór puli](/docs/guides/email/dedicated-ips-and-pools#select-a-pool-at-send-time) oraz listy dozwolonych IP lub nazw hostów odbiorców przed przełączeniem. Zakup IP nie zmienia domyślnej puli. Nowo zakupione IP mogą wysyłać nadmiar ruchu przez współdzieloną infrastrukturę podczas [warmupu](/docs/guides/email/ip-warmup), co ma znaczenie, jeśli odbiorcy przyjmują pocztę tylko z określonych IP.

## Przekaż to swojemu agentowi

Wklej to do swojego agenta kodującego w repozytorium aplikacji:

```text
Help me migrate my SparkPost email integration to Bird.
1. Use an existing Bird MCP connection or signed-in CLI. Otherwise follow https://bird.com/docs/ai/set-up-your-agent.md. Append .md to Bird docs URLs to read Markdown.
2. Read https://bird.com/docs/guides/email/migrate/sparkpost.md and https://bird.com/docs/guides/email/migrate.md. Make a read-only inventory of my SparkPost call sites, SDKs, resource IDs, configured URLs, sending domains, and scheduled jobs before editing. Never print API keys.
3. Propose workspace and region mappings. If subaccounts, dedicated IPs, or domain ownership conflicts need a migration plan, use the available Bird tools to open a human email support ticket and return its ID. For CLI usage, read https://bird.com/docs/cli/reference/support-tickets-create.md. Wait for the agreed plan before moving those resources.
4. Follow https://bird.com/docs/guides/email/sending-domains.md; preserve working DNS and show me proposed records. Ask before DNS changes or paid provisioning.
5. Port sending, templates, and webhooks using this guide. Preserve recipient privacy, personalization, and categories. Export suppressions with scope and type; show me the handling before importing or changing preferences.
6. Test using https://bird.com/docs/guides/email/testing-sandbox.md. Show me results and unresolved differences, including tracking, signatures, and correlation.
7. Ask for explicit approval before production cutover. Keep a rollback path; get separate approval before retiring SparkPost resources or credentials.
```

## Zamapuj wywołanie wysyłki

Zastąp `POST /api/v1/transmissions` wywołaniem [`POST /v1/email/messages`](/docs/api/reference/create-email-message) lub [`POST /v1/email/batches`](/docs/api/reference/create-email-message-batch) dla niezależnych wiadomości. [Przegląd API SparkPost](https://developers.sparkpost.com/api/) zawiera listę regionalnych hostów i uwierzytelniania. Bird używa `https://us1.platform.bird.com` lub `https://eu1.platform.bird.com`, zgodnie z regionem klucza API, z `Authorization: Bearer $BIRD_API_KEY`.

Transmisja SparkPost może generować oddzielne, spersonalizowane wiadomości e-mail dla swoich odbiorców. Bird współdzieli treść i parametry między odbiorcami jednej wysyłki. Użyj osobnej wiadomości dla każdej personalizacji, opcjonalnie grupując je w [partię](/docs/guides/email/sending-bulk). Wysyłki tylko do To pozostają adresowane indywidualnie; sprawdź widoczne nagłówki przy dodawaniu kopii Cc/Bcc.

Zamapuj [pola transmisji SparkPost](https://developers.sparkpost.com/api/transmissions/):

| SparkPost                                         | Migracja do Bird                                                                                                                                                        |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `content.from`, `subject`, `html`, `text`         | Pola najwyższego poziomu o tych samych nazwach                                                                                                                          |
| `content.reply_to`                                | Tablica `reply_to`                                                                                                                                                      |
| `recipients[].address`                            | Jedna wiadomość na spersonalizowanego odbiorcę                                                                                                                          |
| `address.header_to`, `content.headers.CC`         | Odbuduj grupy `to` / `cc` / `bcc`; zobacz uwagę o adresowaniu poniżej                                                                                                   |
| `content.headers`                                 | `headers`; sprawdź zarezerwowane nazwy w przewodniku wysyłki                                                                                                            |
| `substitution_data`                               | Inline `parameters` lub zapisany `template.parameters`; rozwiąż nadpisania i zmieść się w [mniejszym limicie parametrów](/docs/guides/email/sending-email#content) Bird |
| `content.template_id`                             | Nowy szablon Bird `id` lub `slug`; najpierw skonwertuj i opublikuj treść                                                                                                |
| Transmission/recipient `metadata`                 | Scal do `metadata`, gdzie klucze odbiorcy wygrywają; zmieść się w [mniejszym limicie metadanych](/docs/guides/email/sending-email#tags-vs-metadata) Bird                |
| Recipient `tags`, `campaign_id`                   | Wybierz tagi `{ name, value }`; broadcast nie jest tworzony                                                                                                             |
| `options.transactional`                           | Jawne `category`: `transactional` lub `marketing`                                                                                                                       |
| `options.open_tracking`, `options.click_tracking` | `track_opens`, `track_clicks`; najpierw rozwiąż nadpisania                                                                                                              |
| `options.start_time`                              | `scheduled_at`; treść szablonu jest ustalana w momencie przyjęcia; zobacz uwagi dotyczące planowania poniżej                                                            |
| `options.ip_pool`                                 | Bird `ip_pool_id`; skontaktuj się z nami przed przeniesieniem dedykowanych adresów IP                                                                                   |
| `content.attachments`                             | `type` → `content_type` (bazowy typ MIME), `name` → `filename`, `data` → base64 `content`; zweryfikuj pliki zależne od parametrów MIME                                  |
| `content.inline_images`                           | To samo mapowanie plików, plus `name` → `content_id`; zobacz poniżej                                                                                                    |
| `return_path`, `tracking_domain`                  | Konfiguracja domeny Bird; zobacz poniżej                                                                                                                                |
| `content.ab_test_id`                              | Wybierz warianty i śledź wyniki w swojej aplikacji; brak bezpośredniego odpowiednika w polach wysyłki                                                                   |

Dla kopii To/Cc/Bcc jednego e-maila odbuduj grupę odbiorców jednokrotnie. [Wyświetlane adresy](https://developers.sparkpost.com/api/recipient-lists/#header-address-object) SparkPost mogą różnić się od odbiorców doręczenia; `to`, `cc` i `bcc` w Bird dodają odbiorców doręczenia. Skopiowanie nagłówka `CC` SparkPost do `cc` każdej rozwiniętej wiadomości może spowodować wysłanie duplikatów. Zweryfikuj widoczne nagłówki i liczbę odbiorców przed przełączeniem.

Sprawdź [limity pól wysyłki](/docs/guides/email/sending-email), [planowanie](/docs/guides/email/scheduled-sending) i [zasady dotyczące załączników](/docs/guides/email/attachments). Zaktualizuj identyfikatory obrazów inline i pasujące odniesienia `cid:` zgodnie z zasadami Bird. Skonfiguruj [ścieżkę zwrotną](/docs/guides/email/bounce-domain) i [domenę śledzenia](/docs/guides/email/tracking-domain) na domenie.

Pola wysyłki HTTP w Bird nie obejmują `content.email_rfc822`, `content.amp_html` ani `options.inline_css` SparkPost. Odbuduj surowe wiadomości z obsługiwanymi polami, zapewnij fallbacki HTML/text dla AMP i wstaw CSS inline przed wysłaniem HTML. SMTP parsuje i odbudowuje obsługiwane części wiadomości; zweryfikuj otrzymany MIME, jeśli zależy ci na jego dokładnej strukturze. Parametry MIME załączników, takie jak kalendarzowy `method` lub tekstowy `charset`, nie są zachowywane.

Dla zaplanowanych wiadomości API, Bird utrwala wersję szablonu, język i parametry w momencie przyjęcia żądania. Późniejsze edycje szablonu nie aktualizują tej wiadomości. Aby ją zmienić, [anuluj zaplanowaną wiadomość](/docs/guides/email/scheduled-sending#canceling-a-scheduled-send) przed rozpoczęciem przetwarzania, a następnie wyślij zamiennik. Zachowaj grupę identyfikatorów wiadomości Bird, jeśli chcesz zastąpić anulowanie oparte na kampaniach w SparkPost.

Ustaw `BIRD_API_KEY` na swój klucz Bird. Ten przykład [sandbox](/docs/guides/email/testing-sandbox) nie wymaga zweryfikowanej domeny i nie trafia do żadnej prawdziwej skrzynki. Dla klucza EU użyj `https://eu1.platform.bird.com`:

```bash
curl --fail-with-body https://us1.platform.bird.com/v1/email/messages \
  -H "Authorization: Bearer $BIRD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "onboarding@messagebird.dev",
    "to": ["delivered@messagebird.dev"],
    "subject": "Your receipt",
    "text": "Thanks for your order, {{ first_name }}.",
    "parameters": {"first_name": "Alex"},
    "category": "transactional",
    "metadata": {"order_id": "order_123"},
    "tags": [{"name": "mailstream", "value": "receipts"}]
  }'
```

Oczekuj `202 Accepted` i identyfikatora wiadomości `em_`. Zapisz ten identyfikator i śledź wyniki dla odbiorców przez [zdarzenia](/docs/guides/email/events). Przyjęcie nie oznacza doręczenia: odbiorca objęty suppresją może zostać przyjęty, a następnie odrzucony. Zaktualizuj parsowanie odpowiedzi, [obsługę błędów](/docs/guides/errors) i [idempotentne ponowne próby](/docs/guides/idempotency) wraz z wywołaniem wysyłki.

W przypadku partii odczytaj tablicę `data` i zapisz ID każdej wiadomości w swoim rejestrze wysyłek. Bird waliduje partię przed umieszczeniem w kolejce: jedna nieprawidłowa wiadomość może spowodować odrzucenie całego żądania. Podziel duże transmisje, aby zmieścić się w [limitach partii](/docs/guides/email/sending-bulk), i stosuj reguły ponownych prób Bird, gdy odpowiedź jest niejednoznaczna.

Nadaj każdemu odrębnemu żądaniu lub fragmentowi partii własny stabilny klucz idempotentności. [Okno powtórzenia](/docs/guides/idempotency) Bird różni się od okna SparkPost; przechowuj rejestr wysyłek aplikacji dłużej niż to okno, aby zapobiec duplikatom podczas przełączania lub wycofywania.

## Przenieś nadawców SMTP

Użyj [ustawień połączenia SMTP](/docs/guides/email/smtp) Bird, nazwy użytkownika `bird` i klucza API z włączonym wysyłaniem e-maili. Sprawdź region, TLS i konfigurację klucza.

Skonwertuj [opcje `X-MSYS-API`](https://developers.sparkpost.com/api/smtp/) SparkPost przed usunięciem nagłówka. Ustaw domyślne wartości kategorii, tagów, śledzenia i puli w [konfiguracji SMTP](/docs/guides/email/smtp#what-comes-from-the-message-and-what-comes-from-the-keys-configuration) Bird. Te ustawienia obowiązują na klucz API; użyj oddzielnych skonfigurowanych kluczy lub HTTP, gdy różnią się między wiadomościami. Użyj HTTP do metadanych lub parametrów szablonu na poziomie wiadomości.

Umieść każdego odbiorcę doręczenia w kopercie SMTP, widocznych odbiorców w nagłówkach MIME `To`/`Cc`, a odbiorców Bcc tylko w kopercie. Zinwentaryzuj `X-MSYS-API.archive` oddzielnie: kopie archiwalne SparkPost zachowują adresy URL śledzenia oryginalnego odbiorcy, więc zwykłe Bcc nie jest równoważne. Zwaliduj zamiennik przed przełączeniem tego przepływu.

Skopiuj swoje efektywne ustawienia śledzenia jawnie: nieskonfigurowany klucz SMTP Bird włącza śledzenie otwarć i kliknięć, podczas gdy domyślne ustawienia SparkPost różnią się w zależności od konta. Ustaw też kategorię: Bird SMTP domyślnie oznacza wiadomości jako transakcyjne, a inline HTTP jako marketingowe. Nadawcy newsletterów potrzebują `marketing` na obu ścieżkach.

Przy [ponownych próbach SMTP](/docs/guides/email/smtp#retrying-safely) użyj ponownie klucza idempotentności, koperty i dokładnie tych samych bajtów MIME. Ponowne wygenerowanie `Date`, `Message-ID` lub granic MIME zmienia ładunek i może uniemożliwić bezpieczną ponowną próbę.

## Skonwertuj szablony

Wyeksportuj wersje, które faktycznie wysyłasz, przez [Templates API](https://developers.sparkpost.com/api/templates/) SparkPost: wylistuj za pomocą `GET /api/v1/templates?draft=false`, a następnie pobierz treść za pomocą `GET /api/v1/templates/{id}?draft=false`. W razie potrzeby zapisz wersje robocze oddzielnie. Uwzględnij w inwentaryzacji szablony współdzielone z subkontami i powiązane [snippety](https://developers.sparkpost.com/api/snippets/).

[Język szablonów](https://developers.sparkpost.com/api/template-language/) SparkPost i składnia Liquid Bird różnią się. Skonwertuj warunki, pętle, wartości domyślne i zagnieżdżone wartości. Rozwiąż nadpisania odbiorcy i metadane używane do renderowania jako jawne parametry. Na przykład `{{ if ... }}` staje się `{% if ... %}`. Sama wspólna składnia `{{ name }}` nie zapewnia kompatybilności.

Rozwiń snippety przed publikacją; Liquid Bird nie obsługuje `include` ani `render`. W przypadku przechowywanych szablonów zastąp zewnętrzne odwołania, takie jak `{{ user.name }}`, płaskimi parametrami, takimi jak `{{ user_name }}`. Jeśli wstawiasz dynamiczny HTML przez parametry SparkPost, wyrenderuj go w swojej aplikacji i prześlij gotową treść bez inline `parameters`; zwykłe wartości parametrów HTML są escapowane.

Utwórz, wyświetl podgląd i opublikuj [szablon Bird](/docs/guides/email/templates), a następnie postępuj zgodnie z [wysyłaniem z szablonem](/docs/guides/email/sending-email#sending-with-a-template). Przenieś efektywnego nadawcę, Reply-To i niestandardowe nagłówki ze SparkPost do żądania wysyłki; szablony Bird dostarczają treść.

W przypadku inline Liquid dołącz `parameters`, nawet `{}`; pominięcie pozostawia tokeny bez zmian. Zweryfikuj brakujące wartości, escapowanie i adresy URL.

Zastąp placeholdery rezygnacji z subskrypcji za pomocą `{{ bird.unsubscribe_url }}`. Bird dostarcza [nagłówki rezygnacji z subskrypcji marketingowej](/docs/guides/email/unsubscribe-links); usuń niestandardowe nagłówki `List-Unsubscribe` i `List-Unsubscribe-Post` z wysyłek marketingowych, aby uniknąć odrzucenia `422`.

Linki rezygnacji z subskrypcji Bird wyłączają adres z e-maili marketingowych w całym obszarze roboczym. Linki te nie zapewniają rezygnacji specyficznych dla listy. Sprawdź to zachowanie, jeśli Twoja integracja SparkPost oferuje oddzielne subskrypcje.

## Przenieś listy odbiorców

Wyeksportuj każdą [przechowywaną listę odbiorców](https://developers.sparkpost.com/api/recipient-lists/) z `GET /api/v1/recipient-lists/{id}?show_recipients=true`, aby uwzględnić członkostwo i personalizację. Utwórz docelowe [grupy odbiorców](/docs/guides/email/audiences) i zarejestruj [właściwości kontaktów](/docs/guides/email/contacts#contact-properties) przed importem. Sprawdź wynik każdego importu i uzgodnij liczby członków.

Właściwości kontaktów należą do kontaktu we wszystkich jego grupach odbiorców. Jeśli ten sam adres ma różne dane podstawieniowe w kilku listach SparkPost, uzgodnij te wartości przed importem, aby uniknąć ich nadpisania. Właściwości kontaktów Bird mają typy skalarne; przechowuj personalizację specyficzną dla listy lub o złożonej strukturze w swojej aplikacji, gdy nie można jej bezpiecznie odwzorować.

Używaj [rozgłoszeń](/docs/guides/email/broadcasts), gdy opublikowany szablon może być wypełniony z właściwości kontaktów. Członkostwo w grupie odbiorców jest rozwiązywane w momencie rozpoczęcia wysyłki i obowiązują limity wysyłki i współbieżności rozgłoszeń. Używaj niezależnych [wiadomości wsadowych](/docs/guides/email/sending-bulk) dla parametrów specyficznych dla żądania lub ustalonej migawki odbiorców. Zweryfikuj obsługę zgód i suppresji przed aktywacją zmigrowanej listy.

## Wyeksportuj suppresje

Wyeksportuj przed rozpoczęciem wysyłki produkcyjnej. Zacznij od `GET /api/v1/suppression-list?cursor=initial&types=transactional,non_transactional,open_tracking`, a następnie kontynuuj paginację do końca. Zapisz kompletne rekordy, w tym typ, źródło, ID listy, subkonto i znaczniki czasu. Użyj `X-MSYS-SUBACCOUNT: 0` dla konta głównego i ID każdego subkonta dla jego własnej listy. Zobacz [Suppression List API](https://developers.sparkpost.com/api/suppression-list/) SparkPost.

Sklasyfikuj rekordy według typu, źródła i zakresu przed użyciem pętli importu z głównego przewodnika. [`POST /v1/email/suppressions`](/docs/api/reference/create-suppression) Bird przyjmuje `email` i tworzy ręczną blokadę na poziomie całego obszaru roboczego dla obu kategorii:

- **Adresy zablokowane przed odbieraniem e-maili:** zaimportuj te, które powinny być zablokowane we wszystkich kategoriach. Zachowaj oryginalny eksport do uzgodnienia; zaimportowane rekordy zawierają ręczny powód Bird.
- **Rezygnacje marketingowe na poziomie konta:** użyj [`POST /v1/preferences`](/docs/api/reference/create-preference) z `channel: "email"`, adresem w `handle`, `status: "revoked"` i `coverage: "non_transactional"`. Ustaw `source: "sparkpost-migration"` na potrzeby uzgadniania. Najpierw sprawdź istniejące preferencje Bird i zachowaj bardziej restrykcyjne ograniczenia; po każdym zapisie sprawdź `applied` i zwróconą preferencję.
- **Ograniczenia specyficzne dla listy lub wyłącznie transakcyjne:** zachowaj ich zakres w logice kwalifikacji wysyłki swojej aplikacji. Preferencje e-mail Bird obowiązują na poziomie całego kanału i nie mogą odwzorować tych zakresów. Ręczna suppresja może również zablokować resetowanie haseł. Wstrzymaj dotknięty ruch do czasu zweryfikowania zastępczego rozwiązania.
- **Rezygnacje ze śledzenia otwarć:** ustaw `track_opens: false` dla wiadomości niezależnej, oprócz wszelkich ograniczeń wysyłki. Dla SMTP użyj klucza z wyłączonym śledzeniem otwarć lub użyj HTTP do sterowania na poziomie pojedynczej wiadomości.

Powyższe żądanie preferencji rejestruje ograniczenie w momencie importu. Zachowaj oryginalne znaczniki czasu ze SparkPost w eksporcie i uzgodnij wszelkie późniejsze zgody przed zapisem. Uzgodnij zaimportowane rekordy i nieudane zapisy, a następnie przetestuj obie kategorie. Synchronizuj nowe rezygnacje i suppresje, gdy obaj dostawcy wysyłają wiadomości. Po przełączeniu kontynuuj stosowanie rezygnacji z wcześniej dostarczonych wiadomości SparkPost w Bird. Zobacz [Suppresje](/docs/guides/email/suppressions), aby poznać natywną obsługę odrzuceń i skarg.

## Mapowanie zdarzeń webhooków

SparkPost wysyła [zbatchowane zdarzenia webhooków](https://developers.sparkpost.com/api/webhooks/) w ramach wrapperów `msys`. Bird dostarcza jedno zdarzenie na żądanie z `type`, `timestamp` i `data`. [Zarejestruj endpoint Bird](/docs/guides/webhooks) z jawnymi subskrypcjami zdarzeń i weryfikacją sygnatury. Utrzymuj handler SparkPost aktywny dla pozostałego ruchu.

| Zdarzenie SparkPost                    | Zdarzenie Bird             |
| -------------------------------------- | -------------------------- |
| `injection`                            | `email.processed`          |
| `delivery`                             | `email.delivered`          |
| `delay`                                | `email.deferred`           |
| `bounce`                               | `email.bounced`            |
| `out_of_band`                          | `email.out_of_band_bounce` |
| `spam_complaint`                       | `email.complained`         |
| Błędy po stronie wysyłki (patrz niżej) | `email.rejected`           |
| `open`, `initial_open`                 | `email.opened`             |
| `click`                                | `email.clicked`            |
| `link_unsubscribe`                     | `email.unsubscribed`       |
| `list_unsubscribe`                     | `email.list_unsubscribed`  |

Bezpośrednie wysyłki API i SMTP emitują `email.accepted` przed przetworzeniem. Broadcasty rejestrują akceptację w zdarzeniach API i logu e-mail, ale pomijają ten webhook. SparkPost `policy_rejection`, `generation_failure` i `generation_rejection` mapują się na `email.rejected`; sprawdź `rejection_reason`. Deduplikuj otwarcia osobno, licząc unikalne zaangażowanie.

Użyj `data.email_id` i `data.recipient_id` do korelacji Bird i przekazuj własne identyfikatory w `metadata`. Zastąp obsługę batch-ID ze SparkPost [regułami deduplikacji i kolejności webhooków](/docs/guides/webhooks) Bird. Przeczytaj szczegóły zwrotki, zanim zdecydujesz, czy adres powinien zostać objęty suppresją; [klasyfikacja zwrotek](/docs/guides/email/events#bounce-classification) rozróżnia trwałe błędy adresu od tymczasowych lub wynikających z polityki.

## Zachowaj historię raportowania

Wyeksportuj [historię zdarzeń SparkPost](https://developers.sparkpost.com/api/events/) i [raporty zagregowane](https://developers.sparkpost.com/api/metrics/), których potrzebujesz, zanim upłyną ich okna retencji. Przeiteruj paginację zdarzeń do końca i zachowaj identyfikatory dostawcy, zakres konta/subkonta, znaczniki czasu i filtry raportowania. Zbieraj spóźnione zdarzenia w trakcie okresu współistnienia i przechowuj historię SparkPost w osobnym archiwum.

Zapisz punkt odniesienia dla każdego strumienia wysyłek. Porównaj pasujące populacje odbiorców i okna raportowania, a następnie sprawdź [definicje metryk](/docs/guides/email/tracking-and-metrics): akceptacja przez dostawcę, dostarczenie na serwer odbiorcy, unikalne zaangażowanie i wstępnie pobrane otwarcia to różne miary. Sama zgodność nazw metryk nie oznacza porównywalnych wskaźników.

## Zmigruj pocztę przychodzącą osobno

Jeśli używasz [webhooków relay SparkPost](https://developers.sparkpost.com/api/relay-webhooks/), postępuj zgodnie z przewodnikiem [Odbieranie e-maili](/docs/guides/email/receiving-email). Webhook `email.received` w Bird dostarcza `inbound_message_id`; pobieraj treść, załączniki lub surowy MIME przez API zamiast oczekiwać pełnej wiadomości w webhooku. Przetestuj swój handler z adresem przekierowania Bird, a następnie skonfiguruj odbieranie na domenie przed zmianą rekordów MX. Zweryfikuj routing odpowiedzi po zmianie DNS i zarchiwizuj treści, które potrzebujesz poza okresem przechowywania odbieranych wiadomości w Bird.

## Weryfikacja i przełączenie

1. Zweryfikuj zdolność wysyłania każdej domeny. Uruchom [test dymny w sandboxie](/docs/guides/email/migrate#5-verify-in-the-sandbox-before-cutover) i przypadki skarg. Upewnij się, że podpisane zdarzenia docierają do Twojego handlera, są powiązane z właściwą wiadomością i że obsługujesz zduplikowane dostarczenia. Zdarzenia z sandboxa nie dowodzą dostarczenia do skrzynki, renderowania ani śledzenia.
2. Wyślij ze zweryfikowanej domeny do kontrolowanych, rzeczywistych skrzynek odbiorczych. Sprawdź personalizację, widoczność To/Cc/Bcc, załączniki, uwierzytelnianie i śledzenie. Przetestuj wypisanie: marketing musi się zatrzymać, a kwalifikujące się wiadomości transakcyjne powinny dalej docierać. Osobno przetestuj, czy blokady dla wszystkich kategorii odrzucają oba typy. Nie łącz tych testów z symulowanymi wynikami z sandboxa.
3. Przypisz oczekujące zaplanowane wysyłki do jednego dostawcy. Opróżnij kolejkę lub anuluj oryginał przed ponownym utworzeniem go u innego dostawcy. Prowadź w aplikacji rejestr, który dostawca przyjął każdą logiczną wysyłkę, aby ponowne próby lub wycofanie nie spowodowały wysłania drugiej kopii.
4. Przenieś kontrolowaną część ruchu i monitoruj [metryki dostarczania](/docs/guides/email/tracking-and-metrics) oraz przetwarzanie webhooków. W przypadku dedykowanych IP postępuj zgodnie z planem migracji uzgodnionym z naszym zespołem, w tym z ewentualnym [rozgrzewaniem](/docs/guides/email/ip-warmup). Zwiększaj ruch po tym, jak zaobserwowane wyniki spełnią Twoje wymagania dotyczące dostarczania.
5. Jeśli walidacja się nie powiedzie, wstrzymaj ruch Bird, którego dotyczy problem, i kieruj nowe wysyłki przez zachowaną ścieżkę SparkPost z aktualnymi wypisaniami. Uzgodnij niejednoznaczne wysyłki przed ponownym ich wysłaniem. Wycofaj stare poświadczenia, webhooki i DNS po rozliczeniu kolejek i spóźnionych zdarzeń; zachowaj działające stare linki śledzące i wypisania dla wcześniej dostarczonych wiadomości.

Jeśli uwierzytelnianie się nie powiedzie, sprawdź token bearer Bird i region. Jeśli import preferencji zwraca `403`, sprawdź uprawnienie zapisu `preferences` na kluczu przed kontynuowaniem. Jeśli personalizacja renderuje się nieprawidłowo, zbadaj konwersję Liquid i parametry. Jeśli wiadomości transakcyjne są nieoczekiwanie odrzucane, sprawdź zaimportowane ręczne suppresje. Użyj [dziennika e-mail](/docs/guides/email/email-log) i szczegółów zdarzeń, aby zweryfikować każdą poprawkę.

## Następne kroki

- [Wysyłanie e-maili](/docs/guides/email/sending-email): pola ładunku, personalizacja i asynchroniczne wyniki
- [Szablony e-mail](/docs/guides/email/templates): podgląd, publikacja i obsługa Liquid
- [Suppresje](/docs/guides/email/suppressions): przyczyny suppresji i zarządzanie
- [Webhooki i zdarzenia](/docs/guides/webhooks): sygnatury, ponawianie i odtwarzanie

## Related resources

- [Getting started with email](/learn/email/getting-started-with-email) (video)
- [Email](/email-api) (product)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=email)
