Настройка параметров электронной почты в PasswordResetView django

#django #email

#django #Адрес электронной почты

Вопрос:

Я нашел учебник о том, как включить имя пользователя при сбросе пароля, используя этот учебник. Мой вопрос в том, как настроить функцию отправки электронной почты в PasswordResetView? У меня уже есть своя собственная настраиваемая функция отправки электронной почты, но я не знаю, как ее подключить. Другое дело, что при отправке электронной почты часть FROM не использует хост, который я настраиваю в своем settings.py

ОБНОВЛЕНИЕ: я добавил эту функцию send_email здесь, в моей форме. Как мне вызвать это с моей точки зрения?

setings.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)
 

введите описание изображения здесь

Ответ №1:

Я понял.

Сначала удалите def send_mail функцию моей формы class MyPasswordResetForm(PasswordResetForm): , поскольку она не нужна (в моем случае).

Затем сделайте это по 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"),
 

Потребовалось так много времени, чтобы разобраться в этом, поскольку этого ответа не было ни в одной статье, которую я нашел.