]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Only get or create a Correspondent if the email or attachment matches rule filters...
authorTrenton H <797416+stumpylog@users.noreply.github.com>
Thu, 26 Oct 2023 00:34:52 +0000 (17:34 -0700)
committerGitHub <noreply@github.com>
Thu, 26 Oct 2023 00:34:52 +0000 (00:34 +0000)
src/paperless_mail/mail.py

index 0157ea7739005b8db7a82ae8bd104cd952c7f88f..f3ebc35dfbed433824c77dfd219b896f18794c57 100644 (file)
@@ -8,6 +8,7 @@ import traceback
 from datetime import date
 from datetime import timedelta
 from fnmatch import fnmatch
+from typing import Optional
 from typing import Union
 
 import magic
@@ -21,6 +22,7 @@ from django.utils.timezone import is_naive
 from django.utils.timezone import make_aware
 from imap_tools import AND
 from imap_tools import NOT
+from imap_tools import MailAttachment
 from imap_tools import MailBox
 from imap_tools import MailboxFolderSelectError
 from imap_tools import MailBoxUnencrypted
@@ -422,14 +424,19 @@ class MailAccountHandler(LoggingMixin):
 
     logging_name = "paperless_mail"
 
-    def _correspondent_from_name(self, name):
+    def _correspondent_from_name(self, name: str) -> Optional[Correspondent]:
         try:
             return Correspondent.objects.get_or_create(name=name)[0]
         except DatabaseError as e:
             self.log.error(f"Error while retrieving correspondent {name}: {e}")
             return None
 
-    def _get_title(self, message, att, rule):
+    def _get_title(
+        self,
+        message: MailMessage,
+        att: MailAttachment,
+        rule: MailRule,
+    ) -> Optional[str]:
         if rule.assign_title_from == MailRule.TitleSource.FROM_SUBJECT:
             return message.subject
 
@@ -444,7 +451,11 @@ class MailAccountHandler(LoggingMixin):
                 "Unknown title selector.",
             )  # pragma: nocover
 
-    def _get_correspondent(self, message: MailMessage, rule):
+    def _get_correspondent(
+        self,
+        message: MailMessage,
+        rule: MailRule,
+    ) -> Optional[Correspondent]:
         c_from = rule.assign_correspondent_from
 
         if c_from == MailRule.CorrespondentSource.FROM_NOTHING:
@@ -606,7 +617,6 @@ class MailAccountHandler(LoggingMixin):
             f"{len(message.attachments)} attachment(s)",
         )
 
-        correspondent = self._get_correspondent(message, rule)
         tag_ids = [tag.id for tag in rule.assign_tags.all()]
         doc_type = rule.assign_document_type
 
@@ -617,7 +627,6 @@ class MailAccountHandler(LoggingMixin):
             processed_elements += self._process_eml(
                 message,
                 rule,
-                correspondent,
                 tag_ids,
                 doc_type,
             )
@@ -629,7 +638,6 @@ class MailAccountHandler(LoggingMixin):
             processed_elements += self._process_attachments(
                 message,
                 rule,
-                correspondent,
                 tag_ids,
                 doc_type,
             )
@@ -640,7 +648,6 @@ class MailAccountHandler(LoggingMixin):
         self,
         message: MailMessage,
         rule: MailRule,
-        correspondent,
         tag_ids,
         doc_type,
     ):
@@ -669,6 +676,8 @@ class MailAccountHandler(LoggingMixin):
                 # as this is system dependent otherwise
                 continue
 
+            correspondent = self._get_correspondent(message, rule)
+
             title = self._get_title(message, att, rule)
 
             # don't trust the content type of the attachment. Could be
@@ -750,7 +759,6 @@ class MailAccountHandler(LoggingMixin):
         self,
         message: MailMessage,
         rule: MailRule,
-        correspondent,
         tag_ids,
         doc_type,
     ):
@@ -781,6 +789,8 @@ class MailAccountHandler(LoggingMixin):
 
             f.write(message.obj.as_bytes())
 
+        correspondent = self._get_correspondent(message, rule)
+
         self.log.info(
             f"Rule {rule}: "
             f"Consuming eml from mail "