diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index 56bde624a..95c5b8fec 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -757,6 +757,7 @@ class MailAccountHandler(LoggingMixin): not message.attachments and rule.consumption_scope == MailRule.ConsumptionScope.ATTACHMENTS_ONLY ): + self._record_processed_without_consumption(message, rule) return processed_elements self.log.debug( @@ -792,6 +793,25 @@ class MailAccountHandler(LoggingMixin): return processed_elements + def _record_processed_without_consumption( + self, + message: MailMessage, + rule: MailRule, + ) -> None: + ProcessedMail.objects.get_or_create( + rule=rule, + uid=message.uid, + folder=rule.folder, + uid_validity=self._current_uid_validity, + defaults={ + "subject": message.subject, + "received": make_aware(message.date) + if is_naive(message.date) + else message.date, + "status": "PROCESSED_WO_CONSUMPTION", + }, + ) + def filename_inclusion_matches( self, filter_attachment_filename_include: str | None, @@ -958,23 +978,7 @@ class MailAccountHandler(LoggingMixin): ) else: # No files to consume, just mark as processed if it wasn't by .eml processing - if not ProcessedMail.objects.filter( - rule=rule, - uid=message.uid, - folder=rule.folder, - uid_validity=self._current_uid_validity, - ).exists(): - ProcessedMail.objects.create( - rule=rule, - folder=rule.folder, - uid=message.uid, - uid_validity=self._current_uid_validity, - subject=message.subject, - received=make_aware(message.date) - if is_naive(message.date) - else message.date, - status="PROCESSED_WO_CONSUMPTION", - ) + self._record_processed_without_consumption(message, rule) return processed_attachments diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index ede27da86..b2b055582 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -566,16 +566,40 @@ class TestMail( self.assertEqual([m.uid for m in fetched], [target_uid]) def test_handle_empty_message(self) -> None: - message = namedtuple("MailMessage", []) + message = self.mailMocker.messageBuilder.create_message( + subject="No attachments here", + attachments=[], + ) - message.attachments = [] - rule = MailRule() + account = MailAccount.objects.create() + rule = MailRule.objects.create( + account=account, + consumption_scope=MailRule.ConsumptionScope.ATTACHMENTS_ONLY, + ) result = self.mail_account_handler._handle_message(message, rule) self.mailMocker._queue_consumption_tasks_mock.assert_not_called() self.assertEqual(result, 0) + processed = ProcessedMail.objects.get( + rule=rule, + uid=message.uid, + folder=rule.folder, + ) + self.assertEqual(processed.status, "PROCESSED_WO_CONSUMPTION") + + # Calling it again must not create a second row + self.mail_account_handler._handle_message(message, rule) + self.assertEqual( + ProcessedMail.objects.filter( + rule=rule, + uid=message.uid, + folder=rule.folder, + ).count(), + 1, + ) + def test_handle_unknown_mime_type(self) -> None: message = self.mailMocker.messageBuilder.create_message( attachments=[