Przejdź do głównej zawartości

Lista zmian

Tutaj znajdziesz zmiany, które dotyczą publicznego API albo SDK. Pakiety SDK stosują wersjonowanie semantyczne; ich szczegółowe listy zmian są publikowane z każdym wydaniem w npm.

Od 1 października 2026 SendGrid nie jest już dostępny jako dostawca e-maili. Jeśli wysyłałeś przez usługę SendGrid, przejdź na innego dostawcę API, np. Resend, Postmark, Mailgun, Brevo albo Mailjet, a potem wybierz nową usługę w swoich szablonach (także jako usługę zapasową, jeśli jej tam używałeś).

Jeden szablon możesz teraz wysyłać w wielu językach – zobacz Tłumaczenia szablonów.

  • Panel: pasek Języki w edytorze szablonów. Do każdego szablonu dodasz do 29 wersji językowych (dowolny język BCP 47, np. hu albo pt-BR) – jako kopię języka domyślnego, pustą albo przez tłumaczenie maszynowe. Wersje językowe tłumaczą temat, HTML, tekst i nazwę nadawcy; odbiorcy, parametry i ustawienia pozostają wspólne. Każda wersja ma własną historię wersji z przywracaniem oraz plakietki Nieaktualny / Maszynowe. Językiem domyślnym szablonu może być dowolny język (Ustawienia → Ogólne → Język domyślny). Eksport i import obejmują wersje językowe.
  • Tłumaczenie maszynowe z własnym kluczem: OpenAI, Anthropic, Google Gemini albo DeepL z własnym kluczem API organizacji (Ustawienia → Tłumaczenie maszynowe, właściciele i administratorzy). Frontmail sprawdza, czy parametry, linki i struktura HTML pozostały nienaruszone (translation_invalid). 30 tłumaczeń na godzinę na organizację, do 60 000 znaków. Nowe kody błędów translation_not_configured, translation_invalid, translation_provider_auth, translation_provider_error.
  • API: opcjonalne locale w POST /v1/send i w pozycjach /v1/send-batch, pole formularza fm_locale w POST /v1/send-form (pole o nazwie locale pozostaje parametrem szablonu). Wybór: dokładny język → ten sam język bazowy (de-AT → de) → język domyślny; błędnie zapisany znacznik zwraca 400 invalid_body. Odpowiedzi na wysyłkę i wyniki wysyłek zbiorczych zwracają użyte locale, GET /v1/templates zwraca locales. Automatyczne odpowiedzi podążają za językiem pierwotnej wiadomości, a Wyślij ponownie go zachowuje. Ścieżki zgodne z EmailJS zawsze używają języka domyślnego.
  • Formatowanie: daty, liczby, kwoty i stopka planu Free zależą teraz od języka, w którym e-mail jest wysyłany (wcześniej od języka organizacji).
  • SDK JavaScript (następne wydanie, 0.2.0 – razem z poniższym wzmocnieniem bezpieczeństwa SDK): opcja locale w send / sendForm (sendForm wysyła ją jako fm_locale), prop locale w <FrontmailForm> (React, Vue, Svelte) i use:frontmailForm, result.locale; @frontmail/node: locale w send / pozycjach sendBatch, templates.list() zwraca locales, a frontmail types wypisuje języki każdego szablonu i typ <NazwaSzablonu>Locale. @frontmail/emailjs-compat się nie zmienia (tylko język domyślny).
  • Android / Kotlin SDK 0.2.0: SendOptions(locale = "de"), SendResult.locale.
  • iOS / Swift SDK 0.2.0: SendOptions(locale: "de"), SendResult.locale.

Wzmocnienie bezpieczeństwa: brzeg publicznego API i klucze (wrzesień 2026)

Dział zatytułowany „Wzmocnienie bezpieczeństwa: brzeg publicznego API i klucze (wrzesień 2026)”

