Как сделать рассылку email в Django?

мне нужно реализовать рассылку на почту подписчиков на категории Постов, если новый пост появился в данной категории. Вот такие модели у меня есть:

class Category(models.Model):
    name = models.CharField(unique=True, null=False, max_length=255)
    subscribers = models.ManyToManyField(User)

class Post(models.Model):
    author = models.OneToOneField(Author, on_delete=models.CASCADE, null=True)
    choice = models.CharField(max_length=255)
    post_date = models.DateTimeField()
    heading = models.CharField(null=False, max_length=255)
    text = models.CharField(max_length=255)
    post_rating = models.FloatField()
    category = models.ManyToManyField(Category, through='PostCategory'

А это функция, которая должна отвечать за рассылку (из файла views.py):

def mass_sender(request):
    if request.user in Category.subscribers.all():
        send_mail(
            subject=f'Hi {request.user}, we have some news for you!',
            message=f'{Post.all()[-1].text}',
            from_email='azizauauau@yandex.ru',
            recipient_list=['imfyashya@gmail.com']
    

Вопрос: как заставить эту функцию отправлять письма при добавлении новой категории?

Используйте сигналы Django, а конкретно post_save для Post.

  1. В папке приложения (не путать с папкой проекта) создайте файл signals.py

  2. Добавьте метод ready в файл apps.py:

     def ready(self):
         from . import signals
    

В signals.py отредактируйте и добавьте:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Post
@receiver(post_save, sender=Post,)
def func_name(sender, instance, created, **kwargs):
    if [условие]:
        [код для отправки]

Где [условие] - ваше условие при котором должна произойти отправка, а [код для отправки] - код который отправит email.

Для формирования условия - получите категорию для поста, получите подписчиков, отправьте каждому в цикле сообщение.

p.s Каждый раз,при создании нового Post будет срабатывать сигнал, проверять ваше условие и выполнять код внутри него. В вашем случае отправлять почту.

Вернуться на верх