improvement while reading mails
This commit is contained in:
+87
-117
@@ -1,132 +1,102 @@
|
||||
"""
|
||||
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
|
||||
|
||||
# 邮件域名常量
|
||||
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"
|
||||
# ── 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"
|
||||
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"
|
||||
|
||||
# IMAP服务器地址常量
|
||||
AOL_IMAP_SERVER = "imap.aol.com"
|
||||
IMAP_SERVER_163 = "imap.163.com"
|
||||
IMAP_SERVER_SINA = "imap.sina.com"
|
||||
YAHOO_IMAP_SERVER = "imap.mail.yahoo.com"
|
||||
HOTMAIL_IMAP_SERVER = "outlook.office365.com"
|
||||
# ── 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.
|
||||
|
||||
RAMBLER_IMAP_SERVER = "imap.rambler.ru"
|
||||
ALICE_IMAP_SERVER = "in.alice.it"
|
||||
TIME_IT_SERVER = "imap.tim.it"
|
||||
MARS_DTI_NE_JP_SERVER = "imap.cm.dream.jp"
|
||||
NAVER_SERVER = "imap.naver.com"
|
||||
BTVM_NE_JP_SERVER = "imap.btvm.ne.jp"
|
||||
GMAIL_IMAP_SERVER = "imap.gmail.com"
|
||||
ONET_IMAP_SERVER = "imap.poczta.onet.pl"
|
||||
GMX_IMAP_SERVER = "imap.gmx.com"
|
||||
GMX_NET_IMAP_SERVER = "imap.gmx.net"
|
||||
GMX_AT_IMAP_SERVER = "imap.gmx.at"
|
||||
FIREMAIL_DE_IMAP_SERVER = "imap.firemail.de"
|
||||
PISS_MAIL_IMAP_SERVER = "mail.pissmail.com"
|
||||
INBOX_LV_IMAP_SERVER = "mail.inbox.lv"
|
||||
WEB_DE_IMAP_SERVER = "imap.web.de"
|
||||
GAZETA_PL_IMAP_SERVER = "imap.gazeta.pl"
|
||||
|
||||
# ── 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 = []
|
||||
isImapClient = isinstance(imap, IMAPClient)
|
||||
if not isImapClient:
|
||||
is_imap_client = isinstance(imap, IMAPClient)
|
||||
if not is_imap_client:
|
||||
for i in imap.list()[1]:
|
||||
l = i.decode().split(' "/" ')
|
||||
if len(l) > 1:
|
||||
folders.append(l[1])
|
||||
if len(folders) == 0:
|
||||
folders.append('INBOX')
|
||||
return folders
|
||||
parts = i.decode().split(' "/" ')
|
||||
if len(parts) > 1:
|
||||
folders.append(parts[1])
|
||||
if not folders:
|
||||
folders.append("INBOX")
|
||||
else:
|
||||
list = imap.list_folders()
|
||||
for i in list:
|
||||
name = i[-1]
|
||||
folders.append(name)
|
||||
return folders
|
||||
for info in imap.list_folders():
|
||||
folders.append(info[-1])
|
||||
return folders
|
||||
|
||||
|
||||
def create_imap(login: str):
|
||||
# 创建一个IMAP4类实例
|
||||
if DOMAIN_163 in login:
|
||||
imap = IMAPClient(IMAP_SERVER_163, use_uid=True)
|
||||
elif DOMAIN_YAHOO in login:
|
||||
imap = IMAPClient(YAHOO_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_FIREMAIL_DE in login:
|
||||
imap = IMAPClient(FIREMAIL_DE_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_GMX in login or DOMAIN_GMX_FR in login or DOMAIN_GMX_US in login or DOMAIN_GMX_CH in login or DOMAIN_GMX_PT in login or DOMAIN_GMX_SG in login:
|
||||
imap = IMAPClient(GMX_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_SINA in login:
|
||||
imap = IMAPClient(IMAP_SERVER_SINA, use_uid=True)
|
||||
elif DOMAIN_HOTMAIL in login or DOMAIN_OUTLOOK_COM in login:
|
||||
imap = IMAPClient(HOTMAIL_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_RAMBLER_RU in login:
|
||||
imap = IMAPClient(RAMBLER_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_BTVM_NE_JP in login:
|
||||
imap = IMAPClient(BTVM_NE_JP_SERVER, use_uid=True)
|
||||
elif DOMAIN_GMAIL in login:
|
||||
imap = IMAPClient(GMAIL_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_ONET in login:
|
||||
imap = IMAPClient(ONET_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_TIM_IT in login:
|
||||
imap = IMAPClient(TIME_IT_SERVER, use_uid=True)
|
||||
elif DOMAIN_ALICE_IT in login:
|
||||
imap = IMAPClient(ALICE_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_MARS_DTI_NE_JP in login:
|
||||
imap = IMAPClient(MARS_DTI_NE_JP_SERVER, use_uid=True)
|
||||
elif DOMAIN_AURORA_DTI_NE_JP in login:
|
||||
imap = IMAPClient(MARS_DTI_NE_JP_SERVER, use_uid=True)
|
||||
elif DOMAIN_NAVER in login:
|
||||
imap = IMAPClient(NAVER_SERVER, use_uid=True)
|
||||
elif DOMAIN_GMX_DE in login or DOMAIN_GMX_NET in login:
|
||||
imap = IMAPClient(GMX_NET_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_GMX_AT in login:
|
||||
imap = IMAPClient(GMX_AT_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_GAZETA_PL in login:
|
||||
imap = IMAPClient(GAZETA_PL_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_INBOX_LV in login:
|
||||
imap = IMAPClient(INBOX_LV_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_WEB_DE in login:
|
||||
imap = IMAPClient(WEB_DE_IMAP_SERVER, use_uid=True)
|
||||
elif DOMAIN_PISS_MAIL in login or DOMAIN_CHILD_PIZZA in login or DOMAIN_DMC_CHAT in login or DOMAIN_GENOCIDE_FUN in login or DOMAIN_HATESJE_WS in login or DOMAIN_INCEL_EMAIL in login or DOMAIN_SHITPOSTING_EXPERT in login:
|
||||
imap = IMAPClient(PISS_MAIL_IMAP_SERVER, use_uid=True)
|
||||
else:
|
||||
imap = IMAPClient(AOL_IMAP_SERVER, use_uid=True)
|
||||
return imap
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user