Как я могу сделать условие проверки электронной почты перед отправкой электронной почты? - PullRequest
0 голосов
/ 03 февраля 2020

как я могу поставить условие, если электронное письмо не существует, не отправляйте это электронное письмо на мой собственный адрес электронной почты. Я пытаюсь сделать это здесь, когда добавляю (существует) метод, но я вижу, как будто это не работает.
в обоих случаях показывает мне успешное сообщение по электронной почте
как я могу это остановить?
если в моем коде есть ошибка, становится ошибка, которую я получу sh, чтобы получить совет для обработки этого извините, я ' я не владею английским языком sh

views.py

from .forms import SignUp, ResetPassword, EditForm
from website import settings
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.views import PasswordResetView, PasswordResetDoneView
from django.views.generic.edit import FormView
from django.urls import reverse_lazy
from django.core.mail import send_mail
from django.contrib.auth.models import User


class PasswordReset(PasswordResetView, FormView):
    template_name = 'account/password_reset_view.html'
    success_url = reverse_lazy('account:password_reset_done')
    email_template_name = 'account/reset_password_email.html'
    subject_template_name = 'account/password_reset_subject.txt'
    form_class = ResetPassword


class PasswordResetDone(PasswordResetDoneView):
    template_name = 'account/password_reset_done.html'

    # Reset Your Password By G-mail Account
    def send_mail(self, request, **kwargs):
        subject = "Complete the modification of the password form"
        message = "please check here"

        if request.method == "POST":
            user = User.objects.filter(email=str(request.POST['email']))
            if user.exists():
                recipient = str(request.POST.get(kwargs['Email']))
                if subject and message and recipient:
                    send_mail(subject=subject,
                              message=message,
                              from_email=settings.EMAIL_HOST,
                              auth_user=request.user.email,
                              auth_password=request.user.password,
                              recipient_list=[recipient],
                              fail_silently=False)
                return render(request, self.template_name)
            else:
                return redirect('account:password-reset')


def register(request):
    template_name = 'account/register.html'
    if request.method == 'POST':
        form = SignUp(request.POST)
        if form.is_valid():
            # save in database
            form.save()
            return redirect('account:login')
        return render(request, template_name, {'form': form})
    else:
        form = SignUp()
        return render(request, template_name, {'form': form})


@login_required
def view_profile(request):
    return render(request, 'account/profile.html', {'user': request.user})


@login_required
def edit_profile(request):
    template_name = 'account/edit_profile.html'
    if request.method == "POST":
        form = EditForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('account:view_profile')
        return render(request, template_name, {'form': form})
    else:
        form = EditForm()
        return render(request, template_name, {'form': form})

forms.py

from django.contrib.auth.forms import UserCreationForm, UserChangeForm, PasswordResetForm
from django import forms
from django.contrib.auth.models import User


class SignUp(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'password1', 'password2', 'email')

    def save(self, commit=True):
        user = super(SignUp, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        user.set_password(self.cleaned_data['password1'])
        # Save this session without saving in database
        if commit:
            user.save()
        return user


class ResetPassword(PasswordResetForm):
    email = forms.EmailField(required=True, widget=forms.TextInput(attrs={'placeholder': 'Type Email'}))

    class Meta:
        model = User
        fields = ('email',)


class EditForm(UserChangeForm):
    password = None

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

    def edit(self, fields):
        user = super(EditForm, self).save(commit=False)

        if user.commit:
            user.save()
        return user

settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# sending an email
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'medoabdin@gmail.com'
EMAIL_HOST_PASSWORD = 'medo_rko96'
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    overview = models.TextField(editable=True, help_text="This field is important to make the viewers know you and your experience")
    city = models.CharField(max_length=20)
    phone = models.IntegerField(default=0)
    logo = models.ImageField()

    def __str__(self):
        return self.user.username


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])


post_save.connect(receiver=create_profile, sender=User)

формат базы данных следующий

1 Ответ

0 голосов
/ 03 февраля 2020

пользователь Используйте try catch в своем методе send_mail и измените filter на get, например, в строке ниже

user = User.objects.get(email=str(request.POST['email']))

Метод Get попытается найти пользователя, если он не найден в БД тогда он вызовет user.DoesNotExist исключение, вы можете поймать его и делать все, что захотите.

Как: -

def send_mail(self, request, **kwargs):
    subject = "Complete the modification of the password form"
    message = "please check here"

    if request.method == "POST":
        try:
            user = User.objects.get(email=str(request.POST['email']))
            recipient = str(request.POST.get(kwargs['Email']))
            if user.is_active and subject and message and recipient:
                send_mail(subject=subject,
                          message=message,
                          from_email=settings.EMAIL_HOST,
                          auth_user=request.user.email,
                          auth_password=request.user.password,
                          recipient_list=[recipient],
                          fail_silently=False)
            return render(request, self.template_name)
        except user.DoesNotExist:
            return redirect('account:password-reset')
...