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(): 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(hours=1) and qs.exists(): from django.core.mail import send_mail from django.conf import settings send_mail( "you have some queued task(s)", f"you have {qs.count()} queued task(s)", settings.EMAIL_HOST_USER, ["xdshia49@gmail.com"], fail_silently=False, ) 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'), }, }