Załóżmy, że twój zespół wypuszcza nowy e-mail z resetem hasła. QA akceptuje wersję na stagingu: wiadomość się pojawia, link działa, szablon wygląda dobrze. Dwa dni po wydaniu support ma kolejkę zgłoszeń. Osoby z adresami Gmail piszą, że e-mail nie przyszedł. Osoby z kilku dużych firm piszą, że przyszedł, ale przy pierwszym kliknięciu link był „już użyty”. Nikt nie zmieniał kodu między stagingiem a produkcją, a wszystkie testy nadal przechodzą.
Który testowy adres e-mail dla programistów by to wychwycił? Żaden jeden. Lokalny przechwytywacz SMTP nadaje się do codziennej pracy, piaskownica dostawcy albo domena testowa pod twoją kontrolą do testów automatycznych, a prawdziwa zewnętrzna skrzynka do ręcznego sprawdzenia, czy poczta wychodzi z konfiguracji zbliżonej do produkcyjnej i trafia do cudzej domeny. Ten ostatni przypadek pokryje tymczasowa skrzynka, taka jak VookMail, bez żadnej konfiguracji, bo adres jest gotowy w chwili załadowania strony. Konta kontrolne u dużych dostawców poczty obejmują potem to, czego nic z tego nie widzi. Reszta tego poradnika dotyczy wyboru spośród tych opcji, czytania błędów, gdy już się zdarzą, i kontroli, które powinny wejść do wydania.
Dlaczego ten reset przeszedł na stagingu
Staging i produkcja rzadko są tak podobne, jak sugeruje schemat wdrożenia, a e-mail ujawnia te różnice mocniej niż większość funkcji. Wiadomość przechodzi przez twoją aplikację, kolejkę, dostawcę, DNS, serwer odbiorcy i klienta odbiorcy. Na stagingu prawie każdy z tych elementów może być w innej wersji.
Weźmy pierwsze zgłoszenie, użytkowników Gmaila, którzy nic nie dostali. Załóżmy, że staging wysyła przez subdomenę dostawcy uwierzytelnioną miesiące temu, a produkcja wysyła z nowej domeny w polu From, wprowadzonej przy zmianie marki. Wytyczne Google dla nadawców wymagają, by wszyscy nadawcy uwierzytelniali się przez SPF lub DKIM, a tabela błędów Gmaila podaje 5.7.26 dla poczty bez uwierzytelnienia. Wewnętrzna skrzynka QA w twojej domenie może przepuścić tę samą wiadomość, bo twój serwer może ufać twojemu własnemu przekaźnikowi. Ten test nigdy nie mógł się nie udać.
Drugie zgłoszenie, link „już użyty”, ma inną przyczynę. Firmowe bramy bezpieczeństwa często otwierają linki w przychodzącej poczcie, by je przeskanować, zanim zobaczy je człowiek. Jeśli twój link wykorzystuje token przy zwykłym zapytaniu GET, skaner go zużywa, a pracownik klika martwy link. Żadna twoja skrzynka na stagingu nie uruchamia takiego skanera, chyba że akurat używa go twoja firma.
Tych dwóch błędów nie widać z tego samego miejsca. Jeden wymaga prawdziwego dostarczenia do systemu odbiorcy, którego nie prowadzisz. Drugi wymaga zmiany sposobu, w jaki działa link, co łatwiej wyłapie przegląd kodu niż test. Na tym polega sens testów warstwowych: każdy rodzaj adresu odpowiada na jedno pytanie i milczy w pozostałych sprawach.
| Co często różni staging od produkcji | Co to może ukryć |
|---|---|
Domena wysyłająca i adres From | Brakujące lub niedopasowane SPF i DKIM |
| Konto lub podkonto u dostawcy | Tryb piaskownicy, limity wysyłki, inna reputacja IP |
| Odbiorcy | Domeny wewnętrzne, które ci ufają, i listy dozwolonych, które ukrywają złe adresy |
| Śledzenie kliknięć | Przepisane linki, które przestają działać, albo domena śledząca bez ważnego certyfikatu |
| Wolumen | Kolejki i limity, które dają o sobie znać dopiero pod obciążeniem |
| Listy supresji | Adresy produkcyjne, które raz odbiły wiadomość i są teraz po cichu pomijane |
| Ustawienia bazowego URL | Linki wskazujące na zły host |
Który adres odpowiada na które pytanie
Oto opcje, każda z pytaniem, na które naprawdę potrafi odpowiedzieć.
Lokalny przechwytywacz: „co wygenerowała moja aplikacja?”
Przechwytywacz SMTP przyjmuje wszystko, co wyśle twoja aplikacja, i wyświetla to na stronie, niczego nie dostarczając. Popularnym rozwiązaniem open source jest Mailpit. Domyślnie nasłuchuje SMTP na porcie 1025, a swój interfejs internetowy udostępnia na porcie 8025, więc ustawiasz środowisko programistyczne na localhost:1025 i otwierasz http://localhost:8025. Ethereal z Nodemailera to podobny pomysł, z hostowaną fałszywą usługą SMTP. Przechwytywacz jest szybki i prywatny, pozwala wysyłać na dowolny adres bez ryzyka, że trafi do prawdziwej osoby. Nic jednak nie mówi o DNS, uwierzytelnianiu ani filtrowaniu, bo nic nie przechodzi przez internet.
Pomocnik testowy frameworka: „czy mój kod zażądał właściwej wiadomości?”
Większość frameworków potrafi zapisywać wychodzącą pocztę w pamięci podczas testów. Laravel ma Mail::fake(), Django zbiera wiadomości w django.core.mail.outbox, a Rails ma ActionMailer::Base.deliveries. Używaj ich, by sprawdzić, że zadanie odpala się raz, z właściwym odbiorcą i tokenem. To najszybsza informacja zwrotna, jaką możesz dostać, a testują jeszcze mniej z zewnętrznego świata niż przechwytywacz.
Tryb testowy dostawcy: „czy moja integracja działa?”
Dostawcy oferują tu różne rodzaje pomocy i różnice mają znaczenie. Amazon SES ma symulator skrzynki z adresami takimi jak success@simulator.amazonses.com, bounce@simulator.amazonses.com i complaint@simulator.amazonses.com, które dają te wyniki bez szkody dla twojej reputacji. Nowe konto SES zaczyna też w piaskownicy, gdzie może wysyłać tylko na zweryfikowane adresy. Tryb piaskownicy SendGrid, ustawiany przez mail_settings.sandbox_mode.enable, sprawdza twoje zapytanie bez dostarczania. Postmark przyjmuje do tego celu token POSTMARK_API_TEST. Sprawdzają się przy błędach API oraz webhookach dla odbić i skarg, ale nie pokazują, że poczta do kogokolwiek dotarła. Sprawdź aktualną dokumentację swojego dostawcy, bo te funkcje się zmieniają.
Domena testowa, którą posiadasz: „czy cały przepływ działa, wielokrotnie?”
Do automatycznych testów end-to-end skonfiguruj domenę lub subdomenę pod swoją kontrolą, ze skrzynką catch-all albo przychodzącym webhookiem, by kod testowy mógł czytać pocztę przez API. Wymaga to trochę pracy, ale jest prywatne i stabilne i nie zależy od cudzej strony. Nie wymyślaj adresów w domenach, których nie posiadasz. Ktoś może być właścicielem testuser@gmail.com i dostanie to, co wyślesz. RFC 2606 rezerwuje example.com oraz nazwy najwyższego poziomu .test i .example, żeby dokumentacja i dane testowe miały dokąd bezpiecznie wskazywać. Te nazwy nie mogą odbierać poczty, więc nadają się do fixture'ów, a do testów dostarczania są bezużyteczne.
Prawdziwa zewnętrzna tymczasowa skrzynka: „czy cudza domena to odbierze?”
Tu tymczasowa skrzynka zasługuje na swoje miejsce. To prawdziwa skrzynka w domenie, której nie kontrolujesz i dla której nie masz listy dozwolonych. Twoja wiadomość musi znaleźć rekord MX, nawiązać połączenie SMTP i zostać przyjęta. W VookMail rekordy MX domen wskazują na dostawcę dostarczania poczty, który odbiera wiadomość i przekazuje ją dalej przez HTTPS. Świeży adres oznacza też brak historii: żadnych starych wiadomości, żadnego wcześniejszego odbicia na twojej liście supresji, żadnych filtrów. Dzięki temu łatwo odtworzyć sytuację „zarejestrowałem się nowym adresem i nic nie dostałem”. Przydaje się także osobom niebędącym programistami. Projektant albo product manager może przeczytać, co dostaje nowy użytkownik, bez żadnego dostępu do twoich narzędzi.
Konta kontrolne u dużych dostawców poczty: „gdzie to ląduje?”
Dostarczona wiadomość w jednej domenie nic nie mówi o folderze ze spamem w innej. Trzymaj mały zestaw prawdziwych kont u dostawców, z których faktycznie korzystają twoi użytkownicy, i sprawdzaj umiejscowienie przed większymi zmianami szablonu lub domeny. Potem obserwuj liczby odbić i skarg po wydaniu. Jeśli twoja poczta wygląda jak problem ze spamem, na tych kontach zobaczysz to najwcześniej.
| Podejście | Przechodzi przez internet | Konfiguracja | Automatyzacja | Prywatność treści | Najlepszy etap |
|---|---|---|---|---|---|
| Pomocnik testowy frameworka | Nie | Żadna | Doskonała | Zostaje w procesie | Testy jednostkowe i funkcjonalne |
| Lokalny przechwytywacz SMTP | Nie | Niska | Dobra | Zostaje lokalnie | Programowanie |
| Tryb testowy dostawcy | Zwykle nie | Niska | Dobra | Zostaje u dostawcy | Testy integracyjne |
| Własna domena testowa | Tak | Średnia do wysokiej | Dobra | Ty ją kontrolujesz | CI end-to-end, staging |
| Tymczasowa skrzynka | Tak | Żadna | Niezalecana | Traktuj jak publiczną | Ręczne QA i kontrole przed wydaniem |
| Konta kontrolne | Tak | Średnia | Ograniczona | Umiarkowana | Sprawdzanie umiejscowienia |
Ręczny przebieg z tymczasową skrzynką
Oto powtarzalny przebieg rejestracji na stagingu lub w środowisku przedprodukcyjnym. Gdy już go znasz, zajmuje około dziesięciu minut.
- Upewnij się, że środowisko używa tej samej konfiguracji dostawcy co produkcja, poza danymi dostępowymi, i zawiera tylko zmyślone dane. Jeśli nie, zapisz to, bo ogranicza to wnioski, jakie możesz wyciągnąć.
- Otwórz VookMail i naciśnij Nowy. Wpisz nazwę użytkownika zakodowującą test, na przykład
email-signup-03-x7, wybierz jedną z ponad 30 domen i naciśnij strzałkę. Użyj żółtego przycisku „Losowy”, jeśli w wiadomości może być cokolwiek wrażliwego, bo każdy, kto zna lub odgadnie adres, może otworzyć tę skrzynkę. - Naciśnij Kopiuj i zarejestruj się jako nowy użytkownik z zmyślonymi danymi profilu.
- Zanotuj czas wysłania formularza i czas pojawienia się wiadomości. Skrzynka sprawdza co kilka sekund, więc przerwa rzędu minut wskazuje na twoją kolejkę lub dostawcę. Naciśnij Odśwież, jeśli chcesz mieć pewność.
- Przeczytaj wiadomość tak, jak zrobiłby to nowy użytkownik: nazwa nadawcy, temat, tekst podglądu, treść, przycisk, zwykły link, stopka. VookMail pokazuje wykryte kody i linki potwierdzające nad wiadomością, co jest zgrubnym sprawdzeniem, czy twój kod i link łatwo wyłowić.
- Obejrzyj ją z wyłączonymi obrazami. VookMail trzyma obrazy wyłączone, dopóki ich nie zezwolisz, i usuwa ukryte piksele śledzące. Jeśli wiadomość nie ma sensu w tym stanie, część twoich użytkowników widzi to samo. Nie używaj jednak tej skrzynki do oceny śledzenia otwarć, bo piksele się nie odpalą.
- Naciśnij przycisk QR, zeskanuj adres testowym telefonem i otwórz tam tę samą skrzynkę, by stuknąć prawdziwy link na prawdziwym urządzeniu, zwłaszcza jeśli używasz universal links albo app links.
- Dokończ weryfikację i potwierdź, że stan konta zmienia się tak, jak trzeba.
- Przejdź przypadki negatywne z listy poniżej: użyj linku ponownie, poczekaj, aż wygaśnie, poproś o ponowne wysłanie.
- Zachowaj dowody: zrzuty ekranu, znaczniki czasu i użyty adres. Wiadomości są usuwane po około dobie, więc zgłoszenie błędu napisane za tydzień nie będzie miało na co wskazać.
- Naciśnij Usuń i usuń konto testowe, jeśli wymaga tego twój proces.
W jednej przeglądarce można trzymać kilka adresów, więc zapraszający i zaproszony albo stary i nowy adres przy zmianie e-maila mogą być otwarte jednocześnie. Jeśli w teście dołączasz pliki, pamiętaj, że VookMail odrzuca popularne pliki programów, takie jak .exe, i pokazuje ostrzeżenie przy archiwach, więc odrzucony tam załącznik nie musi oznaczać błędu po twojej stronie.
Czytanie błędu
„E-mail nie dotarł” opisuje objaw, który może wynikać z jednego z około sześciu miejsc, a zespoły tracą godziny, zaczynając od niewłaściwego. Idź ścieżką od swojego kodu na zewnątrz i zatrzymaj się w pierwszym miejscu, w którym nie widzisz już wiadomości.
- Czy aplikacja próbowała? Przeszukaj log aplikacji pod kątem próby wysyłki i wyjątków. Szukaj zadania, które nigdy nie powstało, często dlatego, że warunek lub flaga funkcji miały wartość fałsz.
- Czy worker ruszył? Sprawdź zawieszone, nieudane lub ponawiane zadania. Worker kolejki, którego nie zrestartowano po wdrożeniu, może uruchamiać stary kod, a polityka ponowień może wysyłać duplikaty.
- Czy dostawca to przyjął? Wyszukaj odbiorcę lub
Message-IDw dzienniku aktywności dostawcy. Przyjęte, odroczone, odbite i odrzucone to cztery różne historie. - Czy została pominięta przez supresję? Jeśli ten adres wcześniej odbił wiadomość lub złożył skargę, wielu dostawców po cichu pomija kolejne wysyłki. To często łapie testerów, którzy używają starego adresu.
- Co powiedział serwer odbierający? Logi dostawcy zwykle pokazują odpowiedź SMTP, a ten tekst to najprzydatniejsza linijka w całym śledztwie.
- Czy DNS jest w porządku? Sprawdź SPF, DKIM i DMARC dla faktycznej domeny wysyłającej.
- Czy jest, ale ukryta? Foldery ze spamem, karty i filtry klienta zostają na koniec, gdy konto kontrolne może ci to pokazać.
Co mówi ci odpowiedź SMTP
Według RFC 5321 odpowiedź zaczynająca się od 4 oznacza błąd tymczasowy i nadawca powinien spróbować później. Odpowiedź zaczynająca się od 5 jest trwała. Rozszerzone kody statusu z RFC 3463 dodają szczegóły po niej. Wymyślona linijka logu może wyglądać tak, wyłącznie jako przykład formatu:
Tylko przykład: to=user@gmail.example status=bounced reply="550 5.7.26 unauthenticated sender"
Czytaj od lewej do prawej. Piątka oznacza, że ponowienia nie pomogą. Rodzina 5.7 dotyczy bezpieczeństwa lub polityki, co kieruje cię do DNS i podpisywania, a odsuwa od adresu odbiorcy. Tabela poniżej daje punkt wyjścia dla typowych wzorców.
| Co widzisz | Najbardziej prawdopodobna warstwa | Gdzie zajrzeć najpierw |
|---|---|---|
| Nic w logu dostawcy | Aplikacja lub kolejka | Logi aplikacji i nieudane zadania |
| Dostawca pisze „dropped” lub „suppressed” | Lista supresji dostawcy | Usuń adres testowy albo użyj nowego |
| API zwraca sukces, ale nic nie jest zapisane jako wysłane | Tryb piaskownicy nadal włączony | Ustawienia dostawcy dla tego środowiska |
5.1.1 lub podobny | Adres odbiorcy | Literówki i walidacja formularza, która zmieniła adres |
5.7.26 w Gmailu | Uwierzytelnianie | SPF, DKIM i zgodność z domeną From |
Odroczenia 4xx, które po jakimś czasie mijają | Odbiorca cię spowalnia | Wolumen, reputacja albo nowe IP wysyłające |
| Dostarczone do zewnętrznej skrzynki, brak w Gmailu | Polityka lub filtrowanie odbiorcy | Konta kontrolne i wytyczne Google dla nadawców |
| Przychodzi, ale link mówi „już użyty” | Skaner wstępnie pobiera link | Wykorzystuj tokeny przy POST, nie GET |
| Link prowadzi do ostrzeżenia o bezpieczeństwie | Domena śledzenia kliknięć | Certyfikat na subdomenie śledzącej |
| Przychodzi dwa razy | Logika ponowień | Idempotentność zadań i limity czasu uruchamiające ponowienia |
| Przychodzi bardzo późno | Kolejka | Moc workerów i to, czy poczta z resetem dzieli kolejkę z pocztą masową |
Ostatni wiersz to kwestia projektowa warta dodatkowego zdania. Jeśli resety haseł dzielą kolejkę z wysyłką newslettera, czekają za nią. Daj poczcie transakcyjnej własną kolejkę, a najlepiej także własną subdomenę i strumień wysyłki, żeby problem marketingowy nie opóźniał logowania.
Polecenia, które skracają szukanie
Większość z tego sprawdzisz bez wychodzenia z terminala. W tych przykładach zamień przykładowe nazwy na własne.
dig +short MX example.compokazuje, gdzie domena odbiera pocztę. Pusta odpowiedź wymaga bliższego spojrzenia, bo RFC 5321 pozwala nadawcom wrócić do rekordu adresowego, natomiast odpowiedź0 .to null MX z RFC 7505, czyli domena w ogóle nie przyjmuje poczty.dig +short TXT example.compokazuje rekord SPF wśród innych rekordów tekstowych.dig +short TXT selector._domainkey.example.compokazuje klucz DKIM. Prawdziwy selektor weź z wartościs=w nagłówkuDKIM-Signaturewiadomości.dig +short TXT _dmarc.example.compokazuje politykę DMARC.openssl s_client -starttls smtp -connect smtp.example.com:587sprawdza, czy możesz dotrzeć do swojego przekaźnika, i pokazuje jego certyfikat. Awaria tutaj oznacza problem z zaporą lub TLS, na długo przed czymkolwiek dotyczącym treści.swaks --to qa@example.test --from app@example.test --server localhost:1025wysyła prostą wiadomość ręcznie. Omija twoją aplikację, więc możesz stwierdzić, czy problem leży w kodzie, czy na trasie.
Najbardziej wiarygodny wgląd w nagłówki daje skrzynka pod twoją kontrolą u dużego dostawcy. W Gmailu otwórz wiadomość, użyj menu z trzema kropkami i wybierz Pokaż oryginał, co na górze wyświetla wyniki SPF, DKIM i DMARC. Pamiętaj, że „pass” u jednego odbiorcy nie gwarantuje tego samego u innego.
Co sprawdzić w każdym przepływie
„Czy dotarło?” to pierwsze pytanie i zwykle najmniej ciekawe. Potem każdy przepływ ma własne sposoby, by się wywrócić.
Reset hasła
Ściąga OWASP Forgot Password Cheat Sheet to punkt odniesienia, na którym warto się oprzeć. Wymaga spójnego komunikatu niezależnie od tego, czy konto istnieje, odpowiedzi trwających jednakowo długo, tokenów losowych, długich, bezpiecznie przechowywanych i jednorazowych oraz Referrer-Policy: no-referrer na stronie resetu.
- Strona z prośbą pokazuje ten sam komunikat dla adresów zarejestrowanych i niezarejestrowanych i trwa mniej więcej tyle samo. Natychmiastowa odpowiedź dla nieznanych adresów zdradza tyle samo co samo sformułowanie.
- Link działa raz. Otwarty po raz drugi daje jasne wyjaśnienie i sposób na poproszenie o kolejny.
- Poproszenie o nowy reset unieważnia starsze linki albo twój projekt celowo mówi inaczej.
- Wygaśnięcie jest wymuszane przez serwer i sprawdzone przez odczekanie albo zmianę czasu w środowisku testowym.
- Udany reset wysyła e-mail z potwierdzeniem, a inne sesje są obsługiwane zgodnie z twoją polityką.
- Otwarcie linku samo niczego nie zmienia. Token jest wykorzystywany przy wysłaniu formularza.
- Strona resetu nie wysyła swojego adresu URL do zewnętrznej analityki ani śledzenia błędów.
- Limity zapytań obowiązują per konto, a nie tylko per IP, żeby nikt nie mógł zasypać cudzej skrzynki.
- Adresy z wielkimi literami albo znakami plus działają tak samo jak proste.
Weryfikacja przy rejestracji
- Jedna rejestracja wysyła jedną wiadomość, także gdy zadanie jest ponawiane.
- Link lub kod działa raz, a strona wygasłego linku podpowiada, co dalej.
- Ponowne wysłanie albo unieważnia poprzedni token, albo współistnieje z nim zgodnie z projektem, i ma limit zapytań.
- Niezweryfikowane konta mają dokładnie te ograniczenia, które zamierzałeś.
- Ponowna rejestracja na zarejestrowany adres nie mówi anonimowemu odwiedzającemu, że konto istnieje, jeśli twój produkt uznaje to za wrażliwe. Częsty wzorzec to wysłanie zamiast tego e-maila do obecnego właściciela.
- Link wskazuje na właściwe środowisko. Wiadomość ze stagingu, która linkuje do produkcji, prędzej czy później zmieni dane produkcyjne.
Kody logowania i magiczne linki
- Kody są wystarczająco długie, szybko wygasają i mają limit prób.
- Magiczne linki pokazują stronę docelową z przyciskiem i wykorzystują token przy tym POST, więc GET ze skanera nie szkodzi.
- Otwarcie linku na innym urządzeniu robi to, co mówi projekt, a użytkownik wie, co się stało.
- Temat zawiera kod tylko wtedy, gdy zdecydowałeś, że to dopuszczalne, bo powiadomienia wyświetlają go na ekranach blokady.
Zmiana adresu e-mail
- Potwierdzenie trafia na nowy adres i nic się nie zmienia, dopóki nie zostanie potwierdzone.
- Powiadomienie trafia na stary adres, żeby prawdziwy właściciel mógł zareagować na nieautoryzowaną zmianę.
- Nierozliczone tokeny resetu przestają działać po zmianie.
- Dwie tymczasowe skrzynki sprawiają, że ten przypadek szybko przejdziesz ręcznie.
Zaproszenia, paragony i powiadomienia
- Zaproszenie dla osoby bez konta prowadzi do rejestracji z adresem wypełnionym lub zablokowanym, zgodnie z projektem. Wygasłe lub cofnięte zaproszenie to mówi.
- Zaproszenia nie może przyjąć inne konto, chyba że twój projekt na to pozwala.
- Paragony pokazują poprawne kwoty, waluty, daty i strefy czasowe dla ustawień regionalnych użytkownika, a załączniki mają sensowne nazwy i poprawnie się otwierają.
- Zmiany preferencji działają przy następnej wysyłce.
- Poczta nieistotna ma działającą rezygnację, a poczta o koncie i bezpieczeństwie jest wyraźnie oddzielona. Nasz artykuł o przeładowaniu newsletterami pokazuje, jak to wygląda od strony czytelnika.
- Przetłumaczone szablony istnieją dla każdego obsługiwanego języka, z poprawnym układem od prawej do lewej tam, gdzie to ma znaczenie, i bez nieprzetłumaczonych fragmentów w temacie.
Przegląd kodu tokenów
Testowanie przez skrzynkę pokazuje zachowanie. Krótki przegląd kodu wyłapie wady projektowe, których żadna skrzynka nie pokaże. Gdy czytasz kod stojący za resetem, weryfikacją i magicznymi linkami, szukaj tego.
- Źródło losowości. Powinien to być kryptograficznie bezpieczny generator, taki jak
secrets.token_urlsafe(32)w Pythonie,crypto.randomBytes(32)w Node czyrandom_bytes(32)w PHP. Znacznik czasu, rosnące ID albo skrót z e-maila są nieakceptowalne. - Długość. Tokeny w linkach zwykle niosą co najmniej 128 bitów losowości. Sześciocyfrowy kod jest w porządku tylko przy krótkim wygasaniu i limicie prób.
- Przechowywanie. Trzymaj skrót tokena, żeby wyciek bazy nie dawał działających linków resetu.
- Porównywanie. Użyj funkcji o stałym czasie, takiej jak
hmac.compare_digest,hash_equalslubcrypto.timingSafeEqual, tam gdzie porównujesz sekrety bezpośrednio. - Przeznaczenie. Token weryfikacyjny nie może działać jako token resetu, a token jednego konta nie może działać dla innego.
- Wygasanie. Czas wygaśnięcia trzyma serwer, więc nie da się go zmienić edycją linku.
- Unieważnianie. Użycie tokena, zmiana hasła inną drogą albo zmiana e-maila powinny anulować wszystkie nierozliczone tokeny.
- Logowanie. Pełne adresy URL z tokenami nie powinny trafiać do logów aplikacji, zdarzeń analitycznych ani narzędzi do śledzenia błędów. Sprawdź też logi dostępu HTTP.
Nagłówki i uwierzytelnianie
Otwórz surowe źródło w przechwytywaczu, by zobaczyć, co wygenerowała twoja aplikacja, i w skrzynce pod twoją kontrolą u dużego dostawcy, by zobaczyć, co dodali dostawca i sieć.
| Nagłówek lub element | Co zweryfikować |
|---|---|
From | Poprawna nazwa marki, w domenie, którą posiadasz i uwierzytelniasz |
Reply-To | Monitorowana skrzynka albo celowe pominięcie |
Return-Path | Domena odbić, zgodna z twoją domeną, jeśli polegasz na SPF dla DMARC |
DKIM-Signature | Obecny, z domeną d= zgodną z domeną From |
Message-ID | Obecny i unikalny, bo to twój klucz do śledzenia w logach dostawcy |
Content-Type | multipart/alternative z częścią HTML i częścią tekstową |
List-Unsubscribe, List-Unsubscribe-Post | Obecne w poczcie masowej i marketingowej, z obsługą rezygnacji jednym kliknięciem według RFC 8058 |
Auto-Submitted | auto-generated w poczcie automatycznej, zgodnie z RFC 3834, by pomóc zapobiegać pętlom odpowiedzi |
Kilka zasad do sprawdzenia przed wypuszczeniem nowej domeny wysyłającej. Ocena SPF nie może przekroczyć dziesięciu zapytań DNS (RFC 7208), a przekroczenie limitu to łatwy sposób, by polec po dodaniu do rekordu jeszcze jednego dostawcy. DKIM wymaga opublikowanego i działającego rekordu selektora dostawcy. DMARC wymaga rekordu w domenie From, zwykle zaczynając od p=none z włączonymi raportami i zaostrzając, gdy zgodność zostanie potwierdzona.
Wolumen też zmienia reguły. Wytyczne Google traktują nadawcę jako masowego przy około 5000 wiadomości dziennie do osobistych kont Gmail, a nadawcy masowi potrzebują SPF, DKIM i DMARC, rezygnacji jednym kliknięciem w poczcie promocyjnej oraz poziomu zgłoszeń spamu przez użytkowników poniżej 0,3%, przy zalecanym celu 0,1%. Inni dostawcy mają własne zasady. Amazon SES na przykład obejmuje konto przeglądem przy poziomie odbić 5% lub skarg 0,1%. Aktualne liczby czytaj z dokumentacji dostawcy, zanim zaczniesz coś według nich planować, bo się zmieniają.
Obsługa adresów i walidacja
Formularze odrzucają poprawne adresy częściej, niż ludzie sądzą, a błąd walidacji na wcześniejszym etapie może wyglądać dokładnie jak awaria dostarczania. Przetestuj swoje na tych przykładach.
| Wejście | Oczekiwana obsługa | Częsty błąd |
|---|---|---|
user+tag@example.com | Akceptuj | Wyrażenie regularne odrzuca znak plus |
User@Example.COM | Akceptuj i traktuj domenę bez rozróżniania wielkości liter | Zduplikowane konta różniące się tylko wielkością liter |
o'brien@example.com | Akceptuj | Odrzucony albo psuje zapytanie lub szablon, jeśli nie jest poprawnie zabezpieczony |
first.last@sub.example.co.uk | Akceptuj | Walidacja zakłada jedną kropkę w domenie |
| Spacje na początku lub końcu | Najpierw przytnij | „Nieprawidłowy e-mail” przy poprawnie wklejonym adresie |
| Bardzo długi adres | Wymuszaj 64 znaki dla części lokalnej i 254 łącznie | Krótka kolumna w bazie po cichu go ucina |
| Domeny i adresy międzynarodowe | Akceptuj lub odrzucaj konsekwentnie, z jasnym komunikatem | Awaria w kodowaniu lub logowaniu |
| Domena bez trasy poczty | Ostrzeż albo odrzuć | Konto, którego nigdy nie da się zweryfikować |
Waliduj luźno w formularzu, a potem pozwól, by e-mail potwierdzający udowodnił, że adres działa. Ścisłe wyrażenie regularne traci prawdziwych użytkowników i niewiele mówi o tym, czy skrzynka istnieje.
Jeśli twój produkt na produkcji odrzuca domeny jednorazowe, twój proces QA nadal potrzebuje na stagingu drogi na skróty. Opcje to lista dozwolonych domen testowych poza produkcją, flaga wyłączająca kontrolę w środowiskach testowych albo własna domena testowa. Nie osłabiaj reguły produkcyjnej, by ułatwić testy. A jeśli dopiero decydujesz, czy w ogóle taką regułę mieć, nasz tekst o tym, dlaczego strony blokują jednorazowe e-maile, przedstawia koszty i korzyści z perspektywy właściciela.
Jak to się renderuje
Renderowanie to miejsce, w którym przegląd projektanta pomaga najbardziej, i wymaga prawdziwych wiadomości w prawdziwych klientach.
- Część tekstowa dobrze się czyta i zawiera pełny link. „Kliknij przycisk poniżej” jest tam bezużyteczne.
- Tryb ciemny zostawia logo widoczne i zachowuje kontrast. VookMail ma tryb ciemny, co jest początkiem, a prawdziwym testem są klienty, które lubią twoi użytkownicy.
- Przy zablokowanych obrazach wezwanie do działania nadal jest prawdziwym linkiem tekstowym albo przyciskiem HTML.
- Przyciski są dość duże, by w nie stuknąć, a długie adresy URL nie psują układu na telefonie.
- Tekst podglądu jest napisany celowo, bez pozostałości z szablonu.
- Nagłówki są semantyczne, kontrast wystarczający, tekst linków opisowy, a HTML ma atrybut języka.
- Brakujące dane nie dają „Cześć {first_name}” ani „Cześć ,”.
- Rozmiar wiadomości pozostaje wyraźnie poniżej około 102 KB, czyli punktu, w którym Gmail według powszechnych doniesień przycina długie wiadomości. Przycięcie może ukryć twoją stopkę i każdy link rezygnacji w treści.
Zabezpieczenia przed wpadkami
Żenujące incydenty z e-mailami to głównie błędy konfiguracji: poczta ze stagingu docierająca do prawdziwych klientów, produkcja na kluczu testowym, linki do localhost. Kilka ustawień zapobiega większości z nich.
Trzymaj osobne dane dostępowe dla każdego środowiska, w zmiennych środowiskowych lub menedżerze sekretów. Poza produkcją używaj listy dozwolonych odbiorców, żeby mailer dostarczał tylko do zatwierdzonych domen testowych, a wszystko inne przekierowywał lub porzucał. Buduj każdy link z jednego ustawienia, takiego jak APP_URL, żeby szablony nie zawierały zaszytych hostów. Dodawaj do tematów spoza produkcji prefiks w rodzaju [STAGING], żeby błędnie skierowana wiadomość była oczywista dla każdego, kto ją dostanie.
Jeśli kopiujesz dane produkcyjne na staging, zamień każdy prawdziwy adres na sztuczny, zanim ruszy jakikolwiek worker poczty. Kolejność ma znaczenie, bo worker, który wystartuje pierwszy, może od razu zacząć przerabiać zaplanowaną pocztę. I pilnuj trybu piaskownicy osobno dla każdego środowiska. Start z produkcją wciąż w piaskownicy to klasyk: API zwraca sukces, logi wyglądają czysto, a żadna poczta nie wychodzi.
Zestawy automatyczne powinny zostać na infrastrukturze, którą kontrolujesz
Publiczna tymczasowa skrzynka to zła zależność dla CI. Skrobanie cudzej strony jest kruche, a twoje buildy padałyby z powodów niezwiązanych z twoim kodem. Umieszcza to też twój ruch testowy w usłudze, której nie prowadzisz. Wiadomości tam może przeczytać każdy, kto zna adres, więc nic automatycznego nie powinno od nich zależeć.
Rozsądny układ wygląda tak. Pomocniki frameworka sprawdzają, że zażądano właściwej poczty. Kontener Mailpit w twoim stosie testowym odbiera prawdziwą wiadomość, a test czyta ją przez HTTP API Mailpita (GET /api/v1/messages), wyciąga link i wchodzi w niego. Tryb testowy dostawcy ćwiczy webhooki i obsługę błędów. Nocne zadanie na twojej domenie testowej wysyła przez prawdziwego dostawcę i czyta wynik przez przychodzący webhook, dzięki czemu codziennie dostajesz sygnał, że prawdziwe dostarczanie nadal działa.
Poczta tymczasowa należy do ludzkich części testowania: sesji eksploracyjnych, w których szybko potrzebujesz nowej tożsamości, testu dymnego przed wydaniem, odtwarzania zgłoszenia użytkownika, przeglądów treści i projektu oraz testów na telefonie. W tym ostatnim przypadku przycisk QR albo aplikacja z Google Play lub Huawei AppGallery przenosi skrzynkę na urządzenie testowe. Sprawdź, czy linki otwierają twoją aplikację, gdy jest zainstalowana, i wracają do działającej strony internetowej, gdy nie jest, oraz czy aplikacja zauważa status zweryfikowany bez wymagania ponownego logowania.
Przypadek testowy, który przetrwa przekazanie
Spójne przypadki testowe łatwiej powtarzać przy każdym wydaniu i przekazywać między testerami. Ten przykład ma pola, które zwykle mają znaczenie.
| Pole | Przykład |
|---|---|
| ID testu | EMAIL-RESET-03 |
| Przepływ | Reset hasła, ponowne użycie tokena |
| Warunki wstępne | Zweryfikowane konto testowe na stagingu, ze świeżym adresem tymczasowym |
| Kroki | Poproś o reset, otwórz link, ustaw nowe hasło, otwórz ten sam link ponownie |
| Oczekiwany wynik | Drugie użycie wyjaśnia, że link nie jest już ważny, i oferuje nową prośbę |
| Dowody | Zrzuty ekranu, Message-ID jeśli dostępny, znaczniki czasu, użyty adres |
| Środowisko | Numer builda stagingu i konfiguracja poczty |
Wpisanie ID testu w nazwie użytkownika, jak w email-reset-03-x7, wiąże każdą skrzynkę z jej przypadkiem i chroni dwóch testerów przed kolizją na jednym adresie. Krótki losowy sufiks jest po to, że każdy może otworzyć skrzynkę, jeśli odgadnie nazwę.
Czego nie wysyłać do publicznej skrzynki
Traktuj każdą tymczasową skrzynkę jako czytelną dla każdego, kto zna adres, i testuj zgodnie z tym.
- Wysyłaj tylko dane syntetyczne: fałszywe imiona, fałszywe zamówienia, fałszywe adresy. Prawdziwe dane klientów tam nie należą, a zależnie od tego, gdzie działasz, ich wysłanie może też stworzyć dla ciebie problem prawny.
- Nigdy nie wysyłaj kluczy API, danych dostępowych do bazy ani zaproszeń administratora do prawdziwych systemów.
- Regularnie usuwaj konta testowe, zwłaszcza uprzywilejowane. Testowy administrator powiązany z publiczną skrzynką to furtka, jeśli ktoś inny otworzy tę skrzynkę i poprosi o reset. Ponieważ adres nie jest dla ciebie zarezerwowany po wyczyszczeniu, to ryzyko trwa po zakończeniu testu.
- Nigdy nie używaj adresu tymczasowego jako właściciela prawdziwego konta produkcyjnego ani usługi zewnętrznej, na której polega twoja firma.
- Znaj okres przechowywania. Wiadomości i załączniki znikają po około dobie, a szczegóły ma polityka prywatności.
Testowanie własnego produktu to jedno z najwyraźniej uprawnionych zastosowań poczty jednorazowej. Niech tak zostanie: testuj systemy, które posiadasz albo do testowania których masz upoważnienie. Nie używaj tymczasowych skrzynek do zakładania kont w usługach innych firm wbrew ich regulaminom, do zbierania wersji próbnych ani do testów obciążeniowych cudzego formularza rejestracji. Regulamin opisuje dopuszczalne użycie, a strona o metodologii wyjaśnia, jak działa serwis. VookMail jest częścią sieci darmowych narzędzi PAYATE.
Przed wydaniem
- SPF, DKIM i DMARC zweryfikowane dla faktycznej produkcyjnej domeny wysyłającej, z domeną
Fromdopasowaną. - Produkcyjny mailer na produkcyjnych danych dostępowych, z wyłączonym trybem piaskownicy, potwierdzony prawdziwą wiadomością.
- Weryfikacja rejestracji odebrana na świeżym zewnętrznym adresie, link użyty raz, wygasanie przetestowane.
- Reset hasła przetestowany od początku do końca, w tym identyczne odpowiedzi dla nieznanych adresów i wiadomość z potwierdzeniem.
- Tokeny resetu i magicznych linków wykorzystywane przy wysłaniu formularza, żeby GET ze skanera ich nie zużywał.
- Zmiana e-maila wysyła wiadomość zarówno na nowy, jak i na stary adres.
- Wszystkie linki wskazują na host produkcyjny przez HTTPS, także te przepisane przez śledzenie kliknięć.
- Poczta transakcyjna oddzielona od masowej, przynajmniej w kolejce.
- HTML i tekst obecne i czytelne, z sprawdzonym trybem ciemnym i zablokowanymi obrazami.
- Sprawdzenie umiejscowienia na kontach kontrolnych, jeśli domena lub szablon znacząco się zmieniły.
- Rezygnacja działa w poczcie nieistotnej, a przetłumaczone szablony zostały sprawdzone.
- Dowody dołączone do zgłoszenia wydania, a liczby odbić i skarg na pulpicie, który ktoś będzie oglądał po starcie.
Pytania programistów na ten temat
Prawdziwa skrzynka przyjęła moją pocztę. Czy jestem bezpieczny w Gmailu?
Nie. Dostarczenie do jednej domeny pokazuje, że twoja wiadomość wyszła, znalazła trasę i została tam przyjęta. Gmail stosuje własne reguły uwierzytelniania i filtrowania, tak samo jak każdy inny duży dostawca. Do tego pytania użyj kont kontrolnych i Google Postmaster Tools.
Czy mogę używać tego samego adresu testowego ponownie?
W obrębie sesji możesz, ale świeży adres daje czystszy test. Stare adresy zbierają wpisy supresji i stare wiadomości, a w usłudze tymczasowej skrzynka i tak jest czyszczona po około dobie.
Poczta dociera do mojego przechwytywacza, ale nie na zewnątrz. Od czego zacząć?
Przechwytywacz pokazuje, że twoja aplikacja wygenerowała wiadomość, i nic poza tym, więc zacznij od dziennika aktywności dostawcy. Najczęściej odpowiedzią jest ustawienie piaskownicy, wpis supresji, złe dane dostępowe albo odrzucenie SMTP wskazujące na uwierzytelnianie.
Jak długo powinien być ważny link do resetu?
Na tyle krótko, by ograniczyć szkody, i na tyle długo, by dotarła wolna poczta. Wiele zespołów ustala wartość gdzieś między 15 minutami a godziną, ale zależy to od twojego ryzyka i od tego, jak szybko dostarczana jest poczta, a poczta twoich użytkowników może się opóźniać poza twoją kontrolą. Cokolwiek wybierzesz, przetestuj stan wygaśnięcia i powiedz ludziom, co robić dalej.
