Files
appointment_request/mail/mail_constants.py

103 lines
3.8 KiB
Python
Executable File

"""
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)