from django.db.models import F from django.utils import timezone import logging from apps.emails.models import Email, EmailQueue from main import celery_app from utils.clients import gotify logger = logging.getLogger(__name__) @celery_app.task def send_email(email_uuid): from .models import Email email = Email.objects.get(uuid=email_uuid) email._send_email() email.state = email.StateChoices.DONE email.save() @celery_app.task def send_email_for_queued_events(): logger.info('Sending email for queued events') for email_queue in EmailQueue.objects.all(): logger.info('Sending email for queue %s', email_queue.title) qs = Email.objects.filter(queue=email_queue, stats=Email.StateChoices.INIT, created_at__gte=F('queue__last_sent')) if email_queue.last_sent <= timezone.now() - timezone.timedelta(minutes=10) and qs.exists(): logger.info('Sending email for queue %s', email_queue.title) from django.core.mail import send_mail from django.conf import settings title = 'you have some queued task(s)' message = f"you have {qs.count()} queued task(s) \n" for index, email in enumerate(qs, start=1): message += f"{index} - {email.title} \n" send_mail( title, message, settings.EMAIL_HOST_USER, ["xdshia49@gmail.com"], fail_silently=True, ) email_queue.last_sent = timezone.now() email_queue.save() celery_app.conf.beat_schedule = { 'print-every-minute': { 'task': 'apps.emails.tasks.send_email_for_queued_events', 'schedule': 10.0, # هر 60 ثانیه # یا می‌توانید از crontab استفاده کنید: # 'schedule': crontab(minute='*/1'), }, }