Django-SES BotoServerError:禁止使用403

时间:2019-05-09 21:21:02

标签: python django amazon-ses django-ses

我正在尝试使用django库从django-ses发送电子邮件,但出现错误:

boto.exception.BotoServerError: BotoServerError: 403 Forbidden
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>
  </Error>
  <RequestId>7e2103e0-729f-11a9-aq25-51a2dqa8ae97</RequestId>
</ErrorResponse>

我在AWS控制台中验证了域并验证了管理员地址admin@...com的地址,并从SES仪表板创建了API密钥和机密。

Django设置:

EMAIL_BACKEND = 'django_ses.SESBackend'
AWS_SES_ACCESS_KEY_ID = os.environ.get('AWS_SES_ACCESS_KEY_ID')
AWS_SES_SECRET_ACCESS_KEY = os.environ.get('AWS_SES_SECRET_ACCESS_KEY')
AWS_SES_REGION_NAME = 'eu-west-1' # because I use ireland server, but same error without this

SERVER_EMAIL = 'admin@...com'
DEFAULT_FROM_EMAIL = '"Hello You" <no-reply@...com>'

并且我尝试通过以下方式发送电子邮件:

from django.core.mail import EmailMessage
from django.conf import settings

email = EmailMessage(
    'Hello', 
    'World', 
    settings.DEFAULT_FROM_EMAIL, 
    to=['mail@example.com']
)
email.send()

这里可能有什么问题?

1 个答案:

答案 0 :(得分:1)

您正在通过API(sendemail或sendrawemail)而不是SMTP进行呼叫。

AWS_SES_ACCESS_KEY_ID = os.environ.get('AWS_SES_ACCESS_KEY_ID') AWS_SES_SECRET_ACCESS_KEY = os.environ.get('AWS_SES_SECRET_ACCESS_KEY')

此处的访问密钥和秘密密钥应该是有权访问SES的IAM用户密钥。 要发出sendemail或sendrawemail呼叫,您需要从IAM控制台使用/创建IAM用户并使用这些凭据,请确保该用户具有允许访问SES的策略。

如果从SES控制台获取密钥,则这些密钥仅适用于SMTP。

SMTP和常规IAM凭据不同,但是您可以将其转换,请参见以下链接:

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-credentials.html