Amazon SES
Amazon Simple Email Service (SES) je nejlevnější způsob, jak posílat velké objemy transakční pošty, a přirozená volba, pokud už stavíte na AWS. Nastavení je o něco pracnější než u ostatních služeb – IAM, výběr regionu, opuštění sandboxu –, pak ale SES funguje velmi spolehlivě.
SES zvolte, když posíláte tisíce e-mailů měsíčně a víc, řešíte cenu za zprávu nebo chcete mít všechno ve vlastním AWS účtu. Pokud chcete začít co nejrychleji, je jednodušší Postmark, Resend nebo Mailgun. Viz přehled služeb.
Co budete potřebovat
Sekce “Co budete potřebovat”- AWS účet se SES v regionu, ze kterého chcete posílat.
- Ověřenou identitu v tomto regionu: ideálně celou doménu (SES → Identities → Create identity → Domain), minimálně aspoň adresu odesílatele.
- Produkční přístup (opuštění sandboxu), než začnete posílat libovolným příjemcům – viz Sandbox a limity.
- Samostatného IAM uživatele s přístupovým klíčem a jen těmito oprávněními:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ses:SendEmail", "ses:SendRawEmail", "ses:GetAccount"], "Resource": "*" } ]}ses:SendEmail / ses:SendRawEmail jsou potřeba k odesílání (Frontmail používá SES v2 API s kompletní MIME zprávou), ses:GetAccount k Otestovat spojení a denní kontrole stavu, která čte i kvótu a stav sandboxu. Resource můžete zúžit na ARN své identity a configuration setu. Nepoužívejte root účet ani administrátorského uživatele.
Připojení ve Frontmailu
Sekce “Připojení ve Frontmailu”- Otevřete E-mailové služby → Přidat službu → Amazon SES.
- Vyplňte pole:
| Pole | Kde ho najdete | Příklad |
|---|---|---|
| AWS region | Region, kde máte ověřenou identitu (vpravo nahoře v konzoli SES) | eu-central-1 |
| Access key ID | IAM → Users → frontmail-ses → Security credentials → Create access key | AKIAIOSFODNN7EXAMPLE |
| Secret access key | Zobrazí se jen jednou při vytvoření klíče | wJalrXUtnFEMI/K7MDENG/… |
| Configuration set | SES → Configuration sets (potřeba pro události o doručení) | frontmail |
| ARN SNS tématu | Volitelné; SNS → Topics – události z jiných témat pak ignorujeme | arn:aws:sns:eu-central-1:123456789012:frontmail-events |
| Výchozí e-mail odesílatele | Volitelné; ověřená identita ve zvoleném regionu (adresa na ověřené doméně nebo ověřená adresa). Použije se, když šablona nemá odesílatele | ahoj@example.cz |
| Výchozí jméno odesílatele | Volitelné; zobrazované jméno výchozího odesílatele | Acme |
| Max. e-mailů za sekundu | Volitelné; držte ho na maximální rychlosti SES nebo pod ní | 14 |
- Klikněte na Ověřit a uložit. Frontmail zavolá
GetAccounta ukáže, jestli je účet ještě v sandboxu, jakou má maximální rychlost a 24hodinovou kvótu. - Když kontrola projde, služba se uloží. SES nemá žádnou „adresu účtu“, proto tu nastavte Výchozí e-mail odesílatele, nebo vyplňte e-mail odesílatele v každé šabloně – jinak odeslání skončí chybou
sender_not_configured(viz Výchozí odesílatel). Později ho změníte na stránce služby bez nového ověření. - Přístupový klíč šifrujeme obálkovým šifrováním přes AWS KMS a dešifruje se jen v odesílacím procesu.
DNS: SPF, DKIM a DMARC
Sekce “DNS: SPF, DKIM a DMARC”Easy DKIM – po vytvoření doménové identity vám SES dá tři CNAME záznamy:
abcdef1234._domainkey.example.cz. CNAME abcdef1234.dkim.amazonses.com.ghijkl5678._domainkey.example.cz. CNAME ghijkl5678.dkim.amazonses.com.mnopqr9012._domainkey.example.cz. CNAME mnopqr9012.dkim.amazonses.com.Klíče za nimi AWS rotuje automaticky. Jakmile se záznamy propíšou, identita se přepne na Verified.
SPF přes vlastní MAIL FROM doménu – ve výchozím stavu je obálkový odesílatel adresa na amazonses.com, takže SPF sice projde, ale není zarovnané s vaší doménou. Chcete-li zarovnání pro DMARC i u SPF, nastavte u identity vlastní MAIL FROM (např. bounce.example.cz) a přidejte:
bounce.example.cz. MX 10 feedback-smtp.eu-central-1.amazonses.com.bounce.example.cz. TXT "v=spf1 include:amazonses.com ~all"(eu-central-1 nahraďte svým regionem.)
DMARC – začněte v režimu monitoringu a pak zpřísňujte:
_dmarc.example.cz. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.cz"Regiony
Sekce “Regiony”SES je regionální služba: identity, stav sandboxu, kvóty, configuration sety i suppression listy jsou pro každý region zvlášť. Region zvolený ve Frontmailu musí být ten, kde:
- máte ověřenou doménu nebo adresu,
- jste požádali o produkční přístup,
- leží váš configuration set a SNS téma.
Samotný IAM klíč je globální, ale v regionu, kde nic nastavené nemáte, skončí odeslání chybou „Email address is not verified“. Chcete-li data v EU, zvolte evropský region, třeba eu-central-1 (Frankfurt), eu-west-1 (Irsko) nebo eu-north-1 (Stockholm).
Sandbox a limity
Sekce “Sandbox a limity”Každý nový SES účet začíná v sandboxu, a to v každém regionu zvlášť:
- posílat můžete jen na ověřené adresy nebo domény,
- nejvýš 200 zpráv za 24 hodin,
- nejvýš 1 zprávu za sekundu.
O produkční přístup požádejte v SES → Account dashboard → Request production access. Popište použití (transakční e-maily z webového formuláře přes Frontmail), jak příjemci dali souhlas a jak řešíte bounce a stížnosti. Schválení obvykle trvá zhruba den.
Po schválení začíná kvóta na skromnější úrovni (např. 50 000 denně, 14/s) a s dobrou historií roste. Aktuální hodnoty ukáže Otestovat spojení; Max. e-mailů za sekundu nastavte na maximální rychlost odesílání nebo pod ni.
Webhooky (sledování doručení)
Sekce “Webhooky (sledování doručení)”SES posílá události přes Amazon SNS. Frontmail se k vašemu SNS tématu přihlásí přes HTTPS.
-
SNS → Topics → Create topic (Standard), např.
frontmail-events, ve stejném regionu. -
Create subscription → protokol HTTPS → endpoint = webhook URL ze stránky služby ve Frontmailu (tlačítko kopírovat):
https://api.frontmail.dev/webhooks/providers/ses/<token>Raw message delivery nechte vypnuté. Frontmail ověří podpis SNS a odběr potvrdí automaticky – během pár sekund se stav změní z Pending confirmation na Confirmed.
-
SES → Configuration sets → Create set (např.
frontmail) → Event destinations → Add destination → vyberte typy událostí → cíl Amazon SNS → vaše téma. -
Název configuration setu (a případně ARN tématu) zadejte do služby ve Frontmailu a uložte.
| Typ události v SES | Událost ve Frontmailu |
|---|---|
| Deliveries | delivered |
Hard bounce (Permanent) |
bounced – přidá se na suppression list |
Soft bounce (Transient), zpoždění doručení |
zaznamená se u zprávy |
| Complaints | complained – přidá se na suppression list |
| Opens | opened |
| Clicks | clicked |
| Rejects, chyby vykreslení | zaznamená se u zprávy |
Ověření podpisu: každá zpráva SNS je podepsaná. Frontmail stahuje podpisový certifikát jen ze sns.<region>.amazonaws.com, ověří podpis (SignatureVersion 1 i 2) a zprávy starší než hodinu odmítne. Vyplníte-li ARN SNS tématu, notifikace z jiných témat odmítneme. Když ho necháte prázdné, Frontmail si zapamatuje téma první platně podepsané zprávy (obvykle potvrzení odběru) a zprávy z jiných témat pak odmítá – podpis SNS dokazuje jen to, že zprávu poslal nějaký účet AWS.
Každý e-mail dostane tag frontmail_message_id, podle kterého se události spárují se zprávou.
Časté chyby
Sekce “Časté chyby”- auth – nefunguje služba (neplatný či smazaný klíč, chybějící IAM oprávnění, pozastavené odesílání, neověřený odesílatel). Služba se označí jako
unhealthya vlastník dostane e-mail a upozornění v dashboardu. Má-li šablona záložní službu, zpráva odejde přes ni; jinak vrátíme kredit a zpráva počká ve frontě zadržených zpráv jakoheld_service_error, dokud službu neopravíte (ověřujeme při uložení a při denní kontrole stavu) – pak se odešle sama. - permanent – nejde odeslat právě tahle zpráva (neplatný nebo neověřený příjemce, odmítnutý obsah). Záložní služba, pokud je nastavená, jinak
faileda vrácení kreditu. - transient – throttling, timeouty, 5xx. Opakujeme s exponenciálně rostoucí pauzou; po posledním pokusu
faileda vrácení kreditu.
| Chyba SES | Třída | Co dělat |
|---|---|---|
InvalidClientTokenId / UnrecognizedClientException / SignatureDoesNotMatch |
auth | Access key ID nebo secret je špatně či smazaný. Vytvořte IAM uživateli nový klíč. |
AccessDeniedException: … not authorized to perform ses:SendRawEmail |
auth | Doplňte chybějící akci do IAM politiky (viz výše). |
MessageRejected: Email address is not verified … ahoj@example.cz (odesílatel) |
auth | Ověřte doménu nebo adresu Od ve zvoleném regionu. |
MailFromDomainNotVerifiedException |
auth | Opravte MX/TXT záznamy vlastní MAIL FROM domény, nebo ji zrušte. |
SendingPausedException / AccountSuspendedException |
auth | AWS pozastavil odesílání (často kvůli vysoké míře bounců nebo stížností). Zkontrolujte SES → Reputation metrics a oznámení od AWS. |
MessageRejected: Email address is not verified … zakaznik@gmail.com (příjemce) |
permanent | Účet je stále v sandboxu – požádejte o produkční přístup, nebo příjemce ověřte. |
BadRequestException / ValidationException (neplatná adresa) |
permanent | Viz neplatný příjemce. |
TooManyRequestsException / Throttling: Maximum sending rate exceeded |
transient | Snižte Max. e-mailů za sekundu na rychlost SES; požádejte AWS o vyšší kvótu. |
InternalFailure, ServiceUnavailable, timeouty |
transient | Nic – Frontmail to zopakuje. |
Kontrolní seznam
Sekce “Kontrolní seznam”- Doménová identita ověřená přes Easy DKIM (3× CNAME) ve zvoleném regionu
- Vlastní MAIL FROM (MX + SPF) a DMARC
p=nonenastavené - Produkční přístup v tomto regionu schválený
- IAM uživatel jen s
ses:SendEmail,ses:SendRawEmail,ses:GetAccount - Otestovat spojení prošel a ukazuje
sandbox: false - Configuration set → SNS téma → HTTPS odběr na webhook URL Frontmailu ve stavu Confirmed
- Název configuration setu zadaný ve Frontmailu
- Max. e-mailů za sekundu na rychlosti SES nebo pod ní