AWS SES调用SendRawEmail遇AccessDenied:Boto3/django-ses权限排查
排查与解决步骤
确认代码使用的凭证匹配目标IAM用户
检查Boto3/django-ses加载的AWS凭证是否为你配置了权限的IAM用户(BAR)的AK/SK:- 若用django-ses,核对
settings.py中的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY是否正确; - 若直接用Boto3,确认是否通过环境变量、
~/.aws/credentials或代码显式传入了正确凭证,避免误用其他默认凭证(比如EC2实例角色、其他用户的凭证)。
- 若用django-ses,核对
验证区域配置与控制台一致
你在控制台用的是eu-central-1区域,必须确保代码中的区域配置完全匹配:- django-ses需在
settings.py中设置:AWS_SES_REGION_NAME = 'eu-central-1' AWS_SES_REGION_ENDPOINT = 'email.eu-central-1.amazonaws.com' - Boto3客户端需显式指定区域:
import boto3 client = boto3.client('ses', region_name='eu-central-1')
- django-ses需在
检查IAM用户的权限边界
登录AWS控制台进入IAM用户(BAR)详情页,查看是否设置了权限边界。如果权限边界限制了ses:SendEmail或ses:SendRawEmail操作,即使附加了允许策略,也会被权限边界拦截,需调整权限边界或移除相关限制。核对SES身份授权策略的正确性
确认授权策略中的ARN无错误:- 检查
Principal中的IAM用户ARN(arn:aws:iam::FOO:user/BAR)里的账号ID(FOO)是否准确; - 确认
Resource中的SES身份ARN(arn:aws:ses:eu-central-1:FOO:identity/no-reply@example.com)与实际已验证邮箱的ARN完全一致,包括区域、账号ID和邮箱地址。
- 检查
排查django-ses的发件地址配置
若使用django-ses,确保settings.py中AWS_SES_FROM_EMAIL设置为已验证的no-reply@example.com——即使脱离沙箱,发件地址仍需是SES已验证的身份,否则可能触发权限类错误。
内容的提问来源于stack exchange,提问作者tpotjj
相关产品推荐
相关产品推荐

