Fix campaign stuck on sending under async queue, and stop UUID ValidationError when SMTP2GO tests send "Headers Unavailable".
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
from django.tasks import task
|
|
from django.utils import timezone
|
|
|
|
from messaging.channels import dispatch_message
|
|
from messaging.models import Message
|
|
from messaging.services import contact_may_receive, refresh_campaign_status
|
|
|
|
|
|
@task
|
|
def send_campaign_message(message_id: str) -> None:
|
|
campaign = None
|
|
try:
|
|
message = Message.objects.select_related("contact", "campaign").get(
|
|
pk=message_id
|
|
)
|
|
except Message.DoesNotExist:
|
|
return
|
|
|
|
campaign = message.campaign
|
|
|
|
if not contact_may_receive(message.contact, message.channel):
|
|
message.status = Message.Status.SUPPRESSED
|
|
message.error = "Contact opted out or suppressed"
|
|
message.save(update_fields=["status", "error", "updated_at"])
|
|
refresh_campaign_status(campaign)
|
|
return
|
|
|
|
try:
|
|
result = dispatch_message(message)
|
|
message.status = Message.Status.SENT
|
|
message.provider = result.provider
|
|
message.provider_message_id = result.provider_id
|
|
message.sent_at = timezone.now()
|
|
message.error = ""
|
|
message.save(
|
|
update_fields=[
|
|
"status",
|
|
"provider",
|
|
"provider_message_id",
|
|
"sent_at",
|
|
"error",
|
|
"updated_at",
|
|
]
|
|
)
|
|
except Exception as exc: # noqa: BLE001 — persist provider failures
|
|
message.status = Message.Status.FAILED
|
|
message.error = str(exc)[:2000]
|
|
message.save(update_fields=["status", "error", "updated_at"])
|
|
refresh_campaign_status(campaign)
|
|
raise
|
|
|
|
refresh_campaign_status(campaign)
|