Почему send_mail моего проекта django не работает должным образом?

Я создавал проект, в котором сайт будет автоматически отправлять электронные письма участникам, у которых последняя дата оплаты счета приходится на сегодня. Для этого я создал метод в классе модели Entry в моем проекте django. Я полностью настроил параметры smtp в project/settings.py . Письмо отправляется пользователю, но проблема в том, что каждый раз, когда пользователь обновляет страницу, письмо отправляется. Он отправляет письмо снова и снова. Я устал от этого, пожалуйста, подскажите мне решение этой проблемы.

здесь entries/models.py

здесь settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'mygmailaccount@gmail.com'
EMAIL_HOST_PASSWORD = "mygmailpassword"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
    

пожалуйста, скажите мне, каково решение этой проблемы.

В основном есть две проблемы с вашим текущим кодом:

  • Проблема: Строка, где вы устанавливаете is_email_sent = True, находится после возврата функции, поэтому она никогда не будет выполнена.

    Решение: Установите переменную перед возвратом функции. На самом деле, это должно произойти сразу после выполнения send_mail()

    .
        def send_email(self):
            ...
            if email_send == True and is_email_sent == False:
                ...
                if self.last_date == datetime.date.today():
                    send_mail(...) 
                    is_email_sent = True
            return True
    
  • Проблема: Переменная is_email_sent является локальной переменной, поэтому она будет существовать только в области видимости вашей функции и не будет сохраняться между запросами пользователя.

    Решение: Установите атрибут экземпляра модели и сохраните его в базе данных, так что он будет сохраняться между запросами пользователя.

        def send_email(self):
            ...
            if email_send == True and is_email_sent == False:
                ...
                if self.last_date == datetime.date.today():
                    send_mail(...) 
                    self.is_email_sent = True
                    self.save()
            return True
    

После отправки письма установите атрибут is_email_sent на self и затем сохраните объект, чтобы он был сохранен в БД

def send_email(self):
    ...
    self.is_email_sent = True
    self.save()
    return True
   
Вернуться на верх