143 lines
5.2 KiB
Python
143 lines
5.2 KiB
Python
"""
|
|
=======================================================================
|
|
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()
|