""" ======================================================================= Název: download_first_inbox_eml_v1.0.py Verze: 1.0 Datum: 2026-06-03 Popis: Pokusný skript: otevře Outlook OWA, přejde do Inboxu, klikne na první zprávu a stáhne ji jako .eml přes menu "More email actions" → Download → Download as EML. Používá persistent profil z outlook_login_v1.0.py. ======================================================================= """ from pathlib import Path from playwright.sync_api import sync_playwright BASE_DIR = Path(__file__).resolve().parent PROFILE_DIR = BASE_DIR / "outlook_profile" OUT_DIR = BASE_DIR / "downloads" START_URL = "https://outlook.cloud.microsoft/mail/" def main() -> None: if not PROFILE_DIR.exists(): print(f" Profil nenalezen: {PROFILE_DIR}") print(" Nejprve spusť outlook_login_v1.0.py.") return OUT_DIR.mkdir(exist_ok=True) with sync_playwright() as p: context = p.chromium.launch_persistent_context( user_data_dir=str(PROFILE_DIR), headless=False, no_viewport=True, accept_downloads=True, args=[ "--disable-blink-features=AutomationControlled", "--start-maximized", ], ) page = context.pages[0] if context.pages else context.new_page() # 1) Otevřít Outlook print(" 1/6 Otevírám Outlook...") page.goto(START_URL) page.wait_for_load_state("domcontentloaded") search_selector = ( '[placeholder*="Search"], [aria-label*="Search"], ' '[placeholder*="Hledat"], [aria-label*="Hledat"]' ) page.wait_for_selector(search_selector, timeout=30_000) # 2) Inbox / Doručená pošta print(" 2/6 Otevírám Inbox...") inbox_candidates = [ 'div[role="treeitem"]:has-text("Inbox")', 'div[role="treeitem"]:has-text("Doručená pošta")', 'text=Inbox', 'text=Doručená pošta', ] for sel in inbox_candidates: loc = page.locator(sel).first if loc.count() and loc.is_visible(): loc.click() break page.wait_for_selector('div[role="option"]', timeout=15_000) page.wait_for_timeout(1000) # 3) První zpráva v inboxu print(" 3/4 Vybírám první zprávu...") first_msg = page.locator('div[role="option"]').first first_msg.click() page.wait_for_timeout(1000) # 4) PRAVÝ KLIK na řádek zprávy → kontextové menu patří CELÉ zprávě # (ne příloze). Na "Download" najet hoverem (otevře submenu), pak # kliknout na "Download as EML". print(" 4/4 Pravý klik → Download → Download as EML...") first_msg.click(button="right") page.wait_for_timeout(700) download_parent = None for name in ("Download", "Stáhnout"): loc = page.get_by_role("menuitem", name=name).first if loc.count() and loc.is_visible(): download_parent = loc break if download_parent is None: items = page.get_by_role("menuitem").all() print(" ! Download položka v menu nenalezena. Obsah menu:") for it in items: try: txt = it.inner_text(timeout=500).strip().replace("\n", " | ") print(f" - {txt[:100]}") except Exception: pass page.screenshot(path=str(OUT_DIR / "debug_menu.png")) print(f" screenshot: {OUT_DIR / 'debug_menu.png'}") input(" Enter pro zavření... ") context.close() return download_parent.hover() page.wait_for_timeout(600) eml_item = None for name in ("Download as EML", "Stáhnout jako EML", "Stáhnout jako .eml"): loc = page.get_by_role("menuitem", name=name).first if loc.count() and loc.is_visible(): eml_item = loc break try: if eml_item is not None: with page.expect_download(timeout=15_000) as download_info: eml_item.click() else: # některé buildy OWA stahují EML přímo bez submenu with page.expect_download(timeout=15_000) as download_info: download_parent.click() download = download_info.value except Exception as e: page.screenshot(path=str(OUT_DIR / "debug_menu.png")) print(f" ! Stažení selhalo: {e}") print(f" screenshot: {OUT_DIR / 'debug_menu.png'}") input(" Enter pro zavření... ") context.close() return target = OUT_DIR / (download.suggested_filename or "first_inbox.eml") download.save_as(str(target)) print(f" Hotovo → {target}") if not target.name.lower().endswith(".eml"): print(f" ! POZOR: {target.name} nevypadá jako EML — možná stažena příloha!") input(" Stiskni Enter pro zavření okna... ") context.close() if __name__ == "__main__": main()