覆盖RestAuth密码重置电子邮件问题

5

你好,我正在尝试覆盖Django allauth的password_reset_email。问题是虽然它成功地被覆盖了,但我收到的是发送给用户的html代码而不是html表示形式。

我原本期望得到一个像我收到的确认邮件那样有样式的电子邮件,但情况似乎并非如此。

在我的templates/registration/password_reset_email.html中。

{% load i18n %}
{% autoescape off %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Confirm Your E-mail</title>
    <style>
        .body {
            background-color: #f6f6f6;
            padding: 30px;
            display: flex;
            flex-direction: row;
            justify-content: center; 
            align-items: center;
        }
        
        .content {
            background-color: #FFFFFF;
            color: #4d4d4d;
            max-width: 400px;
            padding: 20px;
            margin: auto;
        }
        
        .title {
            font-size: 20px;
            font-weight: 600;
            margin: 10px 0;
            text-align: center
        }
        
        .intro {
            font-size: 15px;
            align-self: flex-start;
            color: #4d4d4d;
            margin-bottom: 15px;
        }
        
        .main-body {
            font-size: 15px;
            color: #4d4d4d;
            margin-bottom: 15px;
        }
        
        .alt-body {
            width: 100%;
            display: flex;
            flex-direction: row !important;
            justify-content: center !important;
        }

        .alt-body>a {
            font-size: 17px;
            font-weight: 500;
            text-decoration: none;
            color: #FFFFFF;
            margin: auto;
            margin-bottom: 15px;
        }
        
        .cta-button {
            background-color: #525659;
            padding: 9px 100px;
            border: 2px solid #525659;
            border-radius: 35px;
            align-self: center;
        }

        .cta-button:hover {
            background-color: #000000;
            border: 2px solid #000000;
        }
        
        .sub-body {
            font-size: 15px;
            color: #4d4d4d;
            margin-bottom: 15px;
            margin-top: 0;
            align-self: flex-start;
        }

        .sub-body a {
            text-decoration: none;
            color: #4d4d4d;
            font-size: 15px;
        }

        .sub-body a:hover {
            text-decoration: none;
            color: #4d4d4d;
        }

        .outro {
            margin: 20px 0;
        }

        .outro > p {
            font-size: 15px;
            margin-top: 3px;
            margin-bottom: 3px;
        }

        .outro a {
            text-decoration: none;
            color: #4d4d4d;
            font-size: 15px;
            margin-top: 3px;
            margin-bottom: 3px;
        }

        .outro a:hover {
            text-decoration: none;
            color: #4d4d4d;
        }
    </style>
</head>
<body class="body">
    <div class="content">
        {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}

        <p class="title">Email Verification</p>

        <p class="intro">Hello there,</p>

        <p class="main-body">
            Simply click on the button to verify your cre8ive-mart email.
        </p>

        <div class="alt-body">
            <a href="{{ activate_url }}" class="cta-button">Verify Email</a>
        </div>
        
        <p class="sub-body">
            if you have any questions, please contact <a href="mailto:todoetester@gmail.com">todoetester@gmail.com</a>
        </p>

        <div class="outro">
            <p class="outro-greeting">Sincerely,</p>
            <p class="outro-main">cre8ive-mart</p>
            <a href="#" class="outro-website">cre8ivemart.com</a>
        </div>

        {% endblocktrans %}
    </div>
</body>
</html>
{% endautoescape %}

但我收到的电子邮件是这样的:

但我收到的电子邮件只是html代码

我只是收到了HTML表示,而不是已经应用了样式的组件。


请展示一下如何发送电子邮件。 - mon io
1
这是由Django allauth完成的,我只是覆盖了模板。 - Opeyemi Odedeyi
2个回答

3
随着django-rest-auth的更新,我们需要的代码就越来越少来实现OP想要的功能: Settings.py
REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 'users.serializer.PasswordResetSerializer'
}

Serializer.py

from rest_auth.serializers import PasswordResetSerializer

class PasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self):
        return {
            'subject_template_name': 'account/email/password_reset_key_subject.txt',
            'email_template_name': 'account/email/password_reset_key.txt',
            # 'html_email_template_name': 'account/password_reset_key.html',
        }

1
兄弟,HTML 表示现在可以工作了,但我注意到数据没有传递。我发现像密码重置链接、域名和站点名称这样的数据没有随电子邮件一起发送,这意味着用户最终无法重置密码。 - Opeyemi Odedeyi
1
模板表示法与上面的相同。但这里也有一个链接 https://stackoverflow.com/questions/60078367/resetting-password-of-user-django-rest-auth - Opeyemi Odedeyi

3

我看不到你使用的代码,但以下是我在django rest auth中使用的方法:

创建自定义密码重置序列化器。

from django.contrib.auth.forms import PasswordResetForm
from django.conf import settings
from django.utils.translation import gettext as _
from rest_framework import serializers

###### IMPORT YOUR USER MODEL ######
from .models import User


class PasswordResetSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password_reset_form_class = PasswordResetForm

    def validate_email(self, value):
        self.reset_form = self.password_reset_form_class(data=self.initial_data)

        if not self.reset_form.is_valid():
            raise serializers.ValidationError(_('Error'))

        ###### FILTER YOUR USER MODEL ######
        if not User.objects.filter(email=value).exists():

            raise serializers.ValidationError(_('Invalid e-mail address'))
        return value

    def save(self):
        request = self.context.get('request')
        opts = {
            'use_https': request.is_secure(),
            'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),

            ###### USE YOUR TEXT FILE ######
            'email_template_name': 'account/email/password_reset_key.html',
            'html_email_template_name': 'account/email/password_reset_key.html',
            'request': request,
        }
        self.reset_form.save(**opts)

将密码重置电子邮件模板设置为account/email/password_reset_key.html

然后在设置中,更新您的密码重置序列化器以指向自定义密码重置序列化器。

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': '<path to >password_serializer.PasswordResetSerializer'
}

如果这样做不起作用,您需要提供更多的上下文信息,以便我们确定为什么会将其发送为文本而不是HTML表示形式。


1
好的,它可以作为HTML表示工作,但数据没有随电子邮件发送。我注意到像密码重置链接、站点和域名这样的数据没有随表单一起发送到电子邮件中。 - Opeyemi Odedeyi
请注意,'email_template_name' 应该包含 .txt 而不是 .html - 您不应该定义相同的模板两次。 - Xen_mar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接