O tomhle jsem taky přemýšlel, ale nepodařilo se mi to pak dál udělat tak, aby to fungovalo, jak potřebuju.
Ještě se trochu rozepíšu. Třeba někoho napadne elegantnější řešení.
Dělám wrapper pro zjednodušení práce s maily exchangelib knihovny. Mám tam metodu pro iteraci inbox složky, metoda přijímá základní údaje pro přihlášení do schránky (jméno, heslo, doménu, exchange server a certifikát). Ve skutečnosti se dá volat metoda i bez jakýchkoli argumentů - v tom případě se do metody dotáhnou údaje z config.ini souboru, který slouží k podobných účelům.
Tyto údaje se dál předají privátní metodě, které vytvoří objekt účtu a vrátí ho zpět. A nyní nastupuje dalších asi 20 parametrů pro pokročilé filtrování konkrétních mailů:
subject__exact: Union[list, str] = None,
subject__iexact: Union[list, str] = None,
subject__contains: Union[list, str] = None,
subject__icontains: Union[list, str] = None,
subject__startswith: Union[list, str] = None,
subject__istartswith: Union[list, str] = None,
subject__endswith: Union[list, str] = None,
subject__iendswith: Union[list, str] = None,
A to samé pro pár dalších nejčastějších údajů v mailu. Důvod, proč to tam tak dávám je, že chci, aby to PyCharm napovídal. Sám když takto připravuju ten wrapper, tak ta knihovna exchange je buď nějak špatně vnitřně dokumentovaná nebo nevím, ale musím jet podle dokumentace na webu, protože Pycharm mi tyhle pokročilé věci nenapovídá.
Původně jsem tohle zkoušel pár jinými způsoby, ale skončil jsem u tohoto otrockého způsobu, protože přechozí pokusy nefungovaly. Slovník jsem si předávat zkoušel, ale když jsem chtěl udělat něco na způsob:
lookups = {'subject__exact': 'nejaky_predmet123', 'sender__email_address__icontains': 'MUJmail@'}
all_mails = acount.inbox.all()
for lookup in lookups:
all_mails.filter(exec(f'{lookup}={lookups[lookup]}'))
Bohužel ani exec() ani eval() zřejmě neumí string převést na název parametru, takže mi to pořád házelo chybu. Skončilo to u dlouhého if bloku, kde postupně kontroluju, jestli je daný parametr zadán a pokud ano, pak to filteruju takto natvrdo:
if subject__exact is not None:
all_mails.filter(subject__exact=subject__exact)
Podobných metod pro zjedušejí práce s mailem tam je víc a každá má všechny tyhle pokročilé filtrovací parametry. Pak tam je právě ta hlavní, kam předám objekt konkrétní složky schránky, všechny tyto parametry, ta to vyfiltruje a předá objekt zpět. Poté se z objektu jen iterují vyfiltrované maily.
Je jasné, že to možná zbytečně složité, ale zatím jediné funkční řešení. Nemáte někdo nápad, jak to zjednodušit? Ještě jednou zopakuju, že je to opravdu jen wraper pro zjednodušení a chci, aby dostupné parametry byly napovídány.
Díky.