103 lines
3.8 KiB
Python
Executable File
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)
|