AWS Non-Verified Account Fix AWS email sending authorization error when using cross account identities
If you landed here, you’re likely seeing an email-sending failure in Amazon SES (or a related service like Pinpoint) after switching to cross-account identities (IAM role assumption, delegated access, or using identities created in one AWS account to send from another). This error is frustrating because it often looks like an IAM problem, but the root cause is frequently a verification / authorization binding issue, or a region/account-level restriction.
1) What the error usually really means (and what to check first)
Different AWS errors show up with different wording depending on your integration, but users commonly report this pattern:
Common symptoms
- SES “Message rejected: Email address is not verified” even though you verified in another account
- Authorization error / “not authorized to use identity” / “account is not authorized to send”
- Pinpoint / SES sending works in one environment, fails when you use an assumed role or cross-account key
- Only fails for one region or one identity (domain vs subdomain) after switching accounts
In my operational experience handling account onboarding and sending authorization issues across multiple AWS accounts, the fastest path to resolution is to validate these three things in order:
- Identity and region alignment: SES identities (domain/email) are verified per account and are used/authorized per account identity ownership and region. Cross-account usage typically requires explicit authorization, and even then it must be in the right region.
- Sender authorization is account-bound: It’s not just IAM permissions. SES authorization for a sender identity is separate from “can assume role”. If account A owns the verified identity and account B sends, account A must authorize account B to use that identity.
- Production access / sandbox constraints: Some failures are triggered only under certain sending conditions (e.g., if you’re in SES sandbox, or your sending quota is constrained). While sandbox errors look different, they can be misinterpreted as “authorization error” when the UI message is vague.
2) The cross-account trap: “IAM role works” ≠ “SES identity is authorized”
Users often configure IAM so that an application in AWS Account B assumes a role in Account A (or uses credentials created for Account B). They then assume: “If I can call SES from my app, I should be able to send using the verified domain from the other account.”
Scenario-based fix
Scenario: You verified example.com in Account A. Your app runs in Account B and uses a cross-account role to call SES.
Account B tries to send from [email protected].
Fix: In SES in Account A, authorize Account B to use that identity. Then re-test from Account B.
The authorization mechanism is typically done via an SES policy where you grant permissions to the AWS account ID used by Account B (or specific IAM role). Exact console screens vary, but the underlying concept is consistent: SES must allow Account B as a sender using the identity.
3) Console path you can follow right now (Account A authorizes Account B)
Here’s the practical workflow I recommend when you need the fix quickly:
- Go to SES in Account A (owning account): verify the identity exists and is “verified”. If you created a verification record (TXT) but never confirmed it, cross-account sending will still fail.
- Open Identity policies / Permissions: look for “authorization” that allows other AWS accounts to send as this identity. Add Account B’s AWS account ID (and if supported, scope it to a role ARN / IAM principal).
-
Confirm the region: SES identity and permissions are region-scoped for API usage. Ensure both accounts are operating in the same SES region.
(It’s common to verify in
us-east-1but send fromeu-west-1.) - Test from Account B: send a test email again with the same From address matching the verified identity. Watch SES events / CloudWatch logs for rejection reason.
Fast sanity check: Try sending from Account A using the same From address. If Account A cannot send, fix verification first. If Account A can send but Account B cannot, it’s almost always the identity authorization or region mismatch.
4) IAM policy that’s “correct” but still fails: what to audit
AWS Non-Verified Account
Even when you’ve granted ses:SendEmail / ses:SendRawEmail permissions to a role in Account B, SES can reject the message.
So focus on the parts IAM doesn’t cover.
Audit checklist for cross-account SES sending
- Role assumption is allowed: Account B role can assume Account A role (if you’re using a centralized SES calling role). But again: assume-role success doesn’t guarantee identity authorization.
-
Sender identity matches exactly: If only
mail.example.comis verified and you send from[email protected], it may fail. SES verification and “from” domain matching behavior can be strict depending on your configuration. - Region-specific SES endpoint: Your SDK must call the SES endpoint in the region where the identity exists and is authorized. Cross-account setups often break when environment variables point to a different region.
- No sandbox sending limitations: If Account A is in sandbox and you’re only sending to a limited list, the error can look like “not authorized”. Check sending mode before concluding it’s authorization.
5) Account purchasing / onboarding considerations that impact email authorization
A lot of users here aren’t starting “from scratch”; they’re buying or provisioning AWS accounts (or reusing existing ones), sometimes under time pressure. That matters because AWS accounts can differ in verification readiness and risk posture.
What to confirm before you integrate cross-account sending
- Identity verification (AWS/KYC) completeness: If an account has incomplete enterprise verification or funding verification delays, certain actions (including expanding SES sending capabilities) may be blocked or behave inconsistently. This is especially common for newly created accounts or accounts acquired via non-standard paths.
- Payment method health: Many “authorization-like” failures ultimately trace back to account status, billing controls, or inability to increase sending limits / move from sandbox after enabling production. If the account can’t reliably fund and renew, it may not progress to the sending state you expect.
- Risk control review outcomes: If your sending patterns trigger review (sudden traffic spikes, new domain, unusual recipient patterns), SES might enforce stricter throttling or require additional verification. Cross-account identity use can complicate attribution, making failures appear “authorization” rather than “risk”.
6) Payment methods and renewals: why they show up as SES errors
You might be tempted to ignore billing because the error is “authorization”. But from operational cases, billing issues can manifest indirectly:
| Payment / Billing Situation | What tends to break | How it appears to you | What to do |
|---|---|---|---|
| Credit balance depleted or card verification pending | Ability to increase SES quotas / transition to production sending | Rejections that look like policy/authorization failures in logs | Verify billing status and payment method; confirm SES quotas and production readiness |
| New account with incomplete verification | Service control constraints | Inconsistent behavior during retries; ambiguous console messages | Complete AWS account verification, then retest identity authorization |
| Spiky usage after account access change (cross-account role swap) | Risk controls / throttling | More failures after switching roles/credentials | Lower sending rate temporarily; keep domain warm-up consistent; review SES sending metrics |
Cost comparison you actually care about (cross-account vs single-account)
Cross-account isn’t just a permissions problem—it changes operational overhead:
- Single-account approach: fewer identity/authorization bindings to manage; fewer failure modes.
- Cross-account approach: additional authorization steps, more regions/principals to track, and more time spent troubleshooting. That “time cost” is often larger than any direct AWS service cost.
From a decision standpoint: if you’re buying accounts or setting up a new environment, prefer consolidating SES identity ownership and sending in the same AWS account unless you have a hard compliance or isolation requirement.
7) Risk control and compliance reviews: how they impact authorization
SES doesn’t only check IAM; it also looks at sending reputation and account behavior. Cross-account setups can accidentally increase “risk-like” signals:
- New sender identity + new sending principal: A domain verified in Account A, then used by Account B immediately, can trigger extra scrutiny.
- Recipient mismatch: sending to a new list quickly, especially if it includes non-engaged recipients.
- Inconsistent From/Return-Path: if your email headers differ across attempts (some with matching identity, others not), SES may reject based on policy and reputation signals.
Operational mitigation: After authorization is fixed, start with low-volume sends, consistent headers, and a stable recipient list for a short period before scaling.
8) Common registration / verification failures that block SES sending (and confuse debugging)
Even though your title is about “authorization error”, in real troubleshooting threads the upstream cause is often account readiness. Here are the failure modes I see when the account is purchased/provisioned or when KYC is incomplete.
Most common blockers
- AWS account verification stuck or partially completed: leads to inability to fully enable required features, quotas, or production behavior.
- Domain verification created but DNS propagation never completed: console may show “requested”, but SES doesn’t actually accept the identity.
- AWS Non-Verified Account Verifying the wrong identity scope: verifying root domain but sending from a different subdomain, or vice versa.
- Using the wrong SES region: identity exists in one region, API calls in another.
- Assuming role with wrong principal identity: your app may be sending using an assumed role session that doesn’t map to the identity authorization scope you created in SES.
9) Concrete “do this now” troubleshooting playbook
When you’re under time pressure (e.g., launch is tomorrow), use this order. It avoids wasting hours on IAM changes that won’t solve SES identity authorization.
Step 1: Identify where the verified identity lives
- Account A should be the one that verified the domain/email.
- Confirm in SES console that the identity status is Verified in the correct region.
Step 2: Confirm region endpoint consistency
- In Account B, ensure your SDK/client is targeting the same SES region used in Step 1.
- Check environment variables (often
AWS_REGIONdiffers between staging and prod).
AWS Non-Verified Account Step 3: Add Account B authorization in Account A
- In SES Identity permissions, authorize Account B.
- If you can scope permissions to a role, scope it to your exact role ARN used by the application.
Step 4: Validate by sending from Account B using the same From address
- Try once with a single known verified From address.
- AWS Non-Verified Account If it still fails, check SES event logs/rejection reason (don’t rely on generic UI).
Step 5: If it passes, lock down your IAM so it doesn’t regress
- Ensure the role only has needed SES actions.
- Keep the authorization binding consistent across deployments (don’t rotate roles without updating SES authorization).
Regression gotcha: If you later switch to a different role in Account B (new role ARN) but SES identity authorization was scoped to the old role principal, you’ll get the same authorization error again—even though “SES permissions seem fine”.
10) Frequently asked questions (the ones people actually ask)
Q1: Can I verify a domain in Account A and send from Account B without authorization?
AWS Non-Verified Account Usually no. Verification proves domain ownership for identity acceptance, but cross-account sending requires explicit SES authorization for the other account/principal. Without it, SES will reject with an “not authorized / identity not verified for this account” type error.
Q2: If IAM allows ses:SendEmail, why does SES still reject?
Because SES has its own identity authorization and policy checks that are separate from IAM. IAM controls API access; SES controls sending rights for the identity.
Q3: We’re using assumed roles. Does SES care which role session we use?
If your SES identity authorization is scoped to a specific principal (role ARN), then yes. Even if both roles have the same SES permissions, the SES authorization binding may not match the principal making the call.
Q4: Our app worked in one region but fails in another. Identity is verified—why?
Region mismatch. SES identities and authorization permissions are tied to region usage. Verify and authorize in the same region where you send.
Q5: Does this depend on whether we run through AWS SDK vs SMTP relay?
The underlying identity authorization still applies. But the error messaging differs. SMTP flows can surface rejection later and with less context, so always check SES rejection reason and event logs for the precise cause.
Q6: We are thinking of buying an AWS account to speed up SES setup. What should we check?
Ask for evidence (or perform checks after login): (1) account verification status (KYC / enterprise verification completion), (2) billing method status and renewal health, (3) SES sandbox vs production readiness, (4) ability to configure SES identity permissions and confirm quotas. Otherwise you may waste days debugging “authorization” that is really account readiness/risk posture.
11) Recommendation: choose the path that minimizes authorization bindings
If you control both accounts, the cleanest operational setup is usually:
- Verify identity and send from the same AWS account, or
- If you must split (security/compliance), use SES identity authorization in the owning account and keep the principal/role ARN stable across deployments.
For cross-account identity, the “fix” is not one IAM change—it’s ensuring SES identity authorization + region consistency + account readiness align.
12) If you paste the error text, I can pinpoint the exact cause
AWS Non-Verified Account If you want a faster diagnosis, send:
- the exact rejection/authorization message text
- SES region used by Account B
- which account owns the verified identity
- whether you’re using SES API, SMTP, or Pinpoint
- your “From” address and whether it’s a root domain or subdomain
With that, you can avoid the most common dead-ends: IAM-only changes, verifying in the wrong region, or authorizing the wrong principal.