Zmiany w działaniu – sprawdź swoją integrację:

  • Żądania bez Origin i Referer (serwery, curl, natywne aplikacje) z kluczem publicznym wymagają teraz Zezwól na aplikacje mobilne – także gdy lista dozwolonych domen jest pusta. Wcześniej pusta lista je przyjmowała. Organizacjom, które wysyłały takie żądania w ostatnich 30 dniach, przełącznik włączyliśmy automatycznie. W przeciwnym razie: 403 origin_not_allowed (details.reason: "no_origin"). Na serwerach używaj klucza prywatnego.
  • Klucze prywatne z przeglądarek są odrzucane: żądanie z kluczem prywatnym (Authorization: Bearer albo pole accessToken w stylu EmailJS), które ma nagłówek Origin, dostaje nowy błąd 403 private_key_in_browser. Dla narzędzi wewnętrznych można to włączyć: Bezpieczeństwo → Zezwól na klucze prywatne w przeglądarkach.
  • CAPTCHA dla żądań bez Origin jest weryfikowana wspólnym mobilnym widżetem Frontmaila tylko wtedy, gdy włączone jest Zezwól na aplikacje mobilne. Klucze testowe Cloudflare są na produkcji odrzucane.
  • Odpytywanie o status: token statusu wysyłaj w nagłówku X-Frontmail-Status-Token; ?token= nadal działa dla starszych SDK.
  • Rate limity: klienci IPv6 dzielą limit na IP w obrębie sieci /64. Limity na klucz i na organizację oraz wykrywanie anomalii liczą teraz tylko żądania, które przeszły kontrolę szablonu i CAPTCHA, więc zalew nieprawidłowych żądań nie blokuje już twoich prawdziwych odwiedzających.
  • Załączniki: nazwy plików są czyszczone (niewidoczne znaki i znaki bidi, kropki na końcu), a więcej niebezpiecznych typów jest odrzucanych (HTML, SVG, obrazy dysków, OneNote, pliki Office z makrami, .url, .lnk, …). Przesyłanie plików z kluczem publicznym (POST /v1/uploads) wymaga szablonu, który przyjmuje załączniki, i ma dzienny limit bajtów na organizację.
  • Multipart template_id / service_id dłuższe niż 64 znaki → 400 invalid_body (wcześniej 500).
  • API, API panelu i logowanie przyjmują tylko ruch, który przechodzi przez CDN Frontmaila.
  • POST /v1/send, /v1/send-form, /v1/send-batch, /v1/uploads, GET /v1/messages/:id, GET /v1/history, GET /v1/templates oraz aliasy zgodne z EmailJS.
  • Jednolity format błędów z docs_url; obsługa Idempotency-Key (24 h).
  • Kolejka wstrzymanych wiadomości ze statusami held / held_service_error i trybami hold / reject.
  • Blokada treści dla wysyłek z kluczem publicznym do szablonów z dynamicznym odbiorcą: wymagana CAPTCHA (dynamic_recipient_requires_captcha), stałe pola nadawcy (dynamic_field_not_allowed), bez parametrów HTML i z tekstami ≤ 500 znaków, linki tylko do dozwolonych domen (link_not_allowed) i najwyżej 5 e-maili na odbiorcę dziennie. Adres From z parametrów jest odrzucany przy każdej wysyłce z kluczem publicznym. Automatyczne odpowiedzi też są zablokowane. Nowe ustawienia: security.allowedLinkDomains, security.recipientDailyLimit, w szablonie enforceLinkAllowlist. Zobacz Dozwolone linki i blokada treści.
  • @frontmail/browser 0.x (ESM + UMD, przypnij wersję z SRI), @frontmail/react, @frontmail/react-native, @frontmail/vue, @frontmail/svelte, @frontmail/node z CLI frontmail types, @frontmail/emailjs-compat.
  • Automatyczne ponawianie z wykładniczym odstępem i kluczami idempotencji; typowane błędy.
  • Weryfikacja dwuetapowa jest teraz wymagana przy każdej metodzie logowania – także przy linkach logowania wysyłanych e-mailem i przy Google / GitHub – i można ją włączyć tylko ze zweryfikowanym adresem e-mail.
  • Linki logowania i weryfikacji otwarte w innej przeglądarce proszą o potwierdzenie (albo tej przeglądarki nie logują), więc link wysłany przez kogoś innego nie zaloguje cię na jego konto.
  • Zmiana e-maila logowania wymaga hasła i zgody z obecnego adresu.
  • Administratorzy nie mogą już nadawać roli Płatności; administratorami i członkami z rolą Płatności zarządza tylko właściciel.
  • Adresy URL webhooków dostawców są ukryte przed obserwatorami i członkami z rolą Płatności i można je wygenerować na nowo (Wygeneruj nowy URL webhooka).
  • Własne serwery SMTP muszą mieć publiczny adres i port 25, 465, 587 albo 2525.
  • Załączniki szablonów mogą używać tylko plików przesłanych przez tę samą organizację.
  • Zaproszenia do zespołu są limitowane na odbiorcę i organizację; nazwy organizacji nie mogą zawierać linków.
  • Dane o kliknięciach eksportowane do analityki nie zawierają już query stringów (tokenów, e-maili).

