diff --git a/src/openforms/emails/constants.py b/src/openforms/emails/constants.py index 6db2a3cbb2..b61025ed71 100644 --- a/src/openforms/emails/constants.py +++ b/src/openforms/emails/constants.py @@ -9,8 +9,8 @@ class EmailEventChoices(models.TextChoices): registration = "registration", _("Registration") confirmation = "confirmation", _("Confirmation") - cosign_confirmation = "cosign_confirmation", _("Co-sign confirmation") + cosign_request = "cosign_request", _("Co-sign request") class EmailContentTypeChoices(models.TextChoices): - submission = "submission.submission", _("Submission") + submission = "submissions.Submission", _("Submission") diff --git a/src/openforms/submissions/tasks/emails.py b/src/openforms/submissions/tasks/emails.py index 4fb4665392..5e9bfbc812 100644 --- a/src/openforms/submissions/tasks/emails.py +++ b/src/openforms/submissions/tasks/emails.py @@ -10,6 +10,13 @@ from openforms.celery import app from openforms.config.models import GlobalConfiguration +from openforms.emails.constants import ( + X_OF_CONTENT_TYPE_HEADER, + X_OF_CONTENT_UUID_HEADER, + X_OF_EVENT_HEADER, + EmailContentTypeChoices, + EmailEventChoices, +) from openforms.emails.utils import send_mail_html from openforms.frontend import get_frontend_redirect_url from openforms.logging import logevent @@ -133,6 +140,12 @@ def send_email_cosigner(submission_id: int) -> None: from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=[recipient], text_message=content, + extra_headers={ + "Content-Language": submission.language_code, + X_OF_CONTENT_TYPE_HEADER: EmailContentTypeChoices.submission, + X_OF_CONTENT_UUID_HEADER: str(submission.uuid), + X_OF_EVENT_HEADER: EmailEventChoices.cosign_request, + }, ) except Exception: logevent.cosigner_email_queuing_failure(submission) diff --git a/src/openforms/submissions/tests/test_task_co_sign.py b/src/openforms/submissions/tests/test_task_co_sign.py index c7e81c0e13..a76ac10f8c 100644 --- a/src/openforms/submissions/tests/test_task_co_sign.py +++ b/src/openforms/submissions/tests/test_task_co_sign.py @@ -4,6 +4,7 @@ from django.test import TestCase from openforms.config.models import GlobalConfiguration +from openforms.emails.constants import EmailContentTypeChoices, EmailEventChoices from openforms.logging.models import TimelineLogProxy from ..tasks import send_email_cosigner @@ -175,3 +176,34 @@ def test_form_link_not_allowed_in_email(self): self.assertNotIn(form_link, email.body) self.assertIn(submission.public_registration_reference, email.body) + + def test_headers_in_cosign_request_email(self): + submission = SubmissionFactory.from_components( + components_list=[ + { + "key": "cosign", + "type": "cosign", + "label": "Cosign component", + }, + ], + submitted_data={"cosign": "test@test.nl"}, + form_url="http://testserver/myform/", + ) + send_email_cosigner(submission.id) + + self.assertEqual(len(mail.outbox), 1) + message = mail.outbox[0] + + # UUID is not a constant, so just test if it exists + submission_uuid = message.extra_headers.pop("X-OF-Content-UUID", None) + self.assertIsNotNone(submission_uuid) + + # Test remaining headers + self.assertEqual( + message.extra_headers, + { + "Content-Language": "nl", + "X-OF-Content-Type": EmailContentTypeChoices.submission, + "X-OF-Event": EmailEventChoices.cosign_request, + }, + ) diff --git a/src/openforms/submissions/tests/test_tasks_confirmation_emails.py b/src/openforms/submissions/tests/test_tasks_confirmation_emails.py index 2194501216..52256d918e 100644 --- a/src/openforms/submissions/tests/test_tasks_confirmation_emails.py +++ b/src/openforms/submissions/tests/test_tasks_confirmation_emails.py @@ -11,6 +11,7 @@ from privates.test import temp_private_root from openforms.config.models import GlobalConfiguration +from openforms.emails.constants import EmailContentTypeChoices, EmailEventChoices from openforms.emails.models import ConfirmationEmailTemplate from openforms.emails.tests.factories import ConfirmationEmailTemplateFactory from openforms.forms.tests.factories import FormStepFactory @@ -641,6 +642,37 @@ def test_template_is_rendered_in_submission_language(self): self.assertIn("Translated Radio option 1", html_message) self.assertIn("Translated Select option 2", html_message) + def test_headers_present_in_confirmation_email(self): + submission = SubmissionFactory.from_components( + completed=True, + components_list=[ + { + "key": "email", + "confirmationRecipient": True, + }, + ], + submitted_data={"email": "test@test.nl"}, + ) + with override_settings(CELERY_TASK_ALWAYS_EAGER=True): + send_confirmation_email(submission.id) + + self.assertEqual(len(mail.outbox), 1) + message = mail.outbox[0] + + # UUID is not a constant, so just test if it exists + submission_uuid = message.extra_headers.pop("X-OF-Content-UUID", None) + self.assertIsNotNone(submission_uuid) + + # Test remaining headers + self.assertEqual( + message.extra_headers, + { + "Content-Language": "nl", + "X-OF-Content-Type": EmailContentTypeChoices.submission, + "X-OF-Event": EmailEventChoices.confirmation, + }, + ) + class RaceConditionTests(TransactionTestCase): @patch("openforms.submissions.tasks.emails._send_confirmation_email") diff --git a/src/openforms/submissions/utils.py b/src/openforms/submissions/utils.py index 762b5f036a..faba1b0a67 100644 --- a/src/openforms/submissions/utils.py +++ b/src/openforms/submissions/utils.py @@ -19,6 +19,13 @@ get_confirmation_email_context_data, get_confirmation_email_templates, ) +from openforms.emails.constants import ( + X_OF_CONTENT_TYPE_HEADER, + X_OF_CONTENT_UUID_HEADER, + X_OF_EVENT_HEADER, + EmailContentTypeChoices, + EmailEventChoices, +) from openforms.emails.utils import ( render_email_template, send_mail_html, @@ -204,6 +211,12 @@ def send_confirmation_email(submission: Submission) -> None: cc=cc_emails, text_message=text_content, theme=submission.form.theme, + extra_headers={ + "Content-Language": submission.language_code, + X_OF_CONTENT_TYPE_HEADER: EmailContentTypeChoices.submission, + X_OF_CONTENT_UUID_HEADER: str(submission.uuid), + X_OF_EVENT_HEADER: EmailEventChoices.confirmation, + }, ) except Exception as e: logevent.confirmation_email_failure(submission, e)