Przejdź do głównej zawartości

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.

  • 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.

  1. Otwórz Usługi e-mail → Dodaj usługę → Amazon SES.
  2. 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
  1. Kliknij Zweryfikuj i zapisz. Frontmail wywoła GetAccount i pokaże, czy konto jest nadal w sandboxie, jakie ma maksymalne tempo wysyłki i limit na 24 godziny.
  2. 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.
  3. Klucz dostępu jest szyfrowany kopertowo przez AWS KMS; odszyfrowywany jest tylko w procesie wysyłki.

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"

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).

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.

SES publikuje zdarzenia przez Amazon SNS. Frontmail subskrybuje twój temat SNS przez HTTPS.

  1. SNS → Topics → Create topic (Standard), np. frontmail-events, w tym samym regionie.

  2. 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.

  3. SES → Configuration sets → Create set (np. frontmail) → Event destinations → Add destination → wybierz typy zdarzeń → miejsce docelowe Amazon SNS → twój temat.

  4. 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.

  • 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 jako held_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 failed i zwrot kredytu.
  • transient – throttling, timeouty, 5xx. Ponawiane z wykładniczym opóźnieniem; po ostatniej próbie failed i 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.
  • 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