Почему 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