""" mail_constants.py ================= Constantes de domaine email et fabrique d'instances IMAPClient. Architecture mail/ : imap_proxy_reader ← bibliothèque de bas niveau (proxy, IMAP ID, extract_body, server map) mail_constants ← cette couche : FingerprintIMAPClient + create_imap() pour les comptes directs mail_reader_all_contacts ← logique métier haut niveau (MailReader, find_links_to_validate_…) """ import imaplib from imapclient import IMAPClient from mail.imap_proxy_reader import send_imap_id, get_imap_server # ── Constantes de domaine (conservées pour la compatibilité des imports externes) ── DOMAIN_YAHOO = "yahoo.com" DOMAIN_SINA = "sina.com" DOMAIN_HOTMAIL = "hotmail.com" DOMAIN_TIM_IT = "tim.it" DOMAIN_163 = "163.com" DOMAIN_RAMBLER_RU = "rambler.ru" DOMAIN_ALICE_IT = "alice.it" DOMAIN_MARS_DTI_NE_JP = "mars.dti.ne.jp" DOMAIN_BTVM_NE_JP = "btvm.ne.jp" DOMAIN_AURORA_DTI_NE_JP = "aurora.dti.ne.jp" DOMAIN_GMAIL = "gmail.com" DOMAIN_GMX = "gmx.com" DOMAIN_GMX_NET = "gmx.net" DOMAIN_GMX_AT = "gmx.at" DOMAIN_GMX_FR = "gmx.fr" DOMAIN_GMX_US = "gmx.us" DOMAIN_GMX_SG = "gmx.sg" DOMAIN_GMX_CH = "gmx.ch" DOMAIN_GMX_PT = "gmx.pt" DOMAIN_ONET = "onet.pl" DOMAIN_GAZETA_PL = "gazeta.pl" DOMAIN_NAVER = "naver.com" DOMAIN_INBOX_LV = "inbox.lv" DOMAIN_GMX_DE = "gmx.de" DOMAIN_PISS_MAIL = "pissmail.com" DOMAIN_INCEL_EMAIL = "incel.email" DOMAIN_SHITPOSTING_EXPERT = "shitposting.expert" DOMAIN_HATESJE_WS = "hatesje.ws" DOMAIN_CHILD_PIZZA = "child.pizza" DOMAIN_GENOCIDE_FUN = "genocide.fun" DOMAIN_DMC_CHAT = "dmc.chat" DOMAIN_WEB_DE = "web.de" DOMAIN_OUTLOOK_COM = "outlook.com" DOMAIN_FIREMAIL_DE = "firemail.de" # ── Note : les constantes IMAP_SERVER_* ont été supprimées. ─────────────────── # Utiliser imap_proxy_reader.IMAP_SERVER_MAP ou imap_proxy_reader.get_imap_server(login) # pour obtenir le serveur IMAP correspondant à un domaine. # ── IMAPClient avec IMAP ID spoofing ───────────────────────────────────────── class FingerprintIMAPClient(IMAPClient): """ IMAPClient qui envoie automatiquement la commande IMAP ID (RFC 2971) après chaque login(), pour usurper le fingerprint d'un vrai client mail. """ def login(self, username: str, password: str): result = super().login(username, password) send_imap_id(self) return result # ── Fabrique d'instances IMAPClient ────────────────────────────────────────── def show_folders(imap) -> list: """Retourne la liste des dossiers IMAP (compatible IMAPClient et imaplib).""" folders = [] is_imap_client = isinstance(imap, IMAPClient) if not is_imap_client: for i in imap.list()[1]: parts = i.decode().split(' "/" ') if len(parts) > 1: folders.append(parts[1]) if not folders: folders.append("INBOX") else: for info in imap.list_folders(): folders.append(info[-1]) return folders def create_imap(login: str) -> FingerprintIMAPClient: """ Crée et retourne un FingerprintIMAPClient connecté au bon serveur IMAP pour le domaine de l'adresse email fournie. La résolution domaine → serveur est déléguée à get_imap_server() (défini dans imap_proxy_reader, source de vérité unique). """ server = get_imap_server(login) return FingerprintIMAPClient(server, use_uid=True)