Wzmocnienie bezpieczeństwa SDK (następne wydanie SDK, 0.2.0)

Dział zatytułowany „Wzmocnienie bezpieczeństwa SDK (następne wydanie SDK, 0.2.0)”
  • Zmiana niekompatybilna: SDK dla przeglądarki (@frontmail/browser, React, Vue, Svelte, @frontmail/emailjs-compat) rzucają private_key_in_browser, gdy w przeglądarce użyto klucza prywatnego (privateKey, w compat accessToken); @frontmail/node odmawia tam działania. Wyłączenie: dangerouslyAllowPrivateKeyInBrowser: true.
  • sendForm pomija pola haseł, pola anty-CSRF i zarezerwowane nazwy; nowe formFields: { include, exclude }.
  • getStatus wysyła token statusu w nagłówku X-Frontmail-Status-Token zamiast ?token=.
  • <TurnstileWebView> w React Native jest ograniczony do strony widżetu (domeny, nawigacja, wiadomości).
  • CDN: sri.json z hashami integrity obok każdego wersjonowanego pakietu; dokumentacja używa adresów URL z przypiętą wersją i Subresource Integrity.
  • Edytor szablonów HTML z podglądem na żywo, typowanymi parametrami, kontrolami, wersjami i galerią (EN/CS).
  • Usługi dla SMTP, Mailgun, Amazon SES, Postmark, SendGrid, Mailjet, Brevo, Resend, Gmail i Outlook / Microsoft 365, z przełączaniem awaryjnym i sprawdzaniem stanu.
  • Kredyty: plany, pakiety kredytów, debet, automatyczne doładowanie; statystyki zużycia.
  • Plany roczne dostają teraz miesięczny limit i zapas debetu w każdym miesiącu okresu (wcześniej tylko w pierwszym).
  • Debet wykorzystany w planach rocznych jest rozliczany co miesiąc osobną fakturą; debet wykorzystany przed końcem subskrypcji (anulowanie, usunięcie organizacji) jest rozliczany od razu.
  • Przejście z planu miesięcznego na roczny przenosi kredyty zużyte w bieżącym miesiącu.
  • Zmiany planu są odrzucane, dopóki subskrypcja ma nieopłaconą fakturę (409 conflict, details.reason: "subscription_not_active").
  • Sporne (obciążone zwrotnie) płatności usuwają kupione za nie kredyty; jeśli spór zostanie wygrany, kredyty wracają. Zwroty są przetwarzane pojedynczo.
  • Nowość: kolejka wstrzymanych wiadomości ma limit na organizację; po jego przekroczeniu żądania dostają 402 insufficient_credits z details.reason: "hold_queue_full".
  • Nowość: e-maile wysłane z kluczem publicznym nie korzystają z debetu ani nie uruchamiają automatycznego doładowania, chyba że włączysz to w Płatności → Kup kredyty → Wydatki z ruchu na kluczu publicznym (domyślnie wyłączone, także w istniejących organizacjach).
  • Własne serwery SMTP: błędy po tym, jak serwer przyjął wiadomość, nie są już zwracane; ochrona przed nadmiernymi zwrotami w organizacji wstrzymuje zwroty, gdy błędy są nienormalnie częste.
  • Webhooki dostawców wykluczają tylko faktycznych odbiorców wiadomości; webhooki Amazon SES przypinają temat SNS pierwszej podpisanej wiadomości. Wyślij ponownie odrzuca szablony zamrożone po przejściu na niższy plan.