使用AWS SES沙箱发邮件遇403权限错误,求助排查
AWS SES沙箱发送邮件403权限错误排查
问题背景
使用AWS SES沙箱版本结合Java V2 SDK发送邮件,已为IAM用户附加AmazonSESFullAccess权限,但调用ses:SendEmail时返回403错误:
User
arn:aws:iam::XXXXXXXXX:user/iam-usernameis not authorized to performses:SendEmailon resourcearn:aws:ses:region-id:XXXXXXXXX:identity/sender-email@domain.com(Service: Ses, Status Code: 403, Request ID: a7287c61-dca1-48b5-87c0-b3b0df00a35e)
已配置的IAM权限
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ses:*", "Resource": "*" } ] }
Java代码实现
AwsCredentials credentials = AwsBasicCredentials.create("awsAccessKey", "awsSecretKey"); SesClient sesClient = SesClient.builder() .credentialsProvider(() -> credentials) .region(Region.of(region)) .build(); Destination destination = Destination.builder() .toAddresses("verified-receiver@test.com") .build(); Content htmlContent = Content.builder().data("some html content").build(); Content subject = Content.builder().data("some subject").build(); Body body = Body.builder().html(htmlContent).build(); Message message = Message.builder().subject(subject).body(body).build(); SendEmailRequest request = SendEmailRequest.builder() .destination(destination) .message(message) .source("verified-sender@test.com") .build(); SendEmailResponse response = sesClient.sendEmail(request);
关键排查点
以下是导致该403错误的常见遗漏配置:
- 凭证与IAM用户不匹配:代码中使用的
awsAccessKey/awsSecretKey必须属于已附加AmazonSESFullAccess权限的IAM用户,避免误用其他无权限的凭证。 - 区域不匹配:SES身份(发件邮箱/域名)的验证区域必须与代码中指定的
region完全一致。例如,若发件邮箱在us-east-1验证,代码却使用us-west-2,会因资源ARN的区域字段不匹配触发权限检查失败。 - IAM权限边界限制:若该IAM用户设置了Permission Boundary,需确认边界策略未禁止
ses:SendEmail操作。权限边界会作为权限上限,即使附加了AmazonSESFullAccess,边界不允许的操作仍会被拒绝。 - 组织SCP限制:如果你的AWS账号属于AWS Organization,需检查组织级别的Service Control Policy (SCP) 是否禁止了SES的
SendEmail操作。SCP会限制账号内所有IAM实体的权限范围。 - 发件人身份拼写错误:错误提示中的资源ARN指向
sender-email@domain.com,需确认代码中source参数的邮箱地址(verified-sender@test.com)与该资源完全一致。拼写错误会导致权限检查针对错误的SES身份资源。 - 沙箱身份验证状态:虽然这不是权限错误的直接原因,但需确保发件人和收件人邮箱均已在SES控制台完成验证(沙箱环境强制要求),避免后续出现发送失败问题。
内容的提问来源于stack exchange,提问作者pkgajulapalli
相关产品推荐
相关产品推荐

