try to optimaze mail read

This commit is contained in:
2026-04-25 11:31:56 +02:00
parent f6991f394d
commit 1175e6c75c
4 changed files with 839 additions and 16 deletions
+18 -4
View File
@@ -33,6 +33,8 @@ import socks
from dotenv import load_dotenv
from imapclient import IMAPClient
from src.mail.imap_fingerprint import get_fingerprint_for_provider, send_imap_id
load_dotenv()
# ──────────────────────────────────────────────────────────────
@@ -221,6 +223,8 @@ class ProxyIMAPClient(IMAPClient):
Accessibles via ``client.subjects``.
Utilisés par ``search_by_subjects()`` pour construire
automatiquement les critères IMAP SUBJECT.
fingerprint : ImapFingerprint, optional
IMAP 客户端指纹伪装(自动根据邮箱地址选择)。
"""
def __init__(
@@ -228,11 +232,12 @@ class ProxyIMAPClient(IMAPClient):
host: str,
proxy: ProxyConfig,
subjects: Optional[List[str]] = None,
fingerprint=None,
**kwargs,
):
self._proxy = proxy
# Sujets à rechercher, injectables depuis l'extérieur
self.subjects: List[str] = list(subjects) if subjects else []
self._fingerprint = fingerprint
super().__init__(host, **kwargs)
def _create_IMAP4(self):
@@ -382,9 +387,13 @@ class ProxyMailReader:
# ── Connexion ────────────────────────────────────────────
def _connect(self) -> ProxyIMAPClient:
def _connect(self, login_email: str = None) -> ProxyIMAPClient:
imap_server = get_imap_server(self.account.login)
last_exc: Optional[Exception] = None
fingerprint = None
if login_email:
fingerprint = get_fingerprint_for_provider(login_email)
for attempt in range(1, self.max_retries + 1):
logger.info(
@@ -397,11 +406,16 @@ class ProxyMailReader:
host=imap_server,
proxy=self.proxy,
subjects=self._subjects,
fingerprint=fingerprint,
use_uid=True,
ssl=True,
timeout=self.timeout,
)
client.login(self.account.login, self.account.password)
if fingerprint:
send_imap_id(client, fingerprint)
logger.info(
"[%s] Connecté (tentative %d). Sujets recherchés : %s",
self.account.login, attempt, self._subjects,
@@ -531,8 +545,8 @@ class ProxyMailReader:
]
all_results: List[MailResult] = []
seen_message_ids: set = set() # déduplication inter-dossiers
client = self._connect()
seen_message_ids: set = set()
client = self._connect(login_email=self.account.login)
try:
folders = self._list_folders(client)