【问题标题】:Django reset password email signed using DomainKey with Amazon SES使用 DomainKey 和 Amazon SES 签名的 Django 重置密码电子邮件
【发布时间】:2013-10-29 20:29:14
【问题描述】:

我正在尝试试验的应用程序允许用户使用 djangos 内置的 PasswordResetForm 重置他们的密码,目前我正在覆盖它以便能够使用 EmailMultiAlternatives 发送 HTML 电子邮件。

它目前的外观和工作正常。

c ={'name':'Shabeer'}
subject = 'Test Amazon SES'
txt_content = loader.render_to_string('registration/password_reset_email.txt', c)
html_content = loader.render_to_string(email_template_name, c)

msg = EmailMultiAlternatives(subject, txt_content, from_email, [user.email]);            
msg.attach_alternative(html_content, 'text/html')
msg.send()

所以现在我在 hmarr 的这个 Getting started 示例的帮助下开始了,这是我添加到我的 settings.py 的代码

EMAIL_BACKEND = 'django_ses.SESBackend'

DEFAULT_FROM_EMAIL = 'shabeer@sheffa.com'

AWS_ACCESS_KEY_ID = 'MyAcCeSsKeYiD'
AWS_SECRET_ACCESS_KEY = 'MySeCrEtAcCeSsKeY'
AWS_SES_REGION_NAME = 'us-east-1'
AWS_SES_REGION_ENDPOINT = 'email.us-east-1.amazonaws.com'
AWS_SES_RETURN_PATH = 'shabeer@sheffa.com'

电子邮件通过亚马逊 SES 成功发送给用户。


所以现在这是我的问题

我试图避免看到"via" followed by a domain name next to the sender's name

为了实现这一点,我开始遵循指南的下一步DKIM。 :

  1. 为我的域添加了由 Amazon SES 生成的 DKIM 设置
  2. 将以下内容添加到settings.py

DKIM_DOMAIN = 'myDomainName.com'`

  1. 下载openssl-for windows,并按照命令进行操作

    • openssl genrsa -out myDomainName.com.key 512
    • openssl rsa -in myDomainName.com.key -out rsa.public -pubout -outform PEM

      创建了两个文件:myDomainName.com.keyrsa.public
  2. 将 DKIM_PRIVATE_KEY 添加到 settings.py

    DKIM_PRIVATE_KEY = ''' xxxxxxxxxxxxxxxxxxxxxxxxxxx
    我的长私钥
    xxxxxxxxxxxxxxxxxxxxxxxxxxx
    '''

  3. 添加了 DNS 条目

    ses._domainkey.myDomainName.com TXT '"v=DKIM1; p=myPublicKey"'

完成以上所有操作后,我运行我的项目并尝试重置我的密码,然后抛出此错误:

Exception Type: KeyFormatError at /password_reset/
Exception Value: Private key not found

我试图了解我错过了什么或出了什么问题,关于如何解决这个问题的一些建议/帮助将非常有帮助。

我是 Django/Python 的新手,所以请多多包涵。

提前谢谢你。

2013 年 10 月 28 日更新:

我仍在尝试找出 django 正在寻找哪个 Private Key,而我已经在我的 settings.py

中添加了 DKIM_PRIVATE_KEY


2013 年 10 月 29 日更新:

  • Paul Egan 的帮助下,我更新了我的DKIM_PRIVATE_KEY 在我的settings.py 中包含PEM header 现在看起来像这样:

    DKIM_PRIVATE_KEY = '''
    -----BEGIN RSA PRIVATE KEY-----
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    -----END RSA PRIVATE KEY----- '''

现在发送的电子邮件没有任何错误,但是我收到的电子邮件仍然显示via amazonses.com

【问题讨论】:

  • 大家知道如何克服这个问题吗?

标签: python django amazon-web-services amazon-ses dkim


【解决方案1】:

Private key not found 错误是从parse_pem_private_key 引发的。这表明您的设置不包括 PEM 标头。仔细检查它是否类似于:

DKIM_PRIVATE_KEY = '''
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxx
-----END RSA PRIVATE KEY-----
'''

您可能还想考虑另一种选择。去年 AWS 增加了对添加 DKIM 签名的支持:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/easy-dkim.html。您可能会发现这更容易配置,并且它具有使私钥远离源代码的额外优势。

【讨论】:

  • 感谢您的回复,我添加了 PEM 标头并且电子邮件发送没有错误,但它仍然显示 via amazonses.com。我确实配置了Easy DKIM,它仅在我发送测试电子邮件时隐藏via amazonses.com。通过 django 发送时没有任何反应。
  • 检查您收到的电子邮件的标题,特别是DKIM-Signature。它应该指出可能出了什么问题 - 可能与通过 DNS 发布的密钥不匹配。 (在 Gmail 网络客户端上,使用“更多”菜单并选择“显示原件”)。
  • 如果在 SES 上使用“easy”DKIM 选项,则无需为 Django 指定任何 DKIM 配置。消息从 Django 发送到 SES 后,将应用签名。检查您在 Django 中用作发件人的电子邮件地址是否启用了 DKIM 签名(或为整个域启用),并且状态是否为“已验证”。
  • 虽然我的域已经过验证,但我用来发送电子邮件的电子邮件地址没有经过验证,电子邮件使用的是不同的域。感谢您引起我的注意。由于域配置了Easy DKIM,我从settings.py 中删除了DKIM 设置。完美运行。谢谢。
  • 我必须等 20 小时才能奖励你,所以坚持下去,伙计 :)
猜你喜欢
  • 2021-08-06
  • 2019-09-30
  • 2013-12-24
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多