diff --git a/gregui/mailutils/confirm_guest.py b/gregui/mailutils/confirm_guest.py
index e2ff17b0b3449e586602e1cd2ee1e2f79bfe3b7b..77c4eb38974c3a02673f2a364b52d015f4f26f81 100644
--- a/gregui/mailutils/confirm_guest.py
+++ b/gregui/mailutils/confirm_guest.py
@@ -37,7 +37,7 @@ class ConfirmGuest:
             ),
             mail_to=mail_to,
         )
-        return async_task("django.core.mail.send_mail", **arguments)
+        return async_task("gregui.mailutils.protocol.log_and_send_mail", **arguments)
 
     def send_confirmation_mail_from_link(self, link: InvitationLink) -> Optional[str]:
         guest = link.invitation.role.person
diff --git a/gregui/mailutils/invite_guest.py b/gregui/mailutils/invite_guest.py
index e30d49cab87913f603858b4680925f383ca12dba..38bd20563eca20878d0dca7a0084d40d0807effe 100644
--- a/gregui/mailutils/invite_guest.py
+++ b/gregui/mailutils/invite_guest.py
@@ -9,6 +9,7 @@ from django_q.tasks import async_task
 
 from greg.models import InvitationLink, Sponsor
 from gregui.models import EmailTemplate
+from gregui.mailutils.protocol import log_and_send_mail
 
 logger = structlog.getLogger(__name__)
 
@@ -98,7 +99,7 @@ def try_send_registration_mail(
         }
     )
     try:
-        mail.send_mail(
+        log_and_send_mail(
             subject=template.get_subject(context),
             message=template.get_body(context),
             from_email=template.from_email or None,
diff --git a/gregui/mailutils/protocol.py b/gregui/mailutils/protocol.py
index 45dd3c2f8bd2c57d59d6caa910e59b46f09b3539..10c22f623ccb2eaf7d4bcb7a411c91e67b979b7c 100644
--- a/gregui/mailutils/protocol.py
+++ b/gregui/mailutils/protocol.py
@@ -1,7 +1,13 @@
 from typing import Protocol, Union
 
+import logging
+
+from django.core import mail
+
 from gregui.models import EmailTemplate
 
+logger = logging.getLogger(__name__)
+
 
 def prepare_arguments(
     template: EmailTemplate, context: dict[str, str], mail_to: str
@@ -15,6 +21,11 @@ def prepare_arguments(
     }
 
 
+def log_and_send_mail(**kwargs):
+    logger.info("Queueing email: %s", kwargs)
+    return mail.send_mail(**kwargs)
+
+
 class EmailSender(Protocol):
     def queue_mail(self, *args):
         pass
diff --git a/gregui/mailutils/role_ending.py b/gregui/mailutils/role_ending.py
index d457f9ce832a04c629d51e89320ff5dbc9456297..976b681535e2e059497f0e99f304ecde034d61da 100644
--- a/gregui/mailutils/role_ending.py
+++ b/gregui/mailutils/role_ending.py
@@ -26,4 +26,4 @@ class RolesEnding:
             context=Context({"num_roles": num_roles}),
             mail_to=mail_to,
         )
-        return async_task("django.core.mail.send_mail", **arguments)
+        return async_task("gregui.mailutils.protocol.log_and_send_mail", **arguments)
diff --git a/gregui/tests/conftest.py b/gregui/tests/conftest.py
index f36419c988a44e6929ee60af7171d4ac51a01cc7..271078920a189163547f3a16188f22ea81093a71 100644
--- a/gregui/tests/conftest.py
+++ b/gregui/tests/conftest.py
@@ -789,6 +789,16 @@ def invalid_email_template():
     return EmailTemplate.objects.get(pk=et.id)
 
 
+@pytest.fixture
+def role_ending_template():
+    et = EmailTemplate.objects.create(
+        template_key=EmailTemplate.EmailType.ROLE_END_REMINDER,
+        subject="role ending subject",
+        body="""{{num_roles}} roles ending.}}""",
+    )
+    return EmailTemplate.objects.get(id=et.id)
+
+
 @pytest.fixture
 def consent_type_foo() -> ConsentType:
     type_foo = ConsentType.objects.create(
diff --git a/gregui/tests/test_mailutils.py b/gregui/tests/test_mailutils.py
index 672f738cbba59a1404ff5c987f9ebf9bff27432b..1f4f88a7f376a54c480de93d2361f921400e3376 100644
--- a/gregui/tests/test_mailutils.py
+++ b/gregui/tests/test_mailutils.py
@@ -1,4 +1,7 @@
 from smtplib import SMTPRecipientsRefused
+
+import logging
+
 from django.conf import settings
 from django.core import mail
 from django.template.context import Context
@@ -8,6 +11,8 @@ from gregui.mailutils.confirm_guest import ConfirmGuest
 
 from gregui.mailutils.invite_guest import InviteGuest, try_send_registration_mail
 
+from gregui.mailutils.role_ending import RolesEnding
+
 
 @pytest.mark.django_db
 def test_registration_template(registration_template):
@@ -115,6 +120,29 @@ def test_confirmation_mail_from_link(invited_person, confirmation_template):
     assert isinstance(task_id, str)
 
 
+@pytest.mark.django_db
+def test_registration_mail_logging(registration_template, caplog):
+    mail.outbox = []
+    caplog.set_level(logging.INFO)
+    try_send_registration_mail(
+        guest_name="Guest Guesterson",
+        guest_mail="test@example.no",
+        sponsor_id=1,
+        sponsor_name="Foo",
+        token="secret-key",
+    )
+    assert "Queueing email: {" in caplog.text
+
+
+@pytest.mark.django_db
+def test_confirmation_mail_logging(confirmation_template, caplog):
+    mail.outbox = []
+    scg = ConfirmGuest()
+    caplog.set_level(logging.INFO)
+    scg.queue_mail(mail_to="test@example.no", guest_name="Foo", guest_person_id=123)
+    assert "Queueing email: {" in caplog.text
+
+
 @pytest.mark.django_db
 def test_try_send_registration_mail(
     registration_template, invalid_email_template, mocker, sponsor_foo
@@ -143,3 +171,12 @@ def test_try_send_registration_mail(
             "recipient_list": ["foo@example.org"],
         }
     )
+
+
+@pytest.mark.django_db
+def test_role_ending_mail_logging(role_ending_template, caplog):
+    mail.outbox = []
+    re = RolesEnding()
+    caplog.set_level(logging.INFO)
+    re.queue_mail(mail_to="test@test.no", num_roles=2)
+    assert "Queueing email: {" in caplog.text