Přeskočit na obsah

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.

  • 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”
  1. Otevřete E-mailové služby → Přidat službu → Amazon SES.
  2. 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
  1. Klikněte na Ověřit a uložit. Frontmail zavolá GetAccount a ukáže, jestli je účet ještě v sandboxu, jakou má maximální rychlost a 24hodinovou kvótu.
  2. 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í.
  3. Přístupový klíč šifrujeme obálkovým šifrováním přes AWS KMS a dešifruje se jen v odesílacím procesu.

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"

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

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.

  1. SNS → Topics → Create topic (Standard), např. frontmail-events, ve stejném regionu.

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

  3. SES → Configuration sets → Create set (např. frontmail) → Event destinations → Add destination → vyberte typy událostí → cíl Amazon SNS → vaše téma.

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

  • 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 unhealthy a 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 jako held_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 failed a vrácení kreditu.
  • transient – throttling, timeouty, 5xx. Opakujeme s exponenciálně rostoucí pauzou; po posledním pokusu failed a 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.
  • Doménová identita ověřená přes Easy DKIM (3× CNAME) ve zvoleném regionu
  • Vlastní MAIL FROM (MX + SPF) a DMARC p=none nastavené
  • 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í