【问题标题】:django rest-auth email confirmation with postmark带有邮戳的 django rest-auth 电子邮件确认
【发布时间】:2020-01-09 18:50:37
【问题描述】:

我已经看过很多关于如何覆盖电子邮件模板的内容,但它们似乎主要涉及创建 HTML 模板和覆盖文件位置。

我正在使用邮戳的模板,其中涉及发送带有电子邮件变量的发布请求。我正在使用 anymail 来处理这个问题,如下所示,其中有一个向我的客户服务地址发送电子邮件的表单:

class PartnerContact(APIView):
    """Sends email to Partners@***.com"""

    @authentication_classes([])
    @permission_classes([])
    def post(self, request):
        """Sends Form Data"""

        print("PartnerContact data", request.data)

        status_code = status.HTTP_400_BAD_REQUEST

        msg = EmailMessage(
            from_email='Partners@***.com',
            to=['Partners@***.com'],
            reply_to=[request.data['email']]
        )

        msg.template_id = ***

        logo = attach_inline_image_file(msg, finders.find("***.png"))

        msg.merge_global_data = { **{**request.data, **{"logo":logo} } }

        # <img alt="Logo" src="cid:{logo_cid}">
        msg.send()
        status_code = status.HTTP_200_OK

        return Response(status=status_code)

我的目标是也为帐户确认和密码重置电子邮件使用邮戳模板,但我很难弄清楚如何覆盖发送方法。

【问题讨论】:

  • 问题陈述不清楚。添加更多示例代码并清楚地阐述您的问题和预期输出。
  • 我正在使用Django rest auth,并且想覆盖处理发送电子邮件的方法,并且我知道如何编写我想要替换它的内容,但不知道什么方法(s ) 来覆盖或在我这样做后如何引用它们。
  • 听起来您的问题是:您如何覆盖django-rest-auth 发送密码/帐户电子邮件的位置,以便您可以添加django-anymail 特定选项,例如template_id?看起来密码重置电子邮件来自PasswordResetSerializer 通过django.contrib.authPasswordResetForm,所以你需要覆盖它。像这样的东西:stackoverflow.com/q/54153097/647002
  • (另外,仅供参考:在您的模板数据中包含 **request.data 可能存在安全风险,因为它将包含 every GET 和 POST 参数。有人可能会使用它来提供模板合并您不想要的数据字段。最好只提取您的模板需要的特定 GET 或 POST 字段。)

标签: django django-rest-framework django-rest-auth postmark django-anymail


【解决方案1】:

rest_auth 只提供给allauth 的其余框架接口。

您想要覆盖 allauth 的电子邮件,而不是 rest_auth 的。

allauth doc 关于发送电子邮件allauth.account.adapter.DefaultAccountAdapter.send_email()

您可以通过在 settings.py 中设置 ACCOUNT_ADAPTER configuration 并将 DefaultAccountAdapter 子类化来实现此目的

from allauth.account.adapter import DefaultAccountAdapter

CustomAccountAdapter(DefaultAccountAdapter):
    def send_mail(self, template_prefix, email, context):
        # handle send mail the way you want to
        pass 

【讨论】:

  • 感谢您抽出宝贵时间回复。你的答案是正确的,因为它说明了要做什么——它基本上是从文档中引用的:“如果这不符合你的需要,你可以通过覆盖帐户的 send_mail 方法来连接你自己的自定义机制适配器(allauth.account.adapter.DefaultAccountAdapter)。”我不知道该怎么做。似乎我更需要覆盖“render_mail”方法,但我也不确定。我的目标是将所有帐户电子邮件视为交易电子邮件并使用邮戳模板。
  • 添加了一个基本示例。您可以将 DefaultAccountAdapter 子类化,这将保留所有 DefaultAccountAdapter 的功能,并且您可以仅覆盖您需要的内容。这使用传统的对象继承,允许您从父类扩充功能。
  • 那么处理这个问题的正确方法是在模板前缀参数上使用等效的 switch case 来处理各种情况?注册、密码重置等?
猜你喜欢
  • 2017-02-01
  • 2019-04-17
  • 2017-02-20
  • 2016-08-25
  • 2016-02-06
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
相关资源
最近更新 更多