#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"),
Потребовалось так много времени, чтобы разобраться в этом, поскольку этого ответа не было ни в одной статье, которую я нашел.