Amazon SES
Amazon Simple Email Service (SES) to najtańszy sposób na wysyłanie dużych wolumenów poczty transakcyjnej i naturalny wybór, jeśli już korzystasz z AWS. Wymaga nieco więcej konfiguracji niż inni dostawcy – IAM, region, wyjście z sandboxa – ale potem działa bardzo niezawodnie.
Wybierz SES, gdy wysyłasz tysiące e-maili miesięcznie lub więcej, liczy się dla ciebie cena za wiadomość albo chcesz mieć wszystko we własnym koncie AWS. Jeśli zależy ci na jak najszybszej konfiguracji, łatwiej zacząć od Postmark, Resend lub Mailgun. Zobacz przegląd usług.
Wymagania
Dział zatytułowany „Wymagania”- Konto AWS z włączonym SES w regionie, z którego chcesz wysyłać.
- Zweryfikowana tożsamość w tym regionie: najlepiej cała domena (SES → Identities → Create identity → Domain), a przynajmniej pojedynczy adres nadawcy.
- Dostęp produkcyjny (wyjście z sandboxa), zanim zaczniesz wysyłać do dowolnych odbiorców – zobacz Sandbox i limity.
- Osobny użytkownik IAM z kluczem dostępu i tylko tymi uprawnieniami:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ses:SendEmail", "ses:SendRawEmail", "ses:GetAccount"], "Resource": "*" } ]}ses:SendEmail / ses:SendRawEmail są potrzebne do wysyłki (Frontmail używa API SES v2 z surową wiadomością MIME), ses:GetAccount do Testuj połączenie i codziennego health checku, który odczytuje też twój limit i status sandboxa. Resource możesz zawęzić do ARN swojej tożsamości i configuration setu. Nie używaj danych konta root ani użytkownika z uprawnieniami administratora.
Podłączenie we Frontmail
Dział zatytułowany „Podłączenie we Frontmail”- Otwórz Usługi e-mail → Dodaj usługę → Amazon SES.
- Wypełnij pola:
| Pole | Gdzie je znaleźć | Przykład |
|---|---|---|
| Region AWS | Region, w którym zweryfikowano tożsamość (w prawym górnym rogu konsoli SES) | eu-central-1 |
| Access key ID | IAM → Users → frontmail-ses → Security credentials → Create access key | AKIAIOSFODNN7EXAMPLE |
| Secret access key | Wyświetlany jednorazowo przy tworzeniu klucza dostępu | wJalrXUtnFEMI/K7MDENG/… |
| Configuration set | SES → Configuration sets (potrzebny do zdarzeń doręczeń) | frontmail |
| ARN tematu SNS | Opcjonalnie; SNS → Topics – zdarzenia z innych tematów są wtedy ignorowane | arn:aws:sns:eu-central-1:123456789012:frontmail-events |
| Domyślny adres nadawcy | Opcjonalnie; zweryfikowana tożsamość w wybranym regionie (adres w zweryfikowanej domenie albo zweryfikowany adres). Używany, gdy szablon nie ma nadawcy | hello@example.com |
| Domyślna nazwa nadawcy | Opcjonalnie; wyświetlana nazwa domyślnego nadawcy | Acme |
| Maks. liczba e-maili na sekundę | Opcjonalnie; nie przekraczaj maksymalnego tempa wysyłki w SES | 14 |
- Kliknij Zweryfikuj i zapisz. Frontmail wywoła
GetAccounti pokaże, czy konto jest nadal w sandboxie, jakie ma maksymalne tempo wysyłki i limit na 24 godziny. - Usługa zostanie zapisana, gdy sprawdzenie się powiedzie. SES nie ma „adresu konta”, więc ustaw tutaj Domyślny adres nadawcy albo adres nadawcy w każdym szablonie – w przeciwnym razie wysyłka kończy się błędem
sender_not_configured(zobacz Domyślny nadawca). Możesz go później zmienić na stronie usługi bez ponownej weryfikacji. - Klucz dostępu jest szyfrowany kopertowo przez AWS KMS; odszyfrowywany jest tylko w procesie wysyłki.
DNS: SPF, DKIM i DMARC
Dział zatytułowany „DNS: SPF, DKIM i DMARC”Easy DKIM – gdy tworzysz tożsamość domeny, SES podaje trzy rekordy CNAME:
abcdef1234._domainkey.example.com. CNAME abcdef1234.dkim.amazonses.com.ghijkl5678._domainkey.example.com. CNAME ghijkl5678.dkim.amazonses.com.mnopqr9012._domainkey.example.com. CNAME mnopqr9012.dkim.amazonses.com.AWS automatycznie rotuje klucze, na które wskazują. Gdy rekordy zaczną się rozwiązywać, tożsamość pokaże stan Verified.
SPF przez własną domenę MAIL FROM – domyślnie nadawca koperty to adres w amazonses.com, więc SPF przechodzi, ale nie jest wyrównany z twoją domeną. Żeby uzyskać wyrównanie DMARC także dla SPF, ustaw w tożsamości własną domenę MAIL FROM (np. bounce.example.com) i opublikuj:
bounce.example.com. MX 10 feedback-smtp.eu-central-1.amazonses.com.bounce.example.com. TXT "v=spf1 include:amazonses.com ~all"(Zamień eu-central-1 na swój region.)
DMARC – zacznij od trybu monitorowania, potem zaostrz:
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"Regiony
Dział zatytułowany „Regiony”SES jest regionalny: tożsamości, status sandboxa, limity, configuration sety i listy wykluczeń są osobne dla każdego regionu. Region wybrany we Frontmail musi być tym, w którym:
- twoja domena lub adres są zweryfikowane,
- wnioskowano o dostęp produkcyjny,
- znajdują się twój configuration set i temat SNS.
Sam klucz dostępu IAM jest globalny, ale użyty w regionie, w którym nic nie skonfigurowano, kończy się błędem „Email address is not verified”. Jeśli dane mają pozostać w UE, wybierz region unijny, np. eu-central-1 (Frankfurt), eu-west-1 (Irlandia) lub eu-north-1 (Sztokholm).
Sandbox i limity
Dział zatytułowany „Sandbox i limity”Każde nowe konto SES zaczyna w sandboxie w każdym regionie:
- możesz wysyłać tylko na zweryfikowane adresy lub domeny,
- najwyżej 200 wiadomości na 24 godziny,
- najwyżej 1 wiadomość na sekundę.
O dostęp produkcyjny wnioskujesz w SES → Account dashboard → Request production access. Opisz przypadek użycia (poczta transakcyjna z formularza na stronie przez Frontmail), jak odbiorcy wyrazili zgodę i jak obsługujesz odbicia i skargi. Zatwierdzenie trwa zwykle około doby.
Po zatwierdzeniu limit startuje od umiarkowanego poziomu (np. 50 000 dziennie, 14/s) i rośnie wraz z dobrą historią wysyłek. Aktualne wartości pokazuje Testuj połączenie; ustaw Maks. liczba e-maili na sekundę na wartość nie wyższą niż maksymalne tempo wysyłki.
Webhooki (śledzenie doręczeń)
Dział zatytułowany „Webhooki (śledzenie doręczeń)”SES publikuje zdarzenia przez Amazon SNS. Frontmail subskrybuje twój temat SNS przez HTTPS.
-
SNS → Topics → Create topic (Standard), np.
frontmail-events, w tym samym regionie. -
Create subscription → protokół HTTPS → endpoint = URL webhooka ze strony usługi we Frontmail (przycisk kopiowania):
https://api.frontmail.dev/webhooks/providers/ses/<token>Pozostaw raw message delivery wyłączone. Frontmail weryfikuje podpis SNS i automatycznie potwierdza subskrypcję – w ciągu kilku sekund stan subskrypcji zmienia się z Pending confirmation na Confirmed.
-
SES → Configuration sets → Create set (np.
frontmail) → Event destinations → Add destination → wybierz typy zdarzeń → miejsce docelowe Amazon SNS → twój temat. -
Wpisz nazwę configuration setu (i opcjonalnie ARN tematu) w usłudze we Frontmail i zapisz.
| Typ zdarzenia SES | Zdarzenie Frontmail |
|---|---|
| Deliveries | delivered |
Hard bounces (Permanent) |
bounced – dodany do listy wykluczeń |
Soft bounces (Transient), delivery delays |
zapisywane przy wiadomości |
| Complaints | complained – dodany do listy wykluczeń |
| Opens | opened |
| Clicks | clicked |
| Rejects, rendering failures | zapisywane przy wiadomości |
Weryfikacja podpisu: każda wiadomość SNS jest podpisana. Frontmail pobiera certyfikat podpisu wyłącznie z sns.<region>.amazonaws.com, weryfikuje podpis (SignatureVersion 1 lub 2) i odrzuca wiadomości starsze niż godzina. Jeśli ustawisz ARN tematu SNS, powiadomienia z każdego innego tematu są odrzucane. Jeśli zostawisz pole puste, Frontmail przypina temat pierwszej poprawnie podpisanej wiadomości (zwykle potwierdzenia subskrypcji) i od tej chwili odrzuca wiadomości z każdego innego tematu – podpis SNS dowodzi tylko tego, że wiadomość wysłało jakieś konto AWS.
Frontmail dodaje do każdego e-maila tag wiadomości frontmail_message_id, żeby zdarzenia dało się dopasować z powrotem do wiadomości.
Częste błędy
Dział zatytułowany „Częste błędy”- auth – usługa nie działa (nieprawidłowy/usunięty klucz dostępu, brak uprawnienia IAM, wstrzymana wysyłka, niezweryfikowany nadawca). Usługa zostaje oznaczona jako
unhealthy, a właściciel dostaje e-mail i baner w panelu. Jeśli szablon ma usługę zapasową, wiadomość idzie przez nią; w przeciwnym razie kredyt wraca, a wiadomość czeka w kolejce wstrzymanych wiadomości jakoheld_service_error, dopóki nie naprawisz usługi (sprawdzanej ponownie przy zapisie i w codziennym health checku), a potem jest wysyłana automatycznie. - permanent – tej wiadomości nie da się wysłać (nieprawidłowy lub niezweryfikowany odbiorca, odrzucona treść). Usługa zapasowa, jeśli jest skonfigurowana, w przeciwnym razie
failedi zwrot kredytu. - transient – throttling, timeouty, 5xx. Ponawiane z wykładniczym opóźnieniem; po ostatniej próbie
failedi zwrot kredytu.
| Błąd SES | Klasa | Co zrobić |
|---|---|---|
InvalidClientTokenId / UnrecognizedClientException / SignatureDoesNotMatch |
auth | Access key ID lub sekret jest błędny albo usunięty. Utwórz nowy klucz dla użytkownika IAM. |
AccessDeniedException: … not authorized to perform ses:SendRawEmail |
auth | Dodaj brakującą akcję do polityki IAM (zobacz wyżej). |
MessageRejected: Email address is not verified … hello@example.com (nadawca) |
auth | Zweryfikuj domenę lub adres nadawcy w wybranym regionie. |
MailFromDomainNotVerifiedException |
auth | Popraw rekordy MX/TXT własnej domeny MAIL FROM albo ją usuń. |
SendingPausedException / AccountSuspendedException |
auth | AWS wstrzymał wysyłkę (często przez wysoki wskaźnik odbić lub skarg). Sprawdź SES → Reputation metrics i komunikaty AWS. |
MessageRejected: Email address is not verified … customer@gmail.com (odbiorca) |
permanent | Konto jest nadal w sandboxie – wnioskuj o dostęp produkcyjny albo zweryfikuj odbiorcę. |
BadRequestException / ValidationException (nieprawidłowy adres) |
permanent | Zobacz nieprawidłowy odbiorca. |
TooManyRequestsException / Throttling: Maximum sending rate exceeded |
transient | Obniż Maks. liczba e-maili na sekundę do tempa wysyłki w SES; poproś AWS o wyższy limit. |
InternalFailure, ServiceUnavailable, timeouty |
transient | Nic – Frontmail ponawia próby. |
Lista kontrolna
Dział zatytułowany „Lista kontrolna”- Tożsamość domeny zweryfikowana przez Easy DKIM (3 rekordy CNAME) w wybranym regionie
- Opublikowana własna domena MAIL FROM (MX + SPF) i DMARC
p=none - Przyznany dostęp produkcyjny w tym regionie
- Użytkownik IAM tylko z
ses:SendEmail,ses:SendRawEmail,ses:GetAccount - Testuj połączenie przechodzi i pokazuje
sandbox: false - Configuration set → temat SNS → subskrypcja HTTPS na URL webhooka Frontmail, stan Confirmed
- Nazwa configuration setu wpisana we Frontmail
- Maks. liczba e-maili na sekundę nie wyższa niż tempo wysyłki w SES