diff --git a/frontend/src/components/admin/domains/DNSDetail.vue b/frontend/src/components/admin/domains/DNSDetail.vue
index 0cb73e067..4f3334657 100644
--- a/frontend/src/components/admin/domains/DNSDetail.vue
+++ b/frontend/src/components/admin/domains/DNSDetail.vue
@@ -10,6 +10,13 @@
density="compact"
@click="showConfigHelp = true"
>
+
+ ({{ $gettext('Last check:') }}
+ {{ $date(domain.last_dns_check_execution) }})
+
MX records
diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py
index 180d412ab..0d01e25b6 100644
--- a/modoboa/admin/api/v2/serializers.py
+++ b/modoboa/admin/api/v2/serializers.py
@@ -63,6 +63,7 @@ class DomainSerializer(v1_serializers.DomainSerializer):
"opened_alarms_count",
"sent_messages",
"sent_messages_in_percent",
+ "last_dns_check_execution",
)
def __init__(self, *args, **kwargs):
diff --git a/modoboa/admin/jobs.py b/modoboa/admin/jobs.py
index f67d16e16..014a55a3c 100644
--- a/modoboa/admin/jobs.py
+++ b/modoboa/admin/jobs.py
@@ -72,6 +72,8 @@ def handle_mailbox_operations():
def launch_domain_dns_checks(domain_id: int):
domain = models.Domain.objects.get(id=domain_id)
DNSChecker().run(domain)
+ domain.last_dns_check_execution = timezone.now()
+ domain.save()
def handle_dns_checks():
diff --git a/modoboa/admin/migrations/0024_domain_last_dns_check_execution.py b/modoboa/admin/migrations/0024_domain_last_dns_check_execution.py
new file mode 100644
index 000000000..dd2e595ad
--- /dev/null
+++ b/modoboa/admin/migrations/0024_domain_last_dns_check_execution.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.11 on 2026-02-23 14:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("admin", "0023_auto_20240320_1037"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="domain",
+ name="last_dns_check_execution",
+ field=models.DateTimeField(blank=True, null=True),
+ ),
+ ]
diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py
index 3b0106bbd..98875272b 100644
--- a/modoboa/admin/models/domain.py
+++ b/modoboa/admin/models/domain.py
@@ -55,6 +55,7 @@ class Domain(mixins.MessageLimitMixin, AdminObject):
default=True,
help_text=gettext_lazy("Check to enable DNS checks for this domain"),
)
+ last_dns_check_execution = models.DateTimeField(null=True, blank=True)
transport = models.OneToOneField(
"transport.Transport", null=True, on_delete=models.SET_NULL
diff --git a/modoboa/admin/tests/test_mx.py b/modoboa/admin/tests/test_mx.py
index ddc563004..78511838d 100644
--- a/modoboa/admin/tests/test_mx.py
+++ b/modoboa/admin/tests/test_mx.py
@@ -242,7 +242,9 @@ class DNSBLTestCase(ModoTestCase):
worker = SimpleWorker([queue], connection=queue.connection)
worker.work(burst=True)
+ self.domain.refresh_from_db()
self.assertTrue(models.DNSBLResult.objects.filter(domain=self.domain).exists())
+ self.assertIsNot(self.domain.last_dns_check_execution, None)
self.assertFalse(
models.DNSBLResult.objects.filter(domain=self.domain3).exists()
)