【问题标题】:Customize email setting in PasswordResetView django在 PasswordResetView django 中自定义电子邮件设置
【发布时间】:2021-02-27 05:08:57
【问题描述】:

我找到了一个关于如何在使用 tutorial. 重置密码时包含用户名的教程 我的问题是如何在 PasswordResetView 中自定义电子邮件发送功能?我已经有自己的自定义电子邮件发送功能,但我不知道如何连接它。另一件事是,发送电子邮件时,FROM 部分没有使用我在 settings.py 中设置的主机

更新:我在表单中添加了这个 send_email 功能。从我的角度来看,我该如何触发?

settings.py:

EMAIL_HOST = 'smtp.mailtrap.io'
EMAIL_HOST_USER = 'xxxxxxx'
EMAIL_HOST_PASSWORD = 'xxxxxxxx'
EMAIL_PORT = '2525'

我如何发送电子邮件:

def SendEmail(mail_subject, mail_message, mail_to):

    context = {}

    try:
        send_mail(mail_subject, mail_message, settings.EMAIL_HOST_USER, [mail_to], html_message=mail_message, fail_silently=False)
        return HttpResponse("SUCCESS")

    except BadHeaderError:
        context['message'] = "Email has encountered some problems."
        return HttpResponse("SUCCESS")

forms.py:

class MyPasswordResetForm(PasswordResetForm):
    username = forms.CharField(max_length=254)
    field_order = ['username', 'email']

    def __init__(self, *args, **kwargs):
        super(MyPasswordResetForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs = {'class': 'user-input-form'}


    def send_mail(self, subject_template_name, email_template_name,
                context, from_email, to_email, html_email_template_name=None):

        print(from_email)
        print(to_email)
        """
        Send a django.core.mail.EmailMultiAlternatives to `to_email`.
        """
        subject = loader.render_to_string(subject_template_name, context)
        # Email subject *must not* contain newlines
        subject = ''.join(subject.splitlines())
        body = loader.render_to_string(email_template_name, context)

        email_message = EmailMultiAlternatives(subject, body, from_email, [to_email])
        if html_email_template_name is not None:
            html_email = loader.render_to_string(html_email_template_name, context)
            email_message.attach_alternative(html_email, 'text/html')

        email_message.send()

views.py

class MyPasswordResetView(PasswordResetView):
    form_class = MyPasswordResetForm

    def form_valid(self, form):


        username = form.cleaned_data.get('username')
        email = form.cleaned_data.get('email', '').lower()
        try:
            user = get_user_model().objects.get(username=username, email=email)
        except(get_user_model().DoesNotExist):
            user = None
        if user is None:
            return redirect('password_reset_done')
        return super().form_valid(form)

【问题讨论】:

    标签: django email


    【解决方案1】:

    我明白了。

    首先删除我的表单class MyPasswordResetForm(PasswordResetForm):def send_mail 函数,因为它不需要(在我的情况下)。

    接下来在 url 上执行此操作:

    path('reset_password/', views.MyPasswordResetView.as_view(
        template_name="../templates/logauth/reset_password.html",                # ADD THIS
        subject_template_name='../templates/logauth/password_reset_subject.txt', # ADD THIS
        email_template_name='../templates/logauth/password_reset_email.html',    # ADD THIS
        from_email=settings.EMAIL_HOST_USER,),                                   # ADD THIS
        name="reset_password"),
    

    花了很长时间才弄明白,因为我找到的任何文章都没有这个答案。

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      相关资源
      最近更新 更多