From a784a642ee7807c8f5d6829de7a4e32489b91546 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 28 Aug 2026 16:07:41 -0700 Subject: [PATCH] Fixhancement: make imap port required, better error display (#13845) --- .../mail-account-edit-dialog.component.ts | 1 + src/paperless_mail/serialisers.py | 1 + src/paperless_mail/tests/test_api.py | 21 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src-ui/src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts index 2b99b6aa5..4ee0b6909 100644 --- a/src-ui/src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts +++ b/src-ui/src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts @@ -94,6 +94,7 @@ export class MailAccountEditDialogComponent extends EditDialogComponent this.testResultAlert.close(), 5000) + this.error = e.error }, }) } diff --git a/src/paperless_mail/serialisers.py b/src/paperless_mail/serialisers.py index 8a0772732..d78c220aa 100644 --- a/src/paperless_mail/serialisers.py +++ b/src/paperless_mail/serialisers.py @@ -27,6 +27,7 @@ class ObfuscatedPasswordField(serializers.CharField): class MailAccountSerializer(OwnedObjectSerializer): password = ObfuscatedPasswordField() + imap_port = serializers.IntegerField(required=True, allow_null=False) class Meta: model = MailAccount diff --git a/src/paperless_mail/tests/test_api.py b/src/paperless_mail/tests/test_api.py index 69d74a4ce..9374acedd 100644 --- a/src/paperless_mail/tests/test_api.py +++ b/src/paperless_mail/tests/test_api.py @@ -108,6 +108,27 @@ class TestAPIMailAccounts(DirectoriesMixin, APITestCase): self.assertEqual(returned_account1.imap_security, account1["imap_security"]) self.assertEqual(returned_account1.character_set, account1["character_set"]) + def test_create_mail_account_requires_imap_port(self) -> None: + account = { + "name": "Email1", + "username": "username1", + "password": "password1", + "imap_server": "server.example.com", + "imap_security": MailAccount.ImapSecurity.SSL, + "character_set": "UTF-8", + } + + for imap_port in (None, "missing"): + with self.subTest(imap_port=imap_port): + data = account.copy() + if imap_port is None: + data["imap_port"] = None + + response = self.client.post(self.ENDPOINT, data=data, format="json") + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn("imap_port", response.data) + def test_delete_mail_account(self) -> None: """ GIVEN